diff --git a/Makefile b/Makefile index 5bf5fa83..f158c7a7 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ remove: refactor: pip install black isort - black python_rucaptcha/ + black python_rucaptcha/ examples/ isort -rc python_rucaptcha/ upload: diff --git a/README.md b/README.md index 2a5a28ef..e37cab67 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,26 @@ python setup.py install **v.2.6.3** - Добавление `Distil` метода. С синхронным и асинхронным исполнением. **v.2.6.4** - Добавление `HCaptcha` метода. С синхронным и асинхронным исполнением. + +**v.2.6.5** - Добавление `CapyPuzzle` метода. С синхронным и асинхронным исполнением. + +**v.3.0** - Удаление кастомных ошибиок и вывода текста о них. +1. Замена структуры: + ```json + { + "errorBody": + { + "text": "some text", + "id": 1 + } + } + ``` +1. На структуру: + ```json + { + "errorBody": "ERROR_NAME" + } + ``` *** ### Будущие обновления v.3.0 - ... @@ -100,21 +120,21 @@ print(callback_queue_response) #### Если вы хотите запустить данный callback сервер у себя: -Небольшая [инструкция-памятка](https://github.com/AndreiDrang/python-rucaptcha/blob/master/examples/callback_examples/readme.txt) по шагам. +Небольшая [инструкция-памятка](./examples/callback_examples/readme.txt) по шагам. Установить и запустить веб-приложение, которое будет принимать POST-запросы, парсить их, и совершать прочую, нужную вам, магию. -[Пример такого сервера, написанный на aiohttp](https://github.com/AndreiDrang/python-rucaptcha/blob/master/examples/callback_examples/callback_server.py). +[Пример такого сервера, написанный на aiohttp](./examples/callback_examples/callback_server.py). -Все тесты можно проводить на локальном сервере, эмулируя POST-запросы от RuCaptcha при помощи [локального клиента](https://github.com/AndreiDrang/python-rucaptcha/blob/master/examples/callback_examples/rucaptcha_server.py). +Все тесты можно проводить на локальном сервере, эмулируя POST-запросы от RuCaptcha при помощи [локального клиента](./examples/callback_examples/rucaptcha_server.py). -Примеры создания реальных заданий для callback(pingback) способа вы можете посмотреть в [папке с примерами](https://github.com/AndreiDrang/python-rucaptcha/tree/master/examples), для конкретного метода капчи. +Примеры создания реальных заданий для callback(pingback) способа вы можете посмотреть в [папке с примерами](./examples), для конкретного метода капчи. *** #### Работа обычным методом - ожидание решения капчи периодическим опросом сервера. -1.[Решение капчи-изображения(большие и маленькие).](https://github.com/AndreiDrang/python-rucaptcha/blob/master/python_rucaptcha/ImageCaptcha.py) +1.[Решение капчи-изображения(большие и маленькие).](./python_rucaptcha/ImageCaptcha.py) ```python from python_rucaptcha import ImageCaptcha @@ -131,11 +151,11 @@ if not user_answer['error']: print(user_answer['taskId']) elif user_answer['error']: # Тело ошибки, если есть - print(user_answer['errorBody']['text']) - print(user_answer['errorBody']['id']) + print(user_answer ['errorBody']) + print(user_answer ['errorBody']) ``` -2.[Решение KeyCaptcha(пазл-капча).](https://github.com/AndreiDrang/python-rucaptcha/blob/master/python_rucaptcha/KeyCaptcha.py) +2.[Решение KeyCaptcha(пазл-капча).](./python_rucaptcha/KeyCaptcha.py) ```python from python_rucaptcha import KeyCaptcha @@ -163,7 +183,7 @@ elif answer['error']: print(answer['errorBody']) ``` -3.[Решение ReCaptcha v2.](https://github.com/AndreiDrang/python-rucaptcha/blob/master/python_rucaptcha/ReCaptchaV2.py) +3.[Решение ReCaptcha v2.](./python_rucaptcha/ReCaptchaV2.py) ```python from python_rucaptcha import ReCaptchaV2 @@ -183,11 +203,11 @@ if not user_answer['error']: print(user_answer['taskId']) elif user_answer['error']: # Тело ошибки, если есть - print(user_answer['errorBody']['text']) - print(user_answer['errorBody']['id']) + print(user_answer ['errorBody']) + print(user_answer ['errorBody']) ``` -4.[Решение новой ReCaptcha v3.](https://github.com/AndreiDrang/python-rucaptcha/blob/master/python_rucaptcha/ReCaptchaV3.py) +4.[Решение ReCaptcha v3.](./python_rucaptcha/ReCaptchaV3.py) ```python from python_rucaptcha import ReCaptchaV3 @@ -202,10 +222,13 @@ ACTION = 'verify' # Требуемое значение рейтинга (score) работника, от 0.1(робот) до 0.9(человечный человек) MIN_SCORE = 0.4 # Возвращается JSON содержащий информацию для решения капчи -user_answer = ReCaptchaV3.ReCaptchaV3(rucaptcha_key=RUCAPTCHA_KEY, - action = ACTION, - min_score = MIN_SCORE).captcha_handler(site_key=SITE_KEY, - page_url=PAGE_URL) +user_answer = ReCaptchaV3.ReCaptchaV3( + rucaptcha_key=RUCAPTCHA_KEY, + action = ACTION, + min_score = MIN_SCORE).captcha_handler( + site_key=SITE_KEY, + page_url=PAGE_URL + ) if not user_answer['error']: # решение капчи @@ -215,13 +238,13 @@ if not user_answer['error']: print(user_answer['user_score']) elif user_answer['error']: # Тело ошибки, если есть - print(user_answer['errorBody']['text']) - print(user_answer['errorBody']['id']) + print(user_answer ['errorBody']) + print(user_answer ['errorBody']) ``` -5.[Решение RotateCaptcha(повернуть изображение).](https://github.com/AndreiDrang/python-rucaptcha/blob/master/python_rucaptcha/RotateCaptcha.py) +5.[Решение RotateCaptcha(повернуть изображение).](./python_rucaptcha/RotateCaptcha.py) -6.[Решение текстовой капчи.](https://github.com/AndreiDrang/python-rucaptcha/blob/master/python_rucaptcha/TextCaptcha.py) +6.[Решение текстовой капчи.](./python_rucaptcha/TextCaptcha.py) ```python from python_rucaptcha import TextCaptcha @@ -238,11 +261,11 @@ if not user_answer['error']: print(user_answer['taskId']) elif user_answer['error']: # Тело ошибки, если есть - print(user_answer['errorBody']['text']) - print(user_answer['errorBody']['id']) + print(user_answer ['errorBody']) + print(user_answer ['errorBody']) ``` -7.[Решение FunCaptcha.](https://github.com/AndreiDrang/python-rucaptcha/blob/master/python_rucaptcha/FunCaptcha.py) +7.[Решение FunCaptcha.](./python_rucaptcha/FunCaptcha.py) ```python from python_rucaptcha import FunCaptcha @@ -265,16 +288,13 @@ if not answer['error']: print(answer['taskId']) elif answer['error']: # Тело ошибки, если есть - print(answer['errorBody']['text']) - print(answer['errorBody']['id']) + print(answer ['errorBody']) ``` -8.[Модуль для получения инофрмации о балансе аккаунта и отправке жалоб.](https://github.com/AndreiDrang/python-rucaptcha/blob/master/python_rucaptcha/RuCaptchaControl.py) - -9.[Решение DistilCaptcha.](https://github.com/AndreiDrang/python-rucaptcha/blob/master/python_rucaptcha/DistilCaptcha.py) +8.[Модуль для получения инофрмации о балансе аккаунта и отправке жалоб.](./python_rucaptcha/RuCaptchaControl.py) ```python -from python_rucaptcha.DistilCaptcha import DistilCaptcha +from python_rucaptcha.RuCaptchaControl import RuCaptchaControl # Введите ключ от рукапчи из своего аккаунта RUCAPTCHA_KEY = '' @@ -282,8 +302,43 @@ JsSha1 = "af2d0557c23ff2d8f40ccf4bec57e480704634e9" JsUri = "http://www.targetwebsite.com/pvvhnzyazwpzgkhv.js" JsData = "IWZ1bmN0fewfwefwefwef9905j0g4905jh9046hj3cpCg==" -answer = DistilCaptcha(rucaptcha_key=RUCAPTCHA_KEY).captcha_handler( - JsSha1=JsSha1, JsUri=JsUri, JsData=JsData +answer = RuCaptchaControl(rucaptcha_key=RUCAPTCHA_KEY).additional_methods( + action="getbalance" + ) + +if not answer["error"]: + print("Your balance is: ", answer["serverAnswer"], " rub.") + +elif answer["error"]: + # Тело ошибки, если есть + print(answer["errorBody"]) + +# Пример отправки жалобы на неправильно решённую капчу под ID "666" +wrong_captcha_id = 666 + +answer = RuCaptchaControl(rucaptcha_key=RUCAPTCHA_KEY).additional_methods( + action="reportbad", id=wrong_captcha_id + ) + +# Если заявка принята +if not answer["error"]: + print("Заявка принята.") + +# Если возникла ошибка +elif answer["error"]: + print(answer["errorBody"]) +``` +9.[Решение HCaptcha.](./python_rucaptcha/HCaptcha.py) + +```python +from python_rucaptcha.HCaptcha import HCaptcha +RUCAPTCHA_KEY = '' + +website_link = "https://secure2.e-konsulat.gov.pl/Uslugi/RejestracjaTerminu.aspx?IDUSLUGI=1&IDPlacowki=94" +data_sitekey = "39fccce0-e3e3-4f9d-a942-ea415c102beb" + +answer = HCaptcha(rucaptcha_key=RUCAPTCHA_KEY).captcha_handler( + site_key=data_sitekey, page_url=website_link ) if not answer['error']: @@ -292,22 +347,21 @@ if not answer['error']: print(answer['taskId']) elif answer['error']: # Тело ошибки, если есть - print(answer['errorBody']['text']) - print(answer['errorBody']['id']) + print(answer ['errorBody']) ``` -10.[Решение HCaptcha.](https://github.com/AndreiDrang/python-rucaptcha/blob/master/python_rucaptcha/HCaptcha.py) +10.[Решение CapyPuzzle.](./python_rucaptcha/CapyPuzzle.py) ```python -from python_rucaptcha.HCaptcha import HCaptcha +from python_rucaptcha.CapyPuzzle import CapyPuzzle RUCAPTCHA_KEY = '' -website_link = "https://secure2.e-konsulat.gov.pl/Uslugi/RejestracjaTerminu.aspx?IDUSLUGI=1&IDPlacowki=94" -data_sitekey = "39fccce0-e3e3-4f9d-a942-ea415c102beb" +captchakey="PUZZLE_Cme4hZLjuZRMYC3uh14C52D3uNms5w" +page_url="https://www.capy.me/account/register/" -answer = HCaptcha(rucaptcha_key=RUCAPTCHA_KEY).captcha_handler( - site_key=data_sitekey, page_url=website_link -) +answer = CapyPuzzle(rucaptcha_key=RUCAPTCHA_KEY).captcha_handler( + captchakey=captchakey, page_url=page_url + ) if not answer['error']: # решение капчи @@ -315,50 +369,14 @@ if not answer['error']: print(answer['taskId']) elif answer['error']: # Тело ошибки, если есть - print(answer['errorBody']['text']) - print(answer['errorBody']['id']) + print(answer ['errorBody']) ``` *** Кроме того, для тестирования различных типов капчи предоставляется [специальный сайт](http://85.255.8.26/), на котором собраны все имеющиеся типы капчи, с удобной системой тестирования ваших скриптов. *** -### Errors table -| Error ID | Ошибка -| ------------- |:-------------:| -| -1 | Внутренняя ошибка (в соединении и т.п.), не относится к сервису RuCaptcha - -| Error ID | in.php Rucaptcha код ошибки -| ------------- |:-------------:| -| 10 | ERROR_WRONG_USER_KEY -| 11 | ERROR_KEY_DOES_NOT_EXIST -| 12 | ERROR_ZERO_BALANCE -| 13 | ERROR_PAGEURL -| 14 | ERROR_NO_SLOT_AVAILABLE -| 15 | ERROR_ZERO_CAPTCHA_FILESIZE -| 16 | ERROR_TOO_BIG_CAPTCHA_FILESIZE -| 17 | ERROR_WRONG_FILE_EXTENSION -| 18 | ERROR_IMAGE_TYPE_NOT_SUPPORTED -| 19 | ERROR_UPLOAD -| 20 | ERROR_IP_NOT_ALLOWED -| 21 | IP_BANNED -| 22 | ERROR_BAD_TOKEN_OR_PAGEURL -| 23 | ERROR_GOOGLEKEY -| 24 | ERROR_CAPTCHAIMAGE_BLOCKED -| 25 | MAX_USER_TURN - -| Error ID | res.php Rucaptcha код ошибки -| ------------- |:-------------:| -| 30 | CAPCHA_NOT_READY -| 31 | ERROR_CAPTCHA_UNSOLVABLE -| 32 | ERROR_WRONG_ID_FORMAT -| 33 | ERROR_WRONG_CAPTCHA_ID -| 34 | ERROR_BAD_DUPLICATES -| 35 | REPORT_NOT_RECORDED - -| Error ID | NNNN Rucaptcha код ошибки -| ------------- |:-------------:| -| 40 | ERROR: 1001 -| 41 | ERROR: 1002 -| 42 | ERROR: 1003 -| 43 | ERROR: 1004 -| 44 | ERROR: 1005 +### Errors description. Описания ошибок +**В обоих ссылках находятся валидные описания ошибок** +1. https://rucaptcha.com/api-rucaptcha#in_errors +1. https://rucaptcha.docs.apiary.io/#reference/2 + diff --git a/examples/capy_captcha_example.py b/examples/capy_captcha_example.py new file mode 100644 index 00000000..ebdfd786 --- /dev/null +++ b/examples/capy_captcha_example.py @@ -0,0 +1,44 @@ +import asyncio +from python_rucaptcha.CapyPuzzle import CapyPuzzle, aioCapyPuzzle + +""" +Синхронный пример решения капчи +""" +capy = CapyPuzzle(rucaptcha_key="2bfbe92f00f1498e90e1460550b1ad94") +result = capy.captcha_handler( + captchakey="PUZZLE_Cme4hZLjuZRMYC3uh14C52D3uNms5w", + page_url="https://www.capy.me/account/register/", +) + +if not result["error"]: + # решение капчи + print(result["captchaSolve"]) + print(result["taskId"]) +elif result["error"]: + # Тело ошибки, если есть + print(result["errorBody"]) + + +async def run(): + try: + result = await aioCapyPuzzle( + rucaptcha_key="2bfbe92f00f1498e90e1460550b1ad94" + ).captcha_handler( + captchakey="PUZZLE_Cme4hZLjuZRMYC3uh14C52D3uNms5w", + page_url="https://www.capy.me/account/register/", + ) + if not result["error"]: + # решение капчи + print(result["captchaSolve"]) + print(result["taskId"]) + elif result["error"]: + # Тело ошибки, если есть + print(result["errorBody"]) + except Exception as err: + print(err) + + +if __name__ == "__main__": + loop = asyncio.new_event_loop() + loop.run_until_complete(run()) + loop.close() diff --git a/examples/distilcaptcha_example.py b/examples/distilcaptcha_example.py deleted file mode 100644 index 3aee79af..00000000 --- a/examples/distilcaptcha_example.py +++ /dev/null @@ -1,43 +0,0 @@ -import asyncio - -from python_rucaptcha.DistilCaptcha import DistilCaptcha, aioDistilCaptcha - -""" -Документация на РуКапче - https://rucaptcha.com/distil-api-ru -""" - -# Введите ключ от рукапчи из своего аккаунта -RUCAPTCHA_KEY = "aafb515dff0075f94b1f3328615bc0bd" -""" -JsSha1 - контрольная сумма SHA1 для javascript библиотеки -JsUri - URL javascript библиотеки -JsData - данные библиотеки, закодированные в base64 -""" -JsSha1 = "af2d0557c23ff2d8f40ccf4bec57e480704634e9" -JsUri = "http://www.targetwebsite.com/pvvhnzyazwpzgkhv.js" -JsData = "IWZ1bmN0fewfwefwefwef9905j0g4905jh9046hj3cpCg==" - -""" -contextmanager пример -""" - -result = DistilCaptcha(rucaptcha_key=RUCAPTCHA_KEY).captcha_handler( - JsSha1=JsSha1, JsUri=JsUri, JsData=JsData -) -print(result) - -# синхронный пример contextmanager -with DistilCaptcha(rucaptcha_key=RUCAPTCHA_KEY) as dist_captcha: - result = dist_captcha.captcha_handler(JsSha1=JsSha1, JsUri=JsUri, JsData=JsData) - print(result) - -# асинхронный пример contextmanager -async def aiocontext(): - with aioDistilCaptcha(rucaptcha_key=RUCAPTCHA_KEY) as ob: - result = await ob.captcha_handler(JsSha1=JsSha1, JsUri=JsUri, JsData=JsData) - print(result) - - -loop = asyncio.get_event_loop() -loop.run_until_complete(aiocontext()) -loop.close() diff --git a/examples/funcaptcha_example.py b/examples/funcaptcha_example.py index c8db956c..2ae6a5c8 100644 --- a/examples/funcaptcha_example.py +++ b/examples/funcaptcha_example.py @@ -86,8 +86,7 @@ async def aiocontext(): print(answer["taskId"]) elif answer["error"]: # Тело ошибки, если есть - print(answer["errorBody"]["text"]) - print(answer["errorBody"]["id"]) + print(answer["errorBody"]) """ @@ -106,8 +105,7 @@ async def run(): print(answer["taskId"]) elif answer["error"]: # Тело ошибки, если есть - print(answer["errorBody"]["text"]) - print(answer["errorBody"]["id"]) + print(answer["errorBody"]) except Exception as err: print(err) diff --git a/examples/image_captcha_example.py b/examples/image_captcha_example.py index a75f33af..2b5fe683 100644 --- a/examples/image_captcha_example.py +++ b/examples/image_captcha_example.py @@ -3,7 +3,7 @@ import base64 from python_rucaptcha import ImageCaptcha, CallbackClient, RuCaptchaControl -from python_rucaptcha import errors + """ UPDATE 2.4 @@ -152,8 +152,7 @@ async def aiocontext(): print(user_answer_const["taskId"]) elif user_answer_const["error"]: # Тело ошибки, если есть - print(user_answer_const["errorBody"]["text"]) - print(user_answer_const["errorBody"]["id"]) + print(user_answer_const["errorBody"]) if not user_answer_temp["error"]: # решение капчи @@ -161,8 +160,7 @@ async def aiocontext(): print(user_answer_temp["taskId"]) elif user_answer_temp["error"]: # Тело ошибки, если есть - print(user_answer_temp["errorBody"]["text"]) - print(user_answer_temp["errorBody"]["id"]) + print(user_answer_temp["errorBody"]) if not user_answer_base64["error"]: # решение капчи @@ -170,8 +168,7 @@ async def aiocontext(): print(user_answer_base64["taskId"]) elif user_answer_base64["error"]: # Тело ошибки, если есть - print(user_answer_base64["errorBody"]["text"]) - print(user_answer_base64["errorBody"]["id"]) + print(user_answer_base64["errorBody"]) """ Так же класс в качестве параметра может принимать список необязательных переменных, таких как: @@ -207,8 +204,8 @@ async def aiocontext(): print(user_answer_full["taskId"]) elif user_answer_full["error"]: # Тело ошибки, если есть - print(user_answer_full["errorBody"]["text"]) - print(user_answer_full["errorBody"]["id"]) + print(user_answer_full["errorBody"]) + print(user_answer_full["errorBody"]) """ Пример для работы с локальными файлами @@ -229,8 +226,8 @@ async def aiocontext(): print(user_answer_local["taskId"]) elif user_answer_local["error"]: # Тело ошибки, если есть - print(user_answer_local["errorBody"]["text"]) - print(user_answer_local["errorBody"]["id"]) + print(user_answer_local["errorBody"]) + print(user_answer_local["errorBody"]) # отлов ошибки при проблемах чтения файла-изображения except errors.ReadError as err: @@ -258,8 +255,8 @@ async def run(): print(answer_aio_image["taskId"]) elif answer_aio_image["error"]: # Тело ошибки, если есть - print(answer_aio_image["errorBody"]["text"]) - print(answer_aio_image["errorBody"]["id"]) + print(answer_aio_image["errorBody"]) + print(answer_aio_image["errorBody"]) except Exception as err: print(err) @@ -282,8 +279,8 @@ async def run(): print(answer_aio_local_image["taskId"]) elif answer_aio_local_image["error"]: # Тело ошибки, если есть - print(answer_aio_local_image["errorBody"]["text"]) - print(answer_aio_local_image["errorBody"]["id"]) + print(answer_aio_local_image["errorBody"]) + print(answer_aio_local_image["errorBody"]) except Exception as err: print(err) """ @@ -300,8 +297,8 @@ async def run(): print(answer_aio_image["taskId"]) elif answer_aio_image["error"]: # Тело ошибки, если есть - print(answer_aio_image["errorBody"]["text"]) - print(answer_aio_image["errorBody"]["id"]) + print(answer_aio_image["errorBody"]) + print(answer_aio_image["errorBody"]) except Exception as err: print(err) diff --git a/examples/key_captcha_example.py b/examples/key_captcha_example.py index a86f3a78..7da39d88 100644 --- a/examples/key_captcha_example.py +++ b/examples/key_captcha_example.py @@ -95,8 +95,7 @@ async def aiocontext(): # во время решения капчи возникли ошибки, ошибка = 1 elif answer["error"] == 1: # Тело ошибки, если есть - print(answer["errorBody"]["text"]) - print(answer["errorBody"]["id"]) + print(answer["errorBody"]) """ Пример асинхронного кода @@ -121,8 +120,7 @@ async def run(): print(answer["taskId"]) elif answer["error"]: # Тело ошибки, если есть - print(answer["errorBody"]["text"]) - print(answer["errorBody"]["id"]) + print(answer["errorBody"]) except Exception as err: print(f"ERRRRORORO - {err}") diff --git a/examples/recaptcha_v2_example.py b/examples/recaptcha_v2_example.py index ae033f2a..c5591e37 100644 --- a/examples/recaptcha_v2_example.py +++ b/examples/recaptcha_v2_example.py @@ -71,8 +71,7 @@ print(answer_usual_re2["taskId"]) elif answer_usual_re2["error"]: # Тело ошибки, если есть - print(answer_usual_re2["errorBody"]["text"]) - print(answer_usual_re2["errorBody"]["id"]) + print(answer_usual_re2["errorBody"]) # invisible recaptcha v2 if not answer_invisible["error"]: @@ -81,8 +80,7 @@ print(answer_invisible["taskId"]) elif answer_invisible["error"]: # Тело ошибки, если есть - print(answer_invisible["errorBody"]["text"]) - print(answer_invisible["errorBody"]["id"]) + print(answer_invisible["errorBody"]) """ @@ -102,8 +100,8 @@ async def run(): print(answer_aio_re2["taskId"]) elif answer_aio_re2["error"]: # Тело ошибки, если есть - print(answer_aio_re2["errorBody"]["text"]) - print(answer_aio_re2["errorBody"]["id"]) + print(answer_aio_re2["errorBody"]) + print(answer_aio_re2["errorBody"]) except Exception as err: print(err) diff --git a/examples/recaptcha_v3_example.py b/examples/recaptcha_v3_example.py index 03f03553..b18ab419 100644 --- a/examples/recaptcha_v3_example.py +++ b/examples/recaptcha_v3_example.py @@ -56,8 +56,7 @@ print(answer_usual_re3["user_score"]) elif answer_usual_re3["error"]: # Тело ошибки, если есть - print(answer_usual_re3["errorBody"]["text"]) - print(answer_usual_re3["errorBody"]["id"]) + print(answer_usual_re3["errorBody"]) # обычная recaptcha v3 if not answer_usual_re3_f["error"]: @@ -68,8 +67,7 @@ print(answer_usual_re3["user_score"]) elif answer_usual_re3_f["error"]: # Тело ошибки, если есть - print(answer_usual_re3_f["errorBody"]["text"]) - print(answer_usual_re3_f["errorBody"]["id"]) + print(answer_usual_re3_f["errorBody"]) """ Пример асинхронной работы @@ -92,8 +90,7 @@ async def run(): print(answer_aio_re3["user_score"]) elif answer_aio_re3["error"]: # Тело ошибки, если есть - print(answer_aio_re3["errorBody"]["text"]) - print(answer_aio_re3["errorBody"]["id"]) + print(answer_aio_re3["errorBody"]) except Exception as err: print(err) diff --git a/examples/rucaptcha_control_example.py b/examples/rucaptcha_control_example.py index 73935d89..91fbe6b3 100644 --- a/examples/rucaptcha_control_example.py +++ b/examples/rucaptcha_control_example.py @@ -1,6 +1,6 @@ import asyncio -from python_rucaptcha import RuCaptchaControl, ImageCaptcha +from python_rucaptcha import RuCaptchaControl """ Этот пример показывает работу модуля управления аккаунтом RuCaptcha. diff --git a/examples/text_captcha_example.py b/examples/text_captcha_example.py index e965adaf..b71e23ce 100644 --- a/examples/text_captcha_example.py +++ b/examples/text_captcha_example.py @@ -43,8 +43,7 @@ print(user_answer["taskId"]) elif user_answer["error"] == 1: # Тело ошибки, если есть - print(user_answer["errorBody"]["text"]) - print(user_answer["errorBody"]["id"]) + print(user_answer["errorBody"]) """ Так же класс в качестве параметра может принимать список необязательных переменных, таких как: @@ -66,8 +65,7 @@ print(user_answer_full["taskId"]) elif user_answer_full["error"] == 1: # Тело ошибки, если есть - print(user_answer_full["errorBody"]["text"]) - print(user_answer_full["errorBody"]["id"]) + print(user_answer_full["errorBody"]) """ diff --git a/python_rucaptcha/CapyPuzzle.py b/python_rucaptcha/CapyPuzzle.py index 58c7f22b..47243264 100644 --- a/python_rucaptcha/CapyPuzzle.py +++ b/python_rucaptcha/CapyPuzzle.py @@ -3,8 +3,8 @@ import aiohttp import requests + from python_rucaptcha.config import app_key -from python_rucaptcha.errors import RuCaptchaError from python_rucaptcha.decorators import api_key_check, service_check from python_rucaptcha.result_handler import get_sync_result, get_async_result @@ -76,11 +76,7 @@ def captcha_handler(self, captchakey: str, page_url: str, **kwargs): captchaSolve - решение капчи, taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, - errorBody - полная информация об ошибке: - { - text - Развернётое пояснение ошибки - id - уникальный номер ошибка в ЭТОЙ бибилотеке - } + errorBody - название ошибки """ # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия @@ -95,9 +91,7 @@ def captcha_handler(self, captchakey: str, page_url: str, **kwargs): # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id["status"] == 0: - self.result.update( - {"error": True, "errorBody": RuCaptchaError().errors(captcha_id["request"])} - ) + self.result.update({"error": True, "errorBody": captcha_id["request"]}) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: @@ -122,12 +116,10 @@ def captcha_handler(self, captchakey: str, page_url: str, **kwargs): ) -# асинхронный метод для решения РеКапчи 2 -class aioReCaptchaV2: +class aioCapyPuzzle: """ - Класс служит для асинхронной работы с новой ReCaptcha от Гугла и Invisible ReCaptcha. - Для работы потребуется передать ключ от РуКапчи, затем ключ сайта(подробности его получения в описании на сайте) - И так же ссылку на сайт. + Класс служит для работы с CapyPuzzle. + Capy - это капча в виде пазла """ def __init__( @@ -143,7 +135,7 @@ def __init__( :param rucaptcha_key: АПИ ключ капчи из кабинета пользователя :param service_type: URL с которым будет работать программа, возможен вариант "2captcha"(стандартный) и "rucaptcha" - :param sleep_time: Время ожидания решения капчи + :param sleep_time: Вермя ожидания решения капчи :param pingback: Параметр для ссылки с на которой будет ожидание callback ответа от RuCaptcha :param kwargs: Для передачи дополнительных параметров """ @@ -151,11 +143,10 @@ def __init__( self.sleep_time = sleep_time # тип URL на с которым будет работать библиотека self.service_type = service_type - # пайлоад POST запроса на отправку капчи на сервер self.post_payload = { "key": rucaptcha_key, - "method": "userrecaptcha", + "method": "capy", "json": 1, "soft_id": app_key, } @@ -188,11 +179,7 @@ async def captcha_handler(self, captchakey: str, page_url: str, **kwargs): captchaSolve - решение капчи, taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, - errorBody - полная информация об ошибке: - { - text - Развернётое пояснение ошибки - id - уникальный номер ошибка в ЭТОЙ бибилотеке - } + errorBody - название ошибки """ # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия @@ -209,9 +196,7 @@ async def captcha_handler(self, captchakey: str, page_url: str, **kwargs): # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id["status"] == 0: - self.result.update( - {"error": True, "errorBody": RuCaptchaError().errors(captcha_id["request"])} - ) + self.result.update({"error": True, "errorBody": captcha_id["request"]}) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: diff --git a/python_rucaptcha/DistilCaptcha.py b/python_rucaptcha/DistilCaptcha.py index d0269a8a..d153df62 100644 --- a/python_rucaptcha/DistilCaptcha.py +++ b/python_rucaptcha/DistilCaptcha.py @@ -3,8 +3,8 @@ import aiohttp import requests + from python_rucaptcha.config import app_key -from python_rucaptcha.errors import RuCaptchaError from python_rucaptcha.decorators import api_key_check, service_check from python_rucaptcha.result_handler import get_sync_result, get_async_result @@ -68,11 +68,7 @@ def captcha_handler(self, JsSha1: str, JsUri: str, JsData: str, **kwargs) -> dic captchaSolve - решение капчи, taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем, error - False - всё хорошо, True - есть ошибка, - errorBody - полная информация об ошибке: - { - text - Развернётое пояснение ошибки - id - уникальный номер ошибка в ЭТОЙ бибилотеке - } + errorBody - название ошибки """ # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия @@ -88,9 +84,7 @@ def captcha_handler(self, JsSha1: str, JsUri: str, JsData: str, **kwargs) -> dic # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id["status"] == 0: - self.result.update( - {"error": True, "errorBody": RuCaptchaError().errors(captcha_id["request"])} - ) + self.result.update({"error": True, "errorBody": captcha_id["request"]}) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: @@ -174,11 +168,7 @@ async def captcha_handler(self, JsSha1: str, JsUri: str, JsData: str, **kwargs) captchaSolve - решение капчи, taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, - errorBody - полная информация об ошибке: - { - text - Развернётое пояснение ошибки - id - уникальный номер ошибка в ЭТОЙ бибилотеке - } + errorBody - название ошибки """ # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия @@ -196,9 +186,7 @@ async def captcha_handler(self, JsSha1: str, JsUri: str, JsData: str, **kwargs) # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id["status"] == 0: - self.result.update( - {"error": True, "errorBody": RuCaptchaError().errors(captcha_id["request"])} - ) + self.result.update({"error": True, "errorBody": captcha_id["request"]}) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: diff --git a/python_rucaptcha/FunCaptcha.py b/python_rucaptcha/FunCaptcha.py index 51358698..11dd8204 100644 --- a/python_rucaptcha/FunCaptcha.py +++ b/python_rucaptcha/FunCaptcha.py @@ -3,8 +3,8 @@ import aiohttp import requests + from python_rucaptcha.config import app_key -from python_rucaptcha.errors import RuCaptchaError from python_rucaptcha.decorators import api_key_check, service_check from python_rucaptcha.result_handler import get_sync_result, get_async_result @@ -68,11 +68,7 @@ def captcha_handler(self, public_key: str, page_url: str, **kwargs): captchaSolve - решение капчи, taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, - errorBody - полная информация об ошибке: - { - text - Развернётое пояснение ошибки - id - уникальный номер ошибка в ЭТОЙ бибилотеке - } + errorBody - название ошибки """ # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия @@ -88,9 +84,7 @@ def captcha_handler(self, public_key: str, page_url: str, **kwargs): # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id["status"] == 0: - self.result.update( - {"error": True, "errorBody": RuCaptchaError().errors(captcha_id["request"])} - ) + self.result.update({"error": True, "errorBody": captcha_id["request"]}) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: @@ -174,11 +168,7 @@ async def captcha_handler(self, public_key: str, page_url: str, **kwargs): captchaSolve - решение капчи, taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, - errorBody - полная информация об ошибке: - { - text - Развернётое пояснение ошибки - id - уникальный номер ошибка в ЭТОЙ бибилотеке - } + errorBody - название ошибки """ # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия @@ -195,9 +185,7 @@ async def captcha_handler(self, public_key: str, page_url: str, **kwargs): # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id["status"] == 0: - self.result.update( - {"error": True, "errorBody": RuCaptchaError().errors(captcha_id["request"])} - ) + self.result.update({"error": True, "errorBody": captcha_id["request"]}) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: diff --git a/python_rucaptcha/GeeTest.py b/python_rucaptcha/GeeTest.py index beb54c8d..d7d43644 100644 --- a/python_rucaptcha/GeeTest.py +++ b/python_rucaptcha/GeeTest.py @@ -3,8 +3,8 @@ import aiohttp import requests + from python_rucaptcha.config import app_key -from python_rucaptcha.errors import RuCaptchaError from python_rucaptcha.decorators import api_key_check, service_check from python_rucaptcha.result_handler import get_sync_result, get_async_result @@ -81,11 +81,7 @@ def captcha_handler(self, challenge: str, **kwargs): captchaSolve - решение капчи, taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, - errorBody - полная информация об ошибке: - { - text - Развернётое пояснение ошибки - id - уникальный номер ошибка в ЭТОЙ бибилотеке - } + errorBody - название ошибки """ # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия @@ -101,9 +97,7 @@ def captcha_handler(self, challenge: str, **kwargs): # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id["status"] == 0: - self.result.update( - {"error": True, "errorBody": RuCaptchaError().errors(captcha_id["request"])} - ) + self.result.update({"error": True, "errorBody": captcha_id["request"]}) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: @@ -200,11 +194,7 @@ async def captcha_handler(self, challenge: str, **kwargs): captchaSolve - решение капчи, taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, - errorBody - полная информация об ошибке: - { - text - Развернётое пояснение ошибки - id - уникальный номер ошибка в ЭТОЙ бибилотеке - } + errorBody - название ошибки """ # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия @@ -223,9 +213,7 @@ async def captcha_handler(self, challenge: str, **kwargs): # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id["status"] == 0: - self.result.update( - {"error": True, "errorBody": RuCaptchaError().errors(captcha_id["request"])} - ) + self.result.update({"error": True, "errorBody": captcha_id["request"]}) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: diff --git a/python_rucaptcha/HCaptcha.py b/python_rucaptcha/HCaptcha.py index 0c237af7..e0cc3a56 100644 --- a/python_rucaptcha/HCaptcha.py +++ b/python_rucaptcha/HCaptcha.py @@ -3,8 +3,8 @@ import aiohttp import requests + from python_rucaptcha.config import app_key -from python_rucaptcha.errors import RuCaptchaError from python_rucaptcha.decorators import api_key_check, service_check from python_rucaptcha.result_handler import get_sync_result, get_async_result @@ -103,9 +103,7 @@ def captcha_handler(self, site_key: str, page_url: str, **kwargs): # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id["status"] == 0: - self.result.update( - {"error": True, "errorBody": RuCaptchaError().errors(captcha_id["request"])} - ) + self.result.update({"error": True, "errorBody": captcha_id["request"]}) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: @@ -222,9 +220,7 @@ async def captcha_handler(self, site_key: str, page_url: str, **kwargs): # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id["status"] == 0: - self.result.update( - {"error": True, "errorBody": RuCaptchaError().errors(captcha_id["request"])} - ) + self.result.update({"error": True, "errorBody": captcha_id["request"]}) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: diff --git a/python_rucaptcha/ImageCaptcha.py b/python_rucaptcha/ImageCaptcha.py index ebcc686f..03687987 100644 --- a/python_rucaptcha/ImageCaptcha.py +++ b/python_rucaptcha/ImageCaptcha.py @@ -8,8 +8,8 @@ import aiohttp import requests from requests.adapters import HTTPAdapter + from python_rucaptcha.config import app_key -from python_rucaptcha.errors import RuCaptchaError from python_rucaptcha.decorators import api_key_check, service_check from python_rucaptcha.result_handler import get_sync_result, get_async_result @@ -217,11 +217,7 @@ def captcha_handler( captchaSolve - решение капчи, taskId - находится Id задачи на решение капчи, error - False - если всё хорошо, True - если есть ошибка, - errorBody - полная информация об ошибке: - { - text - Развернётое пояснение ошибки - id - уникальный номер ошибка в ЭТОЙ бибилотеке - } + errorBody - название ошибки """ # result, url_request, url_response - # задаются в декораторе `service_check`, после проверки переданного названия @@ -258,9 +254,7 @@ def captcha_handler( # если вернулся ответ с ошибкой то записываем её и возвращаем результат elif captcha_id["status"] == 0: - self.result.update( - {"error": True, "errorBody": RuCaptchaError().errors(captcha_id["request"])} - ) + self.result.update({"error": True, "errorBody": captcha_id["request"]}) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: @@ -486,11 +480,7 @@ async def captcha_handler( captchaSolve - решение капчи, taskId - находится Id задачи на решение капчи, error - False - если всё хорошо, True - если есть ошибка, - errorBody - полная информация об ошибке: - { - text - Развернётое пояснение ошибки - id - уникальный номер ошибка в ЭТОЙ бибилотеке - } + errorBody - название ошибки """ # result, url_request, url_response - # задаются в декораторе `service_check`, после проверки @@ -528,9 +518,7 @@ async def captcha_handler( # если вернулся ответ с ошибкой то записываем её и возвращаем результат elif captcha_id["status"] == 0: - self.result.update( - {"error": True, "errorBody": RuCaptchaError().errors(captcha_id["request"])} - ) + self.result.update({"error": True, "errorBody": captcha_id["request"]}) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: diff --git a/python_rucaptcha/KeyCaptcha.py b/python_rucaptcha/KeyCaptcha.py index 9f145b93..6c27617e 100644 --- a/python_rucaptcha/KeyCaptcha.py +++ b/python_rucaptcha/KeyCaptcha.py @@ -3,8 +3,8 @@ import aiohttp import requests + from python_rucaptcha.config import app_key -from python_rucaptcha.errors import RuCaptchaError from python_rucaptcha.decorators import api_key_check, service_check from python_rucaptcha.result_handler import get_sync_result, get_async_result @@ -70,11 +70,7 @@ def captcha_handler(self, key_params: dict, **kwargs): captchaSolve - решение капчи, taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, - errorBody - полная информация об ошибке: - { - text - Развернётое пояснение ошибки - id - уникальный номер ошибка в ЭТОЙ бибилотеке - } + errorBody - название ошибки """ # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия @@ -103,9 +99,7 @@ def captcha_handler(self, key_params: dict, **kwargs): # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id["status"] == 0: - self.result.update( - {"error": True, "errorBody": RuCaptchaError().errors(captcha_id["request"])} - ) + self.result.update({"error": True, "errorBody": captcha_id["request"]}) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения @@ -208,11 +202,7 @@ async def captcha_handler(self, key_params: dict, **kwargs): captchaSolve - решение капчи, taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, - errorBody - полная информация об ошибке: - { - text - Развернётое пояснение ошибки - id - уникальный номер ошибка в ЭТОЙ бибилотеке - } + errorBody - название ошибки """ # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия @@ -243,9 +233,7 @@ async def captcha_handler(self, key_params: dict, **kwargs): # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id["status"] == 0: - self.result.update( - {"error": True, "errorBody": RuCaptchaError().errors(captcha_id["request"])} - ) + self.result.update({"error": True, "errorBody": captcha_id["request"]}) return self.result else: diff --git a/python_rucaptcha/ReCaptchaV2.py b/python_rucaptcha/ReCaptchaV2.py index aa43a865..5626f240 100644 --- a/python_rucaptcha/ReCaptchaV2.py +++ b/python_rucaptcha/ReCaptchaV2.py @@ -3,8 +3,8 @@ import aiohttp import requests + from python_rucaptcha.config import app_key -from python_rucaptcha.errors import RuCaptchaError from python_rucaptcha.decorators import api_key_check, service_check from python_rucaptcha.result_handler import get_sync_result, get_async_result @@ -94,11 +94,7 @@ def captcha_handler(self, site_key: str, page_url: str, **kwargs): captchaSolve - решение капчи, taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, - errorBody - полная информация об ошибке: - { - text - Развернётое пояснение ошибки - id - уникальный номер ошибка в ЭТОЙ бибилотеке - } + errorBody - название ошибки """ # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия @@ -113,9 +109,7 @@ def captcha_handler(self, site_key: str, page_url: str, **kwargs): # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id["status"] == 0: - self.result.update( - {"error": True, "errorBody": RuCaptchaError().errors(captcha_id["request"])} - ) + self.result.update({"error": True, "errorBody": captcha_id["request"]}) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: @@ -222,11 +216,7 @@ async def captcha_handler(self, site_key: str, page_url: str, **kwargs): captchaSolve - решение капчи, taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, - errorBody - полная информация об ошибке: - { - text - Развернётое пояснение ошибки - id - уникальный номер ошибка в ЭТОЙ бибилотеке - } + errorBody - название ошибки """ # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия @@ -243,9 +233,7 @@ async def captcha_handler(self, site_key: str, page_url: str, **kwargs): # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id["status"] == 0: - self.result.update( - {"error": True, "errorBody": RuCaptchaError().errors(captcha_id["request"])} - ) + self.result.update({"error": True, "errorBody": captcha_id["request"]}) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: diff --git a/python_rucaptcha/ReCaptchaV3.py b/python_rucaptcha/ReCaptchaV3.py index 27deca86..a2de7b10 100644 --- a/python_rucaptcha/ReCaptchaV3.py +++ b/python_rucaptcha/ReCaptchaV3.py @@ -3,8 +3,8 @@ import aiohttp import requests + from python_rucaptcha.config import app_key -from python_rucaptcha.errors import RuCaptchaError from python_rucaptcha.decorators import api_key_check, service_check from python_rucaptcha.result_handler import get_sync_result, get_async_result @@ -94,11 +94,7 @@ def captcha_handler(self, site_key: str, page_url: str, **kwargs): user_score - score решившего капчу работника taskId - находится ID задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, - errorBody - полная информация об ошибке: - { - text - Развернётое пояснение ошибки - id - уникальный номер ошибка в ЭТОЙ бибилотеке - } + errorBody - название ошибки """ # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия @@ -113,9 +109,7 @@ def captcha_handler(self, site_key: str, page_url: str, **kwargs): # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id["status"] == 0: - self.result.update( - {"error": True, "errorBody": RuCaptchaError().errors(captcha_id["request"])} - ) + self.result.update({"error": True, "errorBody": captcha_id["request"]}) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: @@ -226,11 +220,7 @@ async def captcha_handler(self, site_key: str, page_url: str, **kwargs): user_score - score решившего капчу работника taskId - находится ID задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, - errorBody - полная информация об ошибке: - { - text - Развернётое пояснение ошибки - id - уникальный номер ошибка в ЭТОЙ бибилотеке - } + errorBody - название ошибки """ # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия @@ -247,9 +237,7 @@ async def captcha_handler(self, site_key: str, page_url: str, **kwargs): # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id["status"] == 0: - self.result.update( - {"error": True, "errorBody": RuCaptchaError().errors(captcha_id["request"])} - ) + self.result.update({"error": True, "errorBody": captcha_id["request"]}) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: diff --git a/python_rucaptcha/RotateCaptcha.py b/python_rucaptcha/RotateCaptcha.py index 771db895..de0a6a31 100644 --- a/python_rucaptcha/RotateCaptcha.py +++ b/python_rucaptcha/RotateCaptcha.py @@ -5,8 +5,8 @@ import aiohttp import requests from requests.adapters import HTTPAdapter + from python_rucaptcha.config import app_key -from python_rucaptcha.errors import RuCaptchaError from python_rucaptcha.decorators import api_key_check, service_check from python_rucaptcha.result_handler import get_sync_result, get_async_result @@ -79,11 +79,7 @@ def captcha_handler(self, captcha_link: str, **kwargs): captchaSolve - решение капчи, taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, - errorBody - полная информация об ошибке: - { - text - Развернётое пояснение ошибки - id - уникальный номер ошибка в ЭТОЙ бибилотеке - } + errorBody - название ошибки """ # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия @@ -110,9 +106,7 @@ def captcha_handler(self, captcha_link: str, **kwargs): # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id["status"] == 0: - self.result.update( - {"error": True, "errorBody": RuCaptchaError().errors(captcha_id["request"])} - ) + self.result.update({"error": True, "errorBody": captcha_id["request"]}) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: @@ -205,11 +199,7 @@ async def captcha_handler(self, captcha_link: str, **kwargs): captchaSolve - решение капчи, taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, - errorBody - полная информация об ошибке: - { - text - Развернётое пояснение ошибки - id - уникальный номер ошибка в ЭТОЙ бибилотеке - } + errorBody - название ошибки """ # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия @@ -230,9 +220,7 @@ async def captcha_handler(self, captcha_link: str, **kwargs): # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id["status"] == 0: - self.result.update( - {"error": True, "errorBody": RuCaptchaError().errors(captcha_id["request"])} - ) + self.result.update({"error": True, "errorBody": captcha_id["request"]}) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: diff --git a/python_rucaptcha/RuCaptchaControl.py b/python_rucaptcha/RuCaptchaControl.py index 294b5851..4951cd2d 100644 --- a/python_rucaptcha/RuCaptchaControl.py +++ b/python_rucaptcha/RuCaptchaControl.py @@ -1,6 +1,6 @@ import aiohttp import requests -from python_rucaptcha.errors import RuCaptchaError + from python_rucaptcha.decorators import api_key_check, service_check @@ -41,11 +41,7 @@ def additional_methods(self, action: str, **kwargs): serverAnswer - ответ сервера при использовании RuCaptchaControl(баланс/жалобы и т.д.), taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, - errorBody - полная информация об ошибке: - { - text - Развернётое пояснение ошибки - id - уникальный номер ошибка в ЭТОЙ бибилотеке - } + errorBody - название ошибки Больше подробностей и примеров можно прочитать в 'CaptchaTester/rucaptcha_control_example.py' """ # result, url_response - задаются в декораторе `service_check`, после проверки переданного названия @@ -65,9 +61,7 @@ def additional_methods(self, action: str, **kwargs): return self.result if answer.json()["status"] == 0: - self.result.update( - {"error": True, "errorBody": RuCaptchaError().errors(answer.json()["request"])} - ) + self.result.update({"error": True, "errorBody": answer.json()["request"]}) return self.result elif answer.json()["status"] == 1: @@ -113,11 +107,7 @@ async def additional_methods(self, action: str, **kwargs): serverAnswer - ответ сервера при использовании RuCaptchaControl(баланс/жалобы и т.д.), taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, - errorBody - полная информация об ошибке: - { - text - Развернётое пояснение ошибки - id - уникальный номер ошибка в ЭТОЙ бибилотеке - } + errorBody - название ошибки Больше подробностей и примеров можно прочитать в 'CaptchaTester/rucaptcha_control_example.py' """ # result, url_response - задаются в декораторе `service_check`, после проверки переданного названия @@ -140,9 +130,7 @@ async def additional_methods(self, action: str, **kwargs): return self.result if answer["status"] == 0: - self.result.update( - {"error": True, "errorBody": RuCaptchaError().errors(answer["request"])} - ) + self.result.update({"error": True, "errorBody": answer["request"]}) return self.result elif answer["status"] == 1: diff --git a/python_rucaptcha/TextCaptcha.py b/python_rucaptcha/TextCaptcha.py index 766b4fcb..657b4243 100644 --- a/python_rucaptcha/TextCaptcha.py +++ b/python_rucaptcha/TextCaptcha.py @@ -3,8 +3,8 @@ import aiohttp import requests + from python_rucaptcha.config import app_key -from python_rucaptcha.errors import RuCaptchaError from python_rucaptcha.decorators import api_key_check, service_check from python_rucaptcha.result_handler import get_sync_result, get_async_result @@ -63,11 +63,7 @@ def captcha_handler(self, captcha_text: str, **kwargs): captchaSolve - решение капчи, taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, - errorBody - полная информация об ошибке: - { - text - Развернётое пояснение ошибки - id - уникальный номер ошибка в ЭТОЙ бибилотеке - } + errorBody - название ошибки """ # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия @@ -84,9 +80,7 @@ def captcha_handler(self, captcha_text: str, **kwargs): # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id["status"] == 0: - self.result.update( - {"error": True, "errorBody": RuCaptchaError().errors(captcha_id["request"])} - ) + self.result.update({"error": True, "errorBody": captcha_id["request"]}) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: @@ -166,11 +160,7 @@ async def captcha_handler(self, captcha_text: str, **kwargs): captchaSolve - решение капчи, taskId - находится Id задачи на решение капчи, можно использовать при жалобах и прочем, error - False - если всё хорошо, True - если есть ошибка, - errorBody - полная информация об ошибке: - { - text - Развернётое пояснение ошибки - id - уникальный номер ошибка в ЭТОЙ бибилотеке - } + errorBody - название ошибки """ # result, url_request, url_response - задаются в декораторе `service_check`, после проверки переданного названия @@ -188,9 +178,7 @@ async def captcha_handler(self, captcha_text: str, **kwargs): # если вернулся ответ с ошибкой то записываем её и возвращаем результат if captcha_id["status"] == 0: - self.result.update( - {"error": True, "errorBody": RuCaptchaError().errors(captcha_id["request"])} - ) + self.result.update({"error": True, "errorBody": captcha_id["request"]}) return self.result # иначе берём ключ отправленной на решение капчи и ждём решения else: diff --git a/python_rucaptcha/config.py b/python_rucaptcha/config.py index b14d7ddb..41d03065 100644 --- a/python_rucaptcha/config.py +++ b/python_rucaptcha/config.py @@ -38,8 +38,8 @@ } """ JSON_RESPONSE = { - "serverAnswer": None, - "captchaSolve": None, + "serverAnswer": {}, + "captchaSolve": {}, "taskId": None, "error": False, "errorBody": {"text": None, "id": 0}, diff --git a/python_rucaptcha/decorators.py b/python_rucaptcha/decorators.py index c9233189..6a2f36e3 100644 --- a/python_rucaptcha/decorators.py +++ b/python_rucaptcha/decorators.py @@ -5,7 +5,6 @@ url_response_2captcha, url_response_rucaptcha, ) -from .errors import RuCaptchaError def api_key_check(func): @@ -20,9 +19,7 @@ def wrapper(self, *args, **kwargs): if len(self.post_payload.get("key")) == 32: return func(self, *args, **kwargs) else: - self.result.update( - {"error": True, "errorBody": RuCaptchaError().errors("ERROR_WRONG_USER_KEY")} - ) + self.result.update({"error": True, "errorBody": "ERROR_WRONG_USER_KEY"}) return self.result return wrapper diff --git a/python_rucaptcha/errors.py b/python_rucaptcha/errors.py deleted file mode 100644 index b8c80786..00000000 --- a/python_rucaptcha/errors.py +++ /dev/null @@ -1,451 +0,0 @@ -class RuCaptchaError(Exception): - """Базовый класс для всех исключений в этом модуле.""" - - @staticmethod - def errors(description): - """ - Ошибки in.php - """ - if description == "ERROR_WRONG_USER_KEY": - return WrongUserKeyError.answer() - elif description == "ERROR_KEY_DOES_NOT_EXIST": - return NonExistentKeyError.answer() - elif description == "ERROR_ZERO_BALANCE": - return ZeroBalanceError.answer() - elif description == "ERROR_PAGEURL": - return PageUrlError.answer() - elif description == "ERROR_NO_SLOT_AVAILABLE": - return NoSlotsError.answer() - elif description == "ERROR_ZERO_CAPTCHA_FILESIZE": - return ZerroCaptchaSizeError.answer() - elif description == "ERROR_TOO_BIG_CAPTCHA_FILESIZE": - return ToBigCaptchaSizeError.answer() - elif description == "ERROR_WRONG_FILE_EXTENSION": - return WrongCaptchaFormatError.answer() - elif description == "ERROR_IMAGE_TYPE_NOT_SUPPORTED": - return NotSupportedCaptchaTypeError.answer() - elif description == "ERROR_UPLOAD": - return ErrorUploadCaptchaError.answer() - elif description == "ERROR_IP_NOT_ALLOWED": - return IPNotAllowedError.answer() - elif description == "IP_BANNED": - return BannedIPError.answer() - elif description == "ERROR_BAD_TOKEN_OR_PAGEURL": - return BadTokenOrPageurlCaptchaError.answer() - elif description in ("ERROR_GOOGLEKEY", "ERROR_WRONG_GOOGLEKEY"): - return ErrorGoogleKeyCaptchaError.answer() - elif description == "ERROR_CAPTCHAIMAGE_BLOCKED": - return BlockedimageCaptchaError.answer() - elif description == "MAX_USER_TURN": - return MaxUserTurnCaptchaError.answer() - - # Ошибки res.php - elif description == "CAPCHA_NOT_READY": - return CaptchaNotReadyError.answer() - elif description == "ERROR_CAPTCHA_UNSOLVABLE": - return UnsolvableCaptchaError.answer() - elif description == "ERROR_WRONG_ID_FORMAT": - return WrongCaptchaIDFormatError.answer() - elif description == "ERROR_WRONG_CAPTCHA_ID": - return WrongCaptchaIDError.answer() - elif description == "ERROR_BAD_DUPLICATES": - return BadDuplicatesError.answer() - elif description == "REPORT_NOT_RECORDED": - return ReportNotRecordedError.answer() - - # Error: NNNN - elif description == "ERROR: 1001": - return Number1001Error.answer() - elif description == "ERROR: 1002": - return Number1002Error.answer() - elif description == "ERROR: 1003": - return Number1003Error.answer() - elif description == "ERROR: 1004": - return Number1004Error.answer() - elif description == "ERROR: 1005": - return Number1005Error.answer() - - # Error: New/Unknown - else: - return UnknownError.answer(description=description) - - -class ReadError(Exception): - def __init__(self, error): - Exception.__init__( - self, f"\n\tОшибка порождается при невозможности открыть переднный файл!\n\t\t{error}" - ) - - -class UnknownError(RuCaptchaError): - @staticmethod - def answer(description: str): - return { - "text": f"""Исключение порождается при неправильном неизвестной ошибке. - Сообщите о данной ошибке разработчикам библиотеки - - мы её обязательно добавим в список с описанием. - {description} - исключение.""", - "id": -1, - } - - -class WrongUserKeyError(RuCaptchaError): - @staticmethod - def answer(): - return { - "text": """Исключение порождается при неправильном RuCaptcha KEY. - Вы указали значение параметра key в неверном формате, - ключ должен содержать 32 символа. - Прекратите отправку запросов и проверьте ваш ключ API. - ERROR_WRONG_USER_KEY - исключение из таблицы. - """, - "id": 10, - } - - -class NonExistentKeyError(RuCaptchaError): - @staticmethod - def answer(): - return { - "text": """Исключение порождается при несуществующем RuCaptcha KEY. - Ключ, который вы указали не существует. - Прекратите отправку запросов и проверьте ваш ключ API. - ERROR_KEY_DOES_NOT_EXIST - исключение из таблицы.""", - "id": 11, - } - - -class ZeroBalanceError(RuCaptchaError): - @staticmethod - def answer(): - return { - "text": """Исключение порождается при отсутствии средств на балансе. - На вашем счету недостаточно средств. - Прекратите отправку запросов. Пополните баланс вашего счета, - чтобы продолжить работу с сервисом. - ERROR_ZERO_BALANCE - исключение из таблицы.""", - "id": 12, - } - - -class PageUrlError(RuCaptchaError): - @staticmethod - def answer(): - return { - "text": """Исключение порождается при неправильном PageUrl. - Параметр pagurl не задан в запросе. - Остановите отправку запросов и измените ваш код, - чтобы передавать правильное значение параметра pagurl. - ERROR_PAGEURL - исключение из таблицы.""", - "id": 13, - } - - -class NoSlotsError(RuCaptchaError): - @staticmethod - def answer(): - return { - "text": """Исключение порождается при отсутсвии свободных слотов в очереди на решение ваших капч. - Вы можете получить данную ошибку в двух случаях: - 1. Очередь ваших капч, которые еще не распределены на работников, слишком длинная. - Длина очереди зависит от общего числа капч, - которые ждут распределения, и может иметь значения от 50 до 100 капч. - 2. Максимальная ставка, которую вы указали в настройках вашего аккаунта - ниже текущей ставки на сервере. - Вы можете повысить вашу максимальную ставку. - Если вы получили данную ошибку, не отправляйте ваш запрос повторно сразу же после ее получения. - Сделайте паузу в 2-3 секунды и попробуйте повторить ваш запрос. - ERROR_NO_SLOT_AVAILABLE - исключение из таблицы.""", - "id": 14, - } - - -class ZerroCaptchaSizeError(RuCaptchaError): - @staticmethod - def answer(): - return { - "text": """Исключение порождается при некорректной загрузке изображения. - Размер вашего изображения менее 100 байт. - Проверьте файл изображения. - - ERROR_ZERO_CAPTCHA_FILESIZE - исключение из таблицы.""", - "id": 15, - } - - -class ToBigCaptchaSizeError(RuCaptchaError): - @staticmethod - def answer(): - return { - "text": """Исключение порождается при некорректной загрузке изображения. - Размер вашего изображения более 100 Кбайт. - Проверьте файл изображения. - ERROR_TOO_BIG_CAPTCHA_FILESIZE - исключение из таблицы.""", - "id": 16, - } - - -class WrongCaptchaFormatError(RuCaptchaError): - @staticmethod - def answer(): - return { - "text": """Исключение порождается при загрузке некорректного изображения. - Файл имеет неподдерживаемое расширение. - Допустимые расширения: jpg, jpeg, gif, png. - Проверьте файл изображения. - ERROR_WRONG_FILE_EXTENSION - исключение из таблицы.""", - "id": 17, - } - - -class NotSupportedCaptchaTypeError(RuCaptchaError): - @staticmethod - def answer(): - return { - "text": """Исключение порождается при загрузке некорректного изображения. - Сервер не может опознать тип вашего файла. - Проверьте файл изображения. - ERROR_IMAGE_TYPE_NOT_SUPPORTED - искючение из таблицы.""", - "id": 18, - } - - -class ErrorUploadCaptchaError(RuCaptchaError): - @staticmethod - def answer(): - return { - "text": """Исключение порождается при загрузке некорректного изображения. - Сервер не может прочитать файл из вашего POST-запроса. - Это происходит, если POST-запрос некорректно сформирован в части отправки файла, - либо содержит невалидный base64. - ERROR_UPLOAD - искючение из таблицы.""", - "id": 19, - } - - -class IPNotAllowedError(RuCaptchaError): - @staticmethod - def answer(): - return { - "text": """Исключение порождается при запросе к серверу от неразрешённого IP адреса. - Запрос отправлен с IP адреса, который не добавлен в список разрешенных вами IP адресов. - Проверьте список адресов. - ERROR_IP_NOT_ALLOWED - искючение из таблицы.""", - "id": 20, - } - - -class BannedIPError(RuCaptchaError): - @staticmethod - def answer(): - return { - "text": """Исключение порождается при чрезмерном количестве попыток авторизации с неверным ключём. - Ваш IP адрес заблокирован за чрезмерное количество попыток - авторизации с неверным ключем авторизации. - Для разблокировки обратитесь в службу технической поддержки. - IP_BANNED - искючение из таблицы.""", - "id": 21, - } - - -class BadTokenOrPageurlCaptchaError(RuCaptchaError): - @staticmethod - def answer(): - return { - "text": """Исключение порождается при некорректной паре googlekey и pageurl. - Вы можете получить эту ошибку, если отправляете нам ReCaptcha V2. - Ошибка возвращается если вы прислали невалидную - пару значений googlekey и pageurl. - Обычно так бывает, если ReCaptcha подгружается в iframe с другого домена или поддомена. - ERROR_BAD_TOKEN_OR_PAGEURL - искючение из таблицы.""", - "id": 22, - } - - -class ErrorGoogleKeyCaptchaError(RuCaptchaError): - @staticmethod - def answer(): - return { - "text": """Исключение порождается при некорректном recaptcha-sitekey. - Вы можете получить эту ошибку, если отправляете нам ReCaptcha V2. - Ошибка возвращается если sitekey в вашем запросе - пустой или имеет некорректный формат. - ERROR_GOOGLEKEY - искючение из таблицы.""", - "id": 23, - } - - -class BlockedimageCaptchaError(RuCaptchaError): - @staticmethod - def answer(): - return { - "text": """Исключение порождается при загрузке некоректного изображения с сайта. - Вы отправили изображение, которые помечено в нашей базе данных как нераспознаваемое. - Обычно это происходит, если сайт, на котором вы решаете капчу, - прекратил отдавать вам капчу и вместо этого выдает изображение с информацией о блокировке. - Попробуйте обойти ограничения этого сайта. - ERROR_CAPTCHAIMAGE_BLOCKED - искючение из таблицы.""", - "id": 24, - } - - -class MaxUserTurnCaptchaError(RuCaptchaError): - @staticmethod - def answer(): - return { - "text": """Исключение порождается при большом кол-ве запросов к IN.php. - Вы делаете больше 60 обращений к in.php в течение 3 секунд. - Ваш ключ API заблокирован на 10 секунд. Блокировка будет снята автоматически - MAX_USER_TURN - искючение из таблицы.""", - "id": 25, - } - - -# res.php -class CaptchaNotReadyError(RuCaptchaError): - @staticmethod - def answer(): - return { - "text": """Исключение порождается при неготовности капчи. - Ваша капча еще не решена. - Подождите 5 секунд и повторите ваш запрос. - CAPCHA_NOT_READY - исключение из таблицы.""", - "id": 30, - } - - -class UnsolvableCaptchaError(RuCaptchaError): - @staticmethod - def answer(): - return { - "text": """Исключение порождается при невозможности решить капчу. - Мы не можем решить вашу капчу - три наших работника не смогли ее решить, - либо мы не получили ответ в течении 90 секунд. - Мы не спишем с вас деньги за этот запрос. - Вы можете попробовать отправить капчу еще раз. - ERROR_CAPTCHA_UNSOLVABLE - исключение из таблицы.""", - "id": 31, - } - - -class WrongCaptchaIDFormatError(RuCaptchaError): - @staticmethod - def answer(): - return { - "text": """Исключение порождается при некорректном формате номера капчи. - Вы отправили ID капчи в неправильном формате. - ID состоит только из цифр. - Проверьте ID вашей капчи или код, который отвечает за получение и отправку ID. - ERROR_WRONG_ID_FORMAT - исключение из таблицы.""", - "id": 32, - } - - -class WrongCaptchaIDError(RuCaptchaError): - @staticmethod - def answer(): - return { - "text": """Исключение порождается при некорректном номере капчи. - Вы отправили неверный ID капчи. - Проверьте ID вашей капчи или код, который отвечает за получение и отправку ID. - ERROR_WRONG_CAPTCHA_ID - исключение из таблицы.""", - "id": 33, - } - - -class BadDuplicatesError(RuCaptchaError): - @staticmethod - def answer(): - return { - "text": """Исключение порождается при невозможности решить 100% капч. - Ошибка возвращается, если вы используете функцию 100% распознавания. - Ошибка означает, что мы достигли максимального числа попыток, - но требуемое количество совпадений достигнуто не было. - Вы можете попробовать отправить вашу капчу еще раз. - ERROR_BAD_DUPLICATES - исключение из таблицы.""", - "id": 34, - } - - -class ReportNotRecordedError(RuCaptchaError): - @staticmethod - def answer(): - return { - "text": """Исключение порождается при некорректной загрузке изображения. - Ошибка возвращается при отправке жалобы на неверный ответ если - вы уже пожаловались на большое количество верно решенных капч. - Убедитесь, что вы отправляете жалобы только в случае неправильного решения. - REPORT_NOT_RECORDED - исключение из таблицы.""", - "id": 35, - } - - -# NNNN -class Number1001Error(RuCaptchaError): - @staticmethod - def answer(): - return { - "text": """Блокировка на 10 минут. - Вы получили 120 ответов ERROR_NO_SLOT_AVAILABLE за одну минуту - из-за того, что ваша максимальная ставка ниже, чем текущая ставка на сервере. - ERROR: 1001 - искючение из таблицы.""", - "id": 40, - } - - -class Number1002Error(RuCaptchaError): - @staticmethod - def answer(): - return { - "text": """Блокировка на 5 минут. - Вы получили 120 ответов ERROR_ZERO_BALANCE за одну минуту из-за того, - что на вашем счету недостаточно средств. - ERROR: 1002 - искючение из таблицы.""", - "id": 41, - } - - -class Number1003Error(RuCaptchaError): - @staticmethod - def answer(): - return { - "text": """Блокировка на 30 секунд. - Вы получаете ответ ERROR_NO_SLOT_AVAILABLE потому что загружаете очень много капч - и на сервере скопилась большая очередь из ваших капч, которые не распределены работникам. - Вы получили в три раза больше ошибок, - чем число капч, которое вы загрузили (но не менее 120 ошибок). - Увеличьте тайм-аут, если вы получаете этот код ошибки. - ERROR: 1003 - искючение из таблицы.""", - "id": 42, - } - - -class Number1004Error(RuCaptchaError): - @staticmethod - def answer(): - return { - "text": """Блокировка на 10 минут. - Ваш IP адрес заблокирован, - потому что мы получили 5 запросов с некорректным ключем API с вашего IP. - ERROR: 1004 - искючение из таблицы.""", - "id": 43, - } - - -class Number1005Error(RuCaptchaError): - @staticmethod - def answer(): - return { - "text": """Блокировка на 5 минут. - Вы делаете слишком много запросов к res.php для получения ответов. - При блокировке аккаунта используется следующее правило: R > C * 20 + 1200 - Где: - R - число ваших запросов - C - число капч, которые вы загрузили - Это означает, что вы не должны обращаться к res.php за ответом для каждой капчи более 20 раз. - Пожалуйста, помните, что запрос баланса к res.php также учитывается! - Чтобы получать ваши ответы быстрее, без риска быть заблокированным, - вы можете использовать метод pingback и мы отправим вам ответ, как только решим вашу капчу. - ERROR: 1005 - искючение из таблицы.""", - "id": 44, - } diff --git a/python_rucaptcha/result_handler.py b/python_rucaptcha/result_handler.py index 2d71ddc3..5b9fdb37 100644 --- a/python_rucaptcha/result_handler.py +++ b/python_rucaptcha/result_handler.py @@ -5,7 +5,6 @@ import requests from .config import connect_generator -from .errors import RuCaptchaError # синхронный метод @@ -22,9 +21,7 @@ def get_sync_result(get_payload: dict, sleep_time: int, url_response: str, resul # при ошибке во время решения elif captcha_response["status"] == 0: - result.update( - {"error": 1, "errorBody": RuCaptchaError().errors(captcha_response["request"])} - ) + result.update({"error": 1, "errorBody": captcha_response["request"]}) return result # при решении капчи @@ -69,10 +66,7 @@ async def get_async_result(get_payload: dict, sleep_time: int, url_response: str # при ошибке во время решения elif captcha_response["status"] == 0: result.update( - { - "error": True, - "errorBody": RuCaptchaError().errors(captcha_response["request"]), - } + {"error": True, "errorBody": captcha_response["request"],} ) return result diff --git a/setup.py b/setup.py index 7db04838..3214c7bc 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ EMAIL = "drang.andray@gmail.com" AUTHOR = "AndreiDrang, redV0ID" REQUIRES_PYTHON = ">=3.6.0" -VERSION = "2.6.5a" +VERSION = "3.0" REQUIRED = ["requests==2.23.0", "aiohttp==3.6.2", "pika==1.1.0"] here = os.path.abspath(os.path.dirname(__file__))