Python 3.6+ RuCaptcha library with AIO module.
Project description
python-rucaptcha
Библиотека предназначена для разрабаотчиков ПО и служит для облегчения работы с API сервиса RuCaptcha.
Присутствуют примеры работы с библиотекой.
Используется Python версии 3.6+.
How to install? Как установить?
pip
pip install python-rucaptcha
Source
git clone https://github.com/AndreiDrang/python-rucaptcha.git
cd python-rucaptcha
python setup.py install
По всем вопросам можете писать в Telegram чат.
Последние обновления
v.2.0 - Обновление JSON ответа, ключа с информацией об ошибке(создание собственного списка ошибок с уникальными id
).
Добавление в errorBody
двух ключей: text
(текст ошибки) и id
(уникальный номер ошибки). Таблица с ошибками и их номерами.
Замена errorId
и его значений 1/0 на error
и логические True
(есть ошибка)/False
(нет ошибки).
v.2.2.1 - Вынесение методов для получению решений капчи (как синхронного так и асинхронного) в отдельный файл.
v.2.3 - Удаление использования временных файлов(для хранения изображений) и замена их на переменную.
v.2.4 - Добавление callback
(pingback) параметра для работы со всеми видами капч. Добавление нового модуля для получения результатов решения капчи с сервера - CallbackClient. В примеры добавлен асинхронный сервер(на aiohttp) для обработки POST-запросов от RuCaptcha, а так же эмулятор RuCaptcha
, который высылает те же параметры что и настоящий сервер(подойдёт для тестирования обработки решений капчи).
v.2.5 - Добавление метода для решения ReCaptcha v3
. Удаление модуля MediaCaptcha
из библиотеки.
v.2.5.3 - Добавление contextmanager
ко всем методам решения капчи.
v.2.5.4 - Добавление GeeTest
метода. С синхронным и асинхронным исполнением.
v.2.6.3 - Добавление Distil
метода. С синхронным и асинхронным исполнением.
v.2.6.4 - Добавление HCaptcha
метода. С синхронным и асинхронным исполнением.
v.2.6.5 - Добавление CapyPuzzle
метода. С синхронным и асинхронным исполнением.
v.3.0 - Удаление кастомных ошибиок и вывода текста о них.
- Замена структуры:
{ "errorBody": { "text": "some text", "id": 1 } }
- На структуру:
{ "errorBody": "ERROR_NAME" }
Будущие обновления
v.4.0 - Переработка классов и методов. Добавление наследований и переиспользования.
Реализованы следующие методы:
0.Работа через callback(pingback).
Структура и принцип работы системы подробно расписан в данной схеме
Краткий пример:
import requests
from python_rucaptcha import ImageCaptcha, RuCaptchaControl, CallbackClient
# Введите ключ от сервиса RuCaptcha, из своего аккаунта
RUCAPTCHA_KEY = ""
# Ссылка на изображения для расшифровки
image_link = ""
# для начала работы нужно зарегистрировать IP/URL(делается с того же IP, который регистрируете):
RuCaptchaControl.RuCaptchaControl(rucaptcha_key=RUCAPTCHA_KEY).additional_methods(action='add_pingback', addr='http://85.255.8.26/')
# проверка зарегистрированных адресов
answer = RuCaptchaControl.RuCaptchaControl(rucaptcha_key=RUCAPTCHA_KEY).additional_methods(action='get_pingback', json=1)
print(answer)
# нужно придумать сложное название очереди(15+ знаков подойдёт) для получения результатов решения капчи
queue_name = 'ba86e77f9007_andrei_drang_7436e744_cute_queue'
# регистрируем очередь на callback сервере
answer = requests.post(f'http://85.255.8.26:8001/register_key', json={'key':queue_name, 'vhost': 'rucaptcha_vhost'})
print(answer.text)
# создаём задание в сервисе RuCaptcha и указываем `pingback` параметр
task_creation_answer = ImageCaptcha.ImageCaptcha(rucaptcha_key=RUCAPTCHA_KEY,
pingback=f'85.255.8.26:8001/rucaptcha/image_captcha/{queue_name}',
).captcha_handler(captcha_link=image_link)
print(task_creation_answer)
# Два варианта получения решения: кеш(результат хранится 1 час) и rabbitmq очередь(результат удаляется после первого чтения)
# подключаемся к серверу и ждём решения капчи из кеша
callback_cache_response = CallbackClient.CallbackClient(task_id=task_creation_answer.get('id')).captcha_handler()
# подключаемся к серверу и ждём решения капчи из RabbitMQ queue
callback_queue_response = CallbackClient.CallbackClient(task_id=task_creation_answer.get('id'), queue_name=queue_name, call_type='queue').captcha_handler()
print(callback_cache_response)
print(callback_queue_response)
Если вы хотите запустить данный callback сервер у себя:
Небольшая инструкция-памятка по шагам.
Установить и запустить веб-приложение, которое будет принимать POST-запросы, парсить их, и совершать прочую, нужную вам, магию.
Пример такого сервера, написанный на aiohttp.
Все тесты можно проводить на локальном сервере, эмулируя POST-запросы от RuCaptcha при помощи локального клиента.
Примеры создания реальных заданий для callback(pingback) способа вы можете посмотреть в папке с примерами, для конкретного метода капчи.
Работа обычным методом - ожидание решения капчи периодическим опросом сервера.
1.Решение капчи-изображения(большие и маленькие).
from python_rucaptcha import ImageCaptcha
# Введите ключ от сервиса RuCaptcha, из своего аккаунта
RUCAPTCHA_KEY = ""
# Ссылка на изображения для расшифровки
image_link = ""
# Возвращается JSON содержащий информацию для решения капчи
user_answer = ImageCaptcha.ImageCaptcha(rucaptcha_key=RUCAPTCHA_KEY).captcha_handler(captcha_link=image_link)
if not user_answer['error']:
# решение капчи
print(user_answer['captchaSolve'])
print(user_answer['taskId'])
elif user_answer['error']:
# Тело ошибки, если есть
print(user_answer ['errorBody'])
print(user_answer ['errorBody'])
2.Решение KeyCaptcha(пазл-капча).
from python_rucaptcha import KeyCaptcha
# Введите ключ от сервиса RuCaptcha, из своего аккаунта
RUCAPTCHA_KEY = ''
answer = KeyCaptcha.KeyCaptcha(rucaptcha_key=RUCAPTCHA_KEY) \
.captcha_handler(key_params = {
'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/'
}
)
# капча решена верно, ошибка = 0
if not answer['error']:
# решение капчи
print(answer['captchaSolve'])
print(answer['taskId'])
# во время решения капчи возникли ошибки, ошибка = 1
elif answer['error']:
# Тело ошибки, если есть
print(answer['errorBody'])
from python_rucaptcha import ReCaptchaV2
# Введите ключ от сервиса RuCaptcha, из своего аккаунта
RUCAPTCHA_KEY = ""
# G-ReCaptcha ключ сайта
SITE_KEY = ""
# Ссылка на страницу с капчёй
PAGE_URL = ""
# Возвращается JSON содержащий информацию для решения капчи
user_answer = ReCaptchaV2.ReCaptchaV2(rucaptcha_key=RUCAPTCHA_KEY).captcha_handler(site_key=SITE_KEY,
page_url=PAGE_URL)
if not user_answer['error']:
# решение капчи
print(user_answer['captchaSolve'])
print(user_answer['taskId'])
elif user_answer['error']:
# Тело ошибки, если есть
print(user_answer ['errorBody'])
print(user_answer ['errorBody'])
from python_rucaptcha import ReCaptchaV3
# Введите ключ от сервиса RuCaptcha, из своего аккаунта
RUCAPTCHA_KEY = ""
# G-ReCaptcha ключ сайта
SITE_KEY = ""
# Ссылка на страницу с капчёй
PAGE_URL = ""
# Значение параметра action, которые вы нашли в коде сайта
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
)
if not user_answer['error']:
# решение капчи
print(user_answer['captchaSolve'])
print(user_answer['taskId'])
print(user_answer['user_check'])
print(user_answer['user_score'])
elif user_answer['error']:
# Тело ошибки, если есть
print(user_answer ['errorBody'])
print(user_answer ['errorBody'])
5.Решение RotateCaptcha(повернуть изображение).
from python_rucaptcha import TextCaptcha
# Введите ключ от рукапчи из своего аккаунта
RUCAPTCHA_KEY = ''
# Вопрос
text_question = 'Если завтра суббота, то какой сегодня день?'
user_answer = TextCaptcha.TextCaptcha(rucaptcha_key = RUCAPTCHA_KEY).captcha_handler(captcha_text = text_question)
if not user_answer['error']:
# решение капчи
print(user_answer['captchaSolve'])
print(user_answer['taskId'])
elif user_answer['error']:
# Тело ошибки, если есть
print(user_answer ['errorBody'])
print(user_answer ['errorBody'])
from python_rucaptcha import FunCaptcha
# Введите ключ от рукапчи из своего аккаунта
RUCAPTCHA_KEY = ''
'''
Страница на которой находится FunCaptch:
https://www.funcaptcha.com/demo
Данные взятые из этой страницы о данной капче:
'''
public_key = 'DE0B0BB7-1EE4-4D70-1853-31B835D4506B'
pageurl = 'https://www.funcaptcha.com/demo'
answer = FunCaptcha.FunCaptcha(rucaptcha_key = RUCAPTCHA_KEY).captcha_handler(public_key=public_key, page_url=pageurl)
if not answer['error']:
# решение капчи
print(answer['captchaSolve'])
print(answer['taskId'])
elif answer['error']:
# Тело ошибки, если есть
print(answer ['errorBody'])
8.Модуль для получения инофрмации о балансе аккаунта и отправке жалоб.
from python_rucaptcha.RuCaptchaControl import RuCaptchaControl
# Введите ключ от рукапчи из своего аккаунта
RUCAPTCHA_KEY = ''
JsSha1 = "af2d0557c23ff2d8f40ccf4bec57e480704634e9"
JsUri = "http://www.targetwebsite.com/pvvhnzyazwpzgkhv.js"
JsData = "IWZ1bmN0fewfwefwefwef9905j0g4905jh9046hj3cpCg=="
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"])
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']:
# решение капчи
print(answer['captchaSolve'])
print(answer['taskId'])
elif answer['error']:
# Тело ошибки, если есть
print(answer ['errorBody'])
from python_rucaptcha.CapyPuzzle import CapyPuzzle
RUCAPTCHA_KEY = ''
captchakey="PUZZLE_Cme4hZLjuZRMYC3uh14C52D3uNms5w"
page_url="https://www.capy.me/account/register/"
answer = CapyPuzzle(rucaptcha_key=RUCAPTCHA_KEY).captcha_handler(
captchakey=captchakey, page_url=page_url
)
if not answer['error']:
# решение капчи
print(answer['captchaSolve'])
print(answer['taskId'])
elif answer['error']:
# Тело ошибки, если есть
print(answer ['errorBody'])
Кроме того, для тестирования различных типов капчи предоставляется специальный сайт, на котором собраны все имеющиеся типы капчи, с удобной системой тестирования ваших скриптов.
Errors description. Описания ошибок
В обоих ссылках находятся валидные описания ошибок
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file python-rucaptcha-session-patch-3.0.tar.gz
.
File metadata
- Download URL: python-rucaptcha-session-patch-3.0.tar.gz
- Upload date:
- Size: 39.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/46.0.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.7.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 09dec426787b746fa2d6f3dcbfb8e9a5f328fbcec1f2d5cc690db5aa03473569 |
|
MD5 | a9dd2dee55edb0f4176569c3324fa79d |
|
BLAKE2b-256 | ef37c08b2ff638caac04af4894aab3752f22a5c37ee400e66e298d029f4207e1 |
File details
Details for the file python_rucaptcha_session_patch-3.0-py3-none-any.whl
.
File metadata
- Download URL: python_rucaptcha_session_patch-3.0-py3-none-any.whl
- Upload date:
- Size: 54.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/46.0.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.7.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 85448378a5227df108a74371d3a351da33be42df94ad6db54ecdf8a52f6167bc |
|
MD5 | cd705ce2ef5e46d085eae1c8e3cfbaba |
|
BLAKE2b-256 | cb2b36819132ca230bbf3632a318569a45b9acec54c49d009edd2fbedad92e68 |