-
Notifications
You must be signed in to change notification settings - Fork 29
Callback module
Работа через callback(pingback).
Решение капчи через pingback поможет ускорить получение ответа, т.к. теперь не требуется ждать и опрашивать сервер с паузами, а ответ будет получен как только решение будет готово.
В данном примере решение реализовано через уже работающий и настроенный pingback-сервер. Этот же сервер вы можете использовать для ожидания решения своей капчи. Или же по аналогии запустить данный сервис на своём собственном сервере.
Структура и принцип работы системы подробно расписан в данной схеме
Краткий пример использования pingback при решении капчи-изображения:
import requests
from python_rucaptcha import ImageCaptcha, RuCaptchaControl, CallbackClient
# Введите ключ от сервиса RuCaptcha, из своего аккаунта
RUCAPTCHA_KEY = ""
# Ссылка на изображения для расшифровки
image_link = ""
# нужно передать IP/URL ранее зарегистрированного сервера
server_ip = '85.255.8.26'
# и по желанию - порт на сервере который слушает ваше веб-приложение
server_port = 8001
# регистрация нового домена для callback/pingback
RuCaptchaControl.RuCaptchaControl(rucaptcha_key=RUCAPTCHA_KEY).additional_methods(action='add_pingback', addr=f'http://{server_ip}:{server_port}/', json=1)
# нужно придумать ЛЮБОЕ сложное название очереди(15+ знаков подойдёт)
queue_name = 'ba86e77f9007_andrei_7436e7444060657442674_cute_queue'
# регистрируем очередь на callback сервере
answer = requests.post(f'http://{server_ip}:{server_port}/register_key', json={'key':queue_name, 'vhost': 'rucaptcha_vhost'})
# если очередь зарегистрирована
if answer.text == 'OK':
# IP адрес должен быть ЗАРАНЕЕ зарегистрирован в системе (подробонсти смотри в `CaptchaTester/rucaptcha_control_example.py`)
# создаём задание на сервере, ответ на которое придёт на заданный pingback URL в виде POST запроса
task_creation_answer = ImageCaptcha.ImageCaptcha(
rucaptcha_key=RUCAPTCHA_KEY,
pingback=f'{server_ip}:{server_port}/rucaptcha/image_captcha/{queue_name}',
).captcha_handler(captcha_link=image_link)
print(task_creation_answer)
# подключаемся к серверу и ждём решения капчи из кеша
callback_server_response = CallbackClient.CallbackClient(task_id=task_creation_answer.get('id')).captcha_handler()
print(callback_server_response)
# подключаемся к серверу и ждём решения капчи из 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)
Небольшая инструкция-памятка по шагам.
Установить и запустить веб-приложение, которое будет принимать POST-запросы, парсить их, и совершать прочую, нужную вам, магию.
Пример такого сервера, написанный на aiohttp.
Все тесты можно проводить на локальном сервере, эмулируя POST-запросы от RuCaptcha при помощи локального клиента.
Примеры создания реальных заданий для callback(pingback) способа вы можете посмотреть в папке с примерами, для конкретного метода капчи.