Skip to content

Commit

Permalink
Merge pull request #39 from AndreiDrang/contextmanager
Browse files Browse the repository at this point in the history
Add Contextmanager
  • Loading branch information
AndreiDrang authored Feb 13, 2019
2 parents cf1f2fb + f49e87d commit a7ca295
Show file tree
Hide file tree
Showing 19 changed files with 350 additions and 76 deletions.
1 change: 1 addition & 0 deletions MANIFEST.in
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
include README.md LICENSE
Binary file added dist/python-rucaptcha-2.5.3.tar.gz
Binary file not shown.
Binary file added dist/python_rucaptcha-2.5.3-py3-none-any.whl
Binary file not shown.
4 changes: 0 additions & 4 deletions examples/callback_examples/client.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
import asyncio
import time
import random
import json

import pika
import aiohttp
import requests

from python_rucaptcha import CallbackClient

Expand Down
19 changes: 19 additions & 0 deletions examples/funcaptcha_example.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,25 @@
public_key = 'DE0B0BB7-1EE4-4D70-1853-31B835D4506B'
pageurl = 'https://www.funcaptcha.com/demo'

"""
contextmanager пример
"""

# синхронный пример contextmanager
with FunCaptcha.FunCaptcha(rucaptcha_key = RUCAPTCHA_KEY) as fun_captcha:
result = fun_captcha.captcha_handler(public_key=public_key, page_url=pageurl)
print(result)

# асинхронный пример contextmanager
async def aiocontext():
with FunCaptcha.aioFunCaptcha(rucaptcha_key=RUCAPTCHA_KEY) as fun_captcha:
result = await fun_captcha.captcha_handler(public_key=public_key, page_url=pageurl)
print(result)

if __name__ == '__main__':
loop = asyncio.new_event_loop()
loop.run_until_complete(aiocontext())
loop.close()

"""
Обычный пример для решения FunCaptcha
Expand Down
35 changes: 32 additions & 3 deletions examples/image_captcha_example.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,15 +65,44 @@
params={"captcha_type": "get_common_captcha"}).json()["captcha_src"]

"""
Синхронный метод
contextmanager пример
"""

# синхронный пример contextmanager
with ImageCaptcha.ImageCaptcha(rucaptcha_key=RUCAPTCHA_KEY,
img_path = 'test_files',
img_clearing = True,
save_format='const',
debug_dump=1) as img_captcha:
result = img_captcha.captcha_handler(captcha_link=image_link)
print(result)

# асинхронный пример contextmanager
async def aiocontext():
with ImageCaptcha.aioImageCaptcha(rucaptcha_key=RUCAPTCHA_KEY,
img_path = 'test_files',
img_clearing = True,
save_format='const',
debug_dump=1) as img_captcha:
result = await img_captcha.captcha_handler(captcha_link=image_link)
print(result)

if __name__ == '__main__':
loop = asyncio.new_event_loop()
loop.run_until_complete(aiocontext())
loop.close()

raise ValueError
"""
Синхронный метод
Тут нужно воспользоваться бибилотекой, отослать на решение ссылку на капчу и получить ответ
далее его записать в user_answer
Первый пример демонстрирует сохранеие файла изображения как обычного файла в папу
"""
user_answer_const = ImageCaptcha.ImageCaptcha(rucaptcha_key=RUCAPTCHA_KEY, img_path = 'test_filels', img_clearing = False,

user_answer_const = ImageCaptcha.ImageCaptcha(rucaptcha_key=RUCAPTCHA_KEY, img_path = 'test_files', img_clearing = False,
save_format='const').captcha_handler(captcha_link=image_link)
print(user_answer_const)
"""
Expand Down Expand Up @@ -299,4 +328,4 @@ async def run():
# подключаемся к серверу и ждём решения капчи из RabbitMQ queue
callback_server_response = CallbackClient.CallbackClient(task_id=task_creation_answer.get('id'), queue_name=queue_name, call_type='queue').captcha_handler()

