Решение reCAPTCHA Enterprise с Python

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

Используйте официальный SDK для Python, чтобы запросить токен reCAPTCHA v3 Enterprise, затем отправьте solution.token с полученными идентификационными данными браузера через тот же прокси. Вам понадобятся Python 3.10 или новее, API-ключ рабочего пространства и активный профиль целевого сайта.

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

Установите SDK и настройте сайт

Установите официальный SDK для Python:

Установка SDK для Python
python -m pip install https://solvethree.com/downloads/solvethree_sdk-0.1.0-py3-none-any.whl
  1. 1.

    Создайте профиль сайта

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

  2. 2.

    Задайте SOLVETHREE_API_KEY

    В оболочке или среде развёртывания, где будет выполняться скрипт, задайте для SOLVETHREE_API_KEY API-ключ вашего рабочего пространства. Храните его на сервере, а не в браузерном коде или файле исходного кода, добавленном в репозиторий.

  3. 3.

    Задайте SOLVETHREE_PROXY

    Задайте для SOLVETHREE_PROXY URL прокси, который будет использоваться для решения и последующего запроса к приложению. В примере используется один прокси, поэтому не добавляйте proxyCandidates.

Запросите токен Enterprise

Сохраните этот пример как solve.py. Замените accounts.example.com на настроенное имя хоста — без схемы и пути, — а login на действие, используемое целевой страницей.

Python · solve.py
import os
from uuid import uuid4
from solvethree import Solvethree, SolvethreeError, TaskFailedError

client = Solvethree(os.environ["SOLVETHREE_API_KEY"])
request = {
    "site": "accounts.example.com",  # Use your configured hostname.
    "action": "login",              # Use the page's actual action.
    "proxy": os.environ["SOLVETHREE_PROXY"],
    "requestId": str(uuid4()),
}
try:
    result = client.solve(request, timeout=180)
except TaskFailedError as error:
    raise SystemExit(f"Task failed: {error.error_code}") from None
except SolvethreeError as error:
    # Keep these IDs so an interrupted request can be recovered.
    raise SystemExit(f"Recover request {error.request_id}, task {error.task_id}") from None

solution = result["solution"]
token = solution["token"]
user_agent = solution["userAgent"]
client_hints = solution["secChUa"]
print("Ready task:", result["id"])  # Do not print the token or proxy password.

По умолчанию запрос использует enterprise-v3, поэтому поле recaptchaType не требуется. Не добавляйте type или url: это не поля запроса reCAPTCHA.

Solvethree работает синхронно. client.solve создаёт задачу один раз, затем опрашивает её, пока не вернёт готовый результат или не вызовет исключение. Здесь timeout=180 ограничивает ожидание клиента 180 секундами. При успехе скрипт извлекает токен, user agent и клиентские подсказки, не выводя конфиденциальные значения.

Отправьте токен в приложение

Продолжите выполнение в том же скрипте после решения. Установите requests отдельно, как указано в примере. Замените URL входа и данные формы на фактический запрос вашего приложения, включая все необходимые учётные данные, CSRF-токен и файлы cookie сессии.

Python requests · применение готового решения
# Continue after client.solve(). Install requests separately: pip install requests.
import requests

# This example endpoint accepts the standard reCAPTCHA form field.
# Use your application's real URL, form fields, CSRF token and session.
response = requests.post(
    "https://accounts.example.com/login",
    data={"g-recaptcha-response": solution["token"]},
    headers={
        "User-Agent": solution["userAgent"],
        "sec-ch-ua": solution["secChUa"],
    },
    proxies={"http": request["proxy"], "https": request["proxy"]},
    timeout=30,
    allow_redirects=False,
)
# Inspect the application's response to determine whether it accepted the request.
print("Application HTTP status:", response.status_code)

В этом примере предполагается, что приложение принимает токен в g-recaptcha-response. Проверьте реальный запрос, а не полагайтесь на это имя поля. Если форма зависит от существующей сессии, отправляйте запрос в рамках этой сессии, а не создавайте новый запрос без файлов cookie.

Сохраните полученные userAgent и secChUa и используйте тот же прокси, который был передан для решения. Смена IP-адреса или подстановка посторонних идентификационных данных браузера может привести к сбою запроса.

Готовая задача означает, что решение сгенерировано, а не что приложение его приняло. Проверьте ответ приложения и полученную сессию: одного HTTP-статуса недостаточно, чтобы подтвердить успешный вход. Если приложение отклоняет токен, проверьте исходящий запрос, прежде чем платить за ещё одно решение: он должен содержать solution.token, а не ID задачи или старый токен. См. диагностику отклонённого токена.

Восстановите прерванное решение без создания новой задачи

В примере при каждом запуске скрипта генерируется новый requestId. Если вам нужно восстановление после перезапуска процесса, сохраните этот ID и исходный запрос перед вызовом solve. Простой повторный запуск скрипта создаёт новый логический запрос.

  • Если исключение содержит task_id, используйте get_task, чтобы возобновить опрос этой задачи. Не создавайте замену только из-за тайм-аута соединения.
  • Если создание было прервано и у вас есть только request_id, повторите идентичный запрос задачи с тем же requestId. Он вернёт существующую задачу; изменение входных данных задачи при повторном использовании ID вызывает конфликт.
  • При TaskFailedError прекратите опрос этой задачи. Перед повторной попыткой изучите её errorCode и error: ещё одно решение не исправит неизменённые некорректные входные данные. Средства за неудачные решения возвращаются.

SDK не повторяет создание задачи автоматически. При временных сбоях опроса он учитывает Retry-After в пределах срока ожидания решения. Подробнее об управлении ожиданием и восстановлением см. в разделе опрос задач и тайм-ауты.

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

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

Создать рабочее пространство
Решение reCAPTCHA Enterprise с Python · solvethree