Решение reCAPTCHA Enterprise с Python
Используйте официальный SDK для Python, чтобы запросить токен reCAPTCHA v3 Enterprise, затем отправьте solution.token с полученными идентификационными данными браузера через тот же прокси. Вам понадобятся Python 3.10 или новее, API-ключ рабочего пространства и активный профиль целевого сайта.
На этой странице
Установите SDK и настройте сайт
Установите официальный SDK для Python:
python -m pip install https://solvethree.com/downloads/solvethree_sdk-0.1.0-py3-none-any.whl- 1.
Создайте профиль сайта
Настройте целевое имя хоста в консоли solvethree и убедитесь, что его профиль активен и доступен вашему рабочему пространству. Передача имени хоста в запросе на решение не создаёт профиль. Если профиль ещё не настроен, см. настройку профиля сайта.
- 2.
Задайте SOLVETHREE_API_KEY
В оболочке или среде развёртывания, где будет выполняться скрипт, задайте для
SOLVETHREE_API_KEYAPI-ключ вашего рабочего пространства. Храните его на сервере, а не в браузерном коде или файле исходного кода, добавленном в репозиторий. - 3.
Задайте SOLVETHREE_PROXY
Задайте для
SOLVETHREE_PROXYURL прокси, который будет использоваться для решения и последующего запроса к приложению. В примере используется один прокси, поэтому не добавляйтеproxyCandidates.
Запросите токен Enterprise
Сохраните этот пример как solve.py. Замените accounts.example.com на настроенное имя хоста — без схемы и пути, — а login на действие, используемое целевой страницей.
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 сессии.
# 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 в пределах срока ожидания решения. Подробнее об управлении ожиданием и восстановлением см. в разделе опрос задач и тайм-ауты.
Источники и справочник API
Запустите первую задачу.
Начните с $5 на балансе рабочего пространства.