print(callback_server_response)
print(callback_server_response)
58 changes: 43 additions & 15 deletions examples/key_captcha_example.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,36 @@
В общем случаи запрос на решение капчи-пазла выглядит следующим способом
!!!Все параметры являются обязательными!!!
"""
RUCAPTCHA_KEY = ''
RUCAPTCHA_KEY = '2597d7cb1f9435a3b531ac283ce987d5'


"""
contextmanager пример
"""

# синхронный пример contextmanager
with KeyCaptcha.KeyCaptcha(rucaptcha_key = RUCAPTCHA_KEY) as key_captcha:
result = key_captcha.captcha_handler(s_s_c_user_id=15,
s_s_c_session_id='8f460599bebe02cb0dd096b1fe70b089',
s_s_c_web_server_sign='edd2c221c05aece19f6db93a36b42272',
s_s_c_web_server_sign2='15989edaad1b4dc056ec8fa05abc7c9a',
pageurl='https://www.keycaptcha.com/signup/')
print(result)

# асинхронный пример contextmanager
async def aiocontext():
with KeyCaptcha.aioKeyCaptcha(rucaptcha_key=RUCAPTCHA_KEY) as key_captcha:
result = await key_captcha.captcha_handler(s_s_c_user_id=15,
s_s_c_session_id='8f460599bebe02cb0dd096b1fe70b089',
s_s_c_web_server_sign='edd2c221c05aece19f6db93a36b42272',
s_s_c_web_server_sign2='15989edaad1b4dc056ec8fa05abc7c9a',
pageurl='https://www.keycaptcha.com/signup/')
print(result)

if __name__ == '__main__':
loop = asyncio.new_event_loop()
loop.run_until_complete(aiocontext())
loop.close()

answer = KeyCaptcha.KeyCaptcha(rucaptcha_key=RUCAPTCHA_KEY) \
.captcha_handler(s_s_c_user_id=15,
Expand All @@ -35,28 +64,27 @@
'''
answer - это JSON строка с соответствующими полями
user_answer_... - это JSON строка с соответствующими полями
captchaSolve - решение капчи,
taskId - находится Id задачи на решение капчи,
errorId - 0 - если всё хорошо, 1 - если есть ошибка,
errorBody - тело ошибки, если есть.
{
"captchaSolve": string,
"taskId": int,
"errorId": int, 1 or 0,
"errorBody": string,
}
taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем,
error - False - если всё хорошо, True - если есть ошибка,
errorBody - полная информация об ошибке:
{
text - Развернётое пояснение ошибки
id - уникальный номер ошибка в ЭТОЙ бибилотеке
}
'''

# капча решена верно, ошибка = 0
if answer['errorId'] == 0:
if answer['error'] == 0:
# решение капчи
print(answer['captchaSolve'])
print(answer['taskId'])
# во время решения капчи возникли ошибки, ошибка = 1
elif answer['errorId'] == 1:
# Тело ошибки, если есть
print(answer['errorBody'])

elif answer['error'] == 1:
# Тело ошибки, если есть
print(answer['errorBody']['text'])
print(answer['errorBody']['id'])

"""
Пример асинхронного кода
Expand Down
5 changes: 2 additions & 3 deletions examples/text_captcha_example.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,8 @@

"""
Этот пример показывает то как нужно работать с модулем для решения текстовых капч
"""
'''
UPDATE 2.4
Добавление возможности применять callback при получении ответа капчи
Для этого в класс нужно передать параметр `pingback` со значением URL'a для ожидания ответа, к примеру - 85.255.8.26/text_captcha
Expand All @@ -25,7 +24,7 @@
text - Развернётое пояснение ошибки
id - уникальный номер ошибка в ЭТОЙ бибилотеке
}
'''
"""
# Введите ключ от рукапчи из своего аккаунта
RUCAPTCHA_KEY = 'ba86e77f9007a106c2eb2d7436e74440'
# Пример вопроса для решения
Expand Down
2 changes: 1 addition & 1 deletion python_rucaptcha/CallbackClient.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ def __handle_queue_message(self, requests_timeout: int):

while attempts>0:
# получение сообщения из очереди
method_frame, header_frame, body = channel.basic_get(self.queue_name)
method_frame, _, body = channel.basic_get(self.queue_name)
if body:
# декодируем сообщение из bytes в JSON
json_body = json.loads(body.decode())
Expand Down
20 changes: 18 additions & 2 deletions python_rucaptcha/FunCaptcha.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,14 @@ def __init__(self, rucaptcha_key: str, service_type: str='2captcha', sleep_time:
self.session.mount('http://', HTTPAdapter(max_retries = 5))
self.session.mount('https://', HTTPAdapter(max_retries = 5))

def __enter__(self):
return self

def __exit__(self, exc_type, exc_value, traceback):
if exc_type:
return False
return True

@api_key_check
@service_check
def captcha_handler(self, public_key: str, page_url: str):
Expand All @@ -79,7 +87,7 @@ def captcha_handler(self, public_key: str, page_url: str):
captcha_id = self.session.post(self.url_request, data=self.post_payload).json()

# если вернулся ответ с ошибкой то записываем её и возвращаем результат
if captcha_id['status'] is 0:
if captcha_id['status'] == 0:
self.result.update({'error': True,
'errorBody': RuCaptchaError().errors(captcha_id['request'])
}
Expand Down Expand Up @@ -143,6 +151,14 @@ def __init__(self, rucaptcha_key: str, service_type: str='2captcha', sleep_time:
'json': 1,
}

def __enter__(self):
return self

def __exit__(self, exc_type, exc_value, traceback):
if exc_type:
return False
return True

@api_key_check
@service_check
async def captcha_handler(self, public_key: str, page_url: str):
Expand Down Expand Up @@ -170,7 +186,7 @@ async def captcha_handler(self, public_key: str, page_url: str):
captcha_id = await resp.json()

# если вернулся ответ с ошибкой то записываем её и возвращаем результат
if captcha_id['status'] is 0:
if captcha_id['status'] == 0:
self.result.update({'error': True,
'errorBody': RuCaptchaError().errors(captcha_id['request'])
}
Expand Down
Loading

0 comments on commit a7ca295

Please sign in to comment.