Skip to content

Callback module

Andrei edited this page Feb 28, 2019 · 3 revisions

Callback module description

Работа через 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)

Если вы хотите запустить данный callback сервер у себя:

Небольшая инструкция-памятка по шагам.

Установить и запустить веб-приложение, которое будет принимать POST-запросы, парсить их, и совершать прочую, нужную вам, магию.

Пример такого сервера, написанный на aiohttp.

Все тесты можно проводить на локальном сервере, эмулируя POST-запросы от RuCaptcha при помощи локального клиента.

Примеры создания реальных заданий для callback(pingback) способа вы можете посмотреть в папке с примерами, для конкретного метода капчи.