Вызывайте solvethree из бэкенда Flask
Используйте отдельные маршруты Flask для создания и получения задачи solvethree. Приведенный ниже POST возвращает ответ, не дожидаясь полного завершения решения; клиент сохраняет ID задачи и обращается к маршруту GET, пока задача не будет готова или не завершится ошибкой.
На этой странице
Установите зависимости и настройте целевой сайт
- 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.
Задайте переменные окружения сервера
Задайте в
SOLVETHREE_API_KEYAPI-ключ рабочего пространства, а вINTEGRATION_KEY— секрет, который ваш авторизованный клиент будет отправлять вX-Integration-Key. Укажите вCAPTCHA_SITEимя целевого хоста, а не полный URL, а вSOLVETHREE_PROXY— URL HTTP- или HTTPS-прокси для этой задачи. Храните эти значения на сервере. - 3.
Активируйте профиль сайта
Настройте в консоли solvethree активный профиль для этого имени хоста, доступный вашему рабочему пространству. Задание
CAPTCHA_SITEне создает профиль. Если целевой сайт еще не настроен, см. настройку профиля сайта.
В примере зафиксировано действие login и используется задача reCAPTCHA Enterprise v3 по умолчанию. Перед запуском измените действие так, чтобы оно соответствовало целевой операции. Клиент не может переопределить сайт, действие или прокси через тело запроса.
Добавьте маршруты создания и получения
# 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.
Создавайте один ID запроса на каждую логическую задачу
Сохраните его перед вызовом
POST /captcha/tasks, затем передайте вX-Request-IDвместе сX-Integration-Key. Используйте 1–64 ASCII-буквы, цифры, символы подчёркивания или дефисы. Тело задачи для этого POST не требуется: сервер формирует задачу на основе своей фиксированной конфигурации. - 2.
Сохраните возвращённый идентификатор задачи
После успешного HTTP-ответа сохраните
idиз результата. Получайте задачу черезGET /captcha/tasks/<task_id>, снова передаваяX-Integration-Key. - 3.
Восстановите результат создания с неизвестным исходом вместо создания новой задачи
Если время ожидания соединения POST истекло, задача всё же могла быть создана. Получите задачу, если знаете её ID. В противном случае повторите POST с тем же
X-Request-IDи неизменными входными данными задачи, чтобы восстановить доступ к существующей задаче. Повторное использование ID после изменения сайта, действия или прокси вызывает конфликт.
В примере этот заголовок необязателен, но без него восстановление невозможно, если задача создана, а ответ потерян. Не генерируйте новый ID только потому, что время ожидания первого запроса истекло.
Обрабатывайте HTTP-ошибки до проверки статуса задачи
Сначала проверьте HTTP-статус ответа Flask. Пример возвращает 401 при отсутствующем или неверном ключе интеграции, 400 при перехваченном ValueError и 502 при перехваченном SolvethreeError. Тело ответа 502 содержит requestId и taskId для восстановления; это не данные статуса задачи, и само по себе оно не означает, что задача завершилась с ошибкой.
| Статус задачи | Действие клиента |
|---|---|
| в ожидании | Сохраните тот же ID задачи и запросите её снова. |
| решается | Сохраните тот же ID задачи и запросите её снова. |
| готово | Прекратите опрос и прочитайте решение. |
| failed | Прекратите опрос и проверьте errorCode и error. За неудачные решения средства возвращаются. |
Отправьте токен с исходным прокси и возвращенными идентификационными данными
Только результат со статусом ready содержит пригодное к использованию решение. Отправьте solution.token целевому ресурсу, а не ID задачи, и используйте возвращённые параметры идентификации браузера solution.userAgent и solution.secChUa.
Отправляйте запрос через тот же прокси, который использовался при создании задачи. В этом примере используется один фиксированный SOLVETHREE_PROXY, поэтому сохраняйте исходную конфигурацию прокси вместе с задачей, не рассчитывая на то, что текущее значение переменной окружения останется прежним. Маршруты Flask возвращают результат SDK; они не отправляют запрос целевому ресурсу и не настраивают прокси вызывающей стороны.
Храните токен, прокси, параметры идентификации браузера и целевой ресурс вместе. Готовая задача означает, что solvethree сгенерировал решение; будет ли оно принято, определяется ответом целевого ресурса на последующий запрос приложения.
Источники и справочник API
Запустите первую задачу.
Начните с $5 на балансе рабочего пространства.