Вызывайте solvethree из бэкенда Flask

Автор: solvethree4 мин на чтение

Используйте отдельные маршруты Flask для создания и получения задачи solvethree. Приведенный ниже POST возвращает ответ, не дожидаясь полного завершения решения; клиент сохраняет ID задачи и обращается к маршруту GET, пока задача не будет готова или не завершится ошибкой.

На этой странице

Установите зависимости и настройте целевой сайт

  1. 1.

    Используйте Python 3.10 или новее

    Установите Flask командой python -m pip install flask. Установите официальный Python SDK командой python -m pip install https://solvethree.com/downloads/solvethree_sdk-0.1.0-py3-none-any.whl.

  2. 2.

    Задайте переменные окружения сервера

    Задайте в SOLVETHREE_API_KEY API-ключ рабочего пространства, а в INTEGRATION_KEY — секрет, который ваш авторизованный клиент будет отправлять в X-Integration-Key. Укажите в CAPTCHA_SITE имя целевого хоста, а не полный URL, а в SOLVETHREE_PROXY — URL HTTP- или HTTPS-прокси для этой задачи. Храните эти значения на сервере.

  3. 3.

    Активируйте профиль сайта

    Настройте в консоли solvethree активный профиль для этого имени хоста, доступный вашему рабочему пространству. Задание CAPTCHA_SITE не создает профиль. Если целевой сайт еще не настроен, см. настройку профиля сайта.

В примере зафиксировано действие login и используется задача reCAPTCHA Enterprise v3 по умолчанию. Перед запуском измените действие так, чтобы оно соответствовало целевой операции. Клиент не может переопределить сайт, действие или прокси через тело запроса.

Добавьте маршруты создания и получения

Flask · создание и получение одной и той же задачи
# pip install flask and the official solvethree SDK wheel.
import hmac
import os
from flask import Flask, abort, jsonify, request
from solvethree import Solvethree, SolvethreeError

app = Flask(__name__)

def client():
    return Solvethree(os.environ["SOLVETHREE_API_KEY"])

@app.before_request
def authorize():
    if not hmac.compare_digest(request.headers.get("x-integration-key", ""), os.environ["INTEGRATION_KEY"]):
        abort(401)

@app.errorhandler(SolvethreeError)
def task_error(error):
    return jsonify(requestId=error.request_id, taskId=error.task_id), 502

@app.errorhandler(ValueError)
def invalid_input(error):
    return jsonify(error="Invalid task input or ID"), 400

@app.post("/captcha/tasks")
def create():
    task = {"site": os.environ["CAPTCHA_SITE"], "action": "login", "proxy": os.environ["SOLVETHREE_PROXY"]}
    if request.headers.get("x-request-id"):
        task["requestId"] = request.headers["x-request-id"]
    return jsonify(client().create_task(task, wait_ms=0, timeout=20))

@app.get("/captcha/tasks/<task_id>")
def retrieve(task_id):
    return jsonify(client().get_task(task_id, wait_ms=15000, timeout=25))

Сохраните пример как app.py. После настройки переменных окружения запустите его локально командой python -m flask --app app run. Маршруты: POST /captcha/tasks и GET /captcha/tasks/<task_id>. Flask не требует отдельного URLconf: декораторы регистрируют оба маршрута. Подробности локального запуска см. в кратком руководстве Flask; сохраните существующую конфигурацию WSGI для рабочей среды.

При создании используется wait_ms=0 с сетевым тайм-аутом 20 секунд. Это отключает ожидание решения, но не самого HTTP-запроса. При получении допускается ожидание обновления задачи до 15 секунд с сетевым тайм-аутом 25 секунд. Оба обработчика используют синхронный SDK, поэтому каждый занимает свой рабочий процесс обработки запросов на время выполнения вызова SDK.

Сохраните ID запроса перед отправкой POST

  1. 1.

    Создавайте один ID запроса на каждую логическую задачу

    Сохраните его перед вызовом POST /captcha/tasks, затем передайте в X-Request-ID вместе с X-Integration-Key. Используйте 1–64 ASCII-буквы, цифры, символы подчёркивания или дефисы. Тело задачи для этого POST не требуется: сервер формирует задачу на основе своей фиксированной конфигурации.

  2. 2.

    Сохраните возвращённый идентификатор задачи

    После успешного HTTP-ответа сохраните id из результата. Получайте задачу через GET /captcha/tasks/<task_id>, снова передавая X-Integration-Key.

  3. 3.

    Восстановите результат создания с неизвестным исходом вместо создания новой задачи

    Если время ожидания соединения POST истекло, задача всё же могла быть создана. Получите задачу, если знаете её ID. В противном случае повторите POST с тем же X-Request-ID и неизменными входными данными задачи, чтобы восстановить доступ к существующей задаче. Повторное использование ID после изменения сайта, действия или прокси вызывает конфликт.

В примере этот заголовок необязателен, но без него восстановление невозможно, если задача создана, а ответ потерян. Не генерируйте новый ID только потому, что время ожидания первого запроса истекло.

Обрабатывайте HTTP-ошибки до проверки статуса задачи

Сначала проверьте HTTP-статус ответа Flask. Пример возвращает 401 при отсутствующем или неверном ключе интеграции, 400 при перехваченном ValueError и 502 при перехваченном SolvethreeError. Тело ответа 502 содержит requestId и taskId для восстановления; это не данные статуса задачи, и само по себе оно не означает, что задача завершилась с ошибкой.

После успешного HTTP-ответа проверьте статус задачи.
После успешного HTTP-ответа проверьте статус задачи.
Статус задачиДействие клиента
в ожиданииСохраните тот же ID задачи и запросите её снова.
решаетсяСохраните тот же ID задачи и запросите её снова.
готовоПрекратите опрос и прочитайте решение.
failedПрекратите опрос и проверьте errorCode и error. За неудачные решения средства возвращаются.

Отправьте токен с исходным прокси и возвращенными идентификационными данными

Только результат со статусом ready содержит пригодное к использованию решение. Отправьте solution.token целевому ресурсу, а не ID задачи, и используйте возвращённые параметры идентификации браузера solution.userAgent и solution.secChUa.

Отправляйте запрос через тот же прокси, который использовался при создании задачи. В этом примере используется один фиксированный SOLVETHREE_PROXY, поэтому сохраняйте исходную конфигурацию прокси вместе с задачей, не рассчитывая на то, что текущее значение переменной окружения останется прежним. Маршруты Flask возвращают результат SDK; они не отправляют запрос целевому ресурсу и не настраивают прокси вызывающей стороны.

Храните токен, прокси, параметры идентификации браузера и целевой ресурс вместе. Готовая задача означает, что solvethree сгенерировал решение; будет ли оно принято, определяется ответом целевого ресурса на последующий запрос приложения.

Запустите первую задачу.

Начните с $5 на балансе рабочего пространства.

Создать рабочее пространство
Вызывайте solvethree из бэкенда Flask · solvethree