Сохранение cookie приложения при отправке готового токена
Полученный токен reCAPTCHA не заменяет сессионные cookie приложения или значение CSRF. Получайте и отправляйте форму через один и тот же requests.Session, чтобы POST сохранял cookie, полученные при GET.
Для обоих запросов к приложению используйте возвращённые сервисом решения заголовки браузера и один и тот же прокси. В примере сначала решается CAPTCHA, чтобы эти заголовки были доступны до открытия формы.
На этой странице
Выполняйте GET и POST формы в одной сессии
Используйте Python 3.10+ с установленными requests и официальным Python SDK solvethree. Для имени хоста целевого сайта нужен активный профиль в вашем рабочем пространстве; передача имени хоста в задаче не создаёт профиль. Если он ещё не настроен, см. настройку профиля сайта.
- Задайте в
TARGET_URLURL формы вашего приложения. В этом демонстрационном примере на подконтрольном сайте для GET и POST используется один URL. - Задайте в
SOLVETHREE_PROXYединственный прокси, используемый для решения и обоих запросов к приложению. - Задайте в
SOLVETHREE_API_KEYAPI-ключ вашего рабочего пространства. Выполняйте этот код на сервере.
# This owned demo form has an input named csrf_token and g-recaptcha-response.
import os
from html.parser import HTMLParser
from urllib.parse import urlsplit
import requests
from solvethree import Solvethree
class FormParser(HTMLParser):
csrf = None
def handle_starttag(self, tag, attributes):
values = dict(attributes)
if tag == "input" and values.get("name") == "csrf_token":
self.csrf = values.get("value")
target = os.environ["TARGET_URL"]
proxy = os.environ["SOLVETHREE_PROXY"]
request = {"site": urlsplit(target).hostname, "action": "login", "proxy": proxy}
# Obtain the solver's browser headers before opening the application session.
result = Solvethree(os.environ["SOLVETHREE_API_KEY"]).solve(request, timeout=180)
solution = result["solution"]
with requests.Session() as session:
session.headers.update({"User-Agent": solution["userAgent"], "sec-ch-ua": solution["secChUa"]})
proxies = {"http": proxy, "https": proxy}
page = session.get(target, proxies=proxies, timeout=20, allow_redirects=False)
page.raise_for_status()
parser = FormParser(); parser.feed(page.text)
if not parser.csrf: raise RuntimeError("The expected demo CSRF input was not found")
response = session.post(target, proxies=proxies, timeout=20, allow_redirects=False,
data={"csrf_token": parser.csrf, "g-recaptcha-response": solution["token"]})
print("Application HTTP status:", response.status_code)
# Use the actual form's submit URL, fields and session rules. Inspect its result.Вызов solve в SDK создаёт задачу и опрашивает её, пока она не будет готова либо не возникнет исключение. Затем пример применяет к сессии solution.userAgent и solution.secChUa. GET заполняет её хранилище cookie; POST повторно использует это хранилище и отправляет solution.token вместе со значением CSRF, извлечённым из формы.
Измените действие login, URL отправки и поля формы в примере в соответствии с вашим приложением. csrf_token — имя поля этой формы, а не требование solvethree. Если у вас другое имя или структура, скорректируйте HTML-парсер и добавьте остальные обязательные поля, например учётные данные для входа. Если URL отправки отличается от URL формы, всё равно используйте одну сессию.
Если приложение отклоняет POST
Выведенный HTTP-статус — отправная точка, а не доказательство успешного входа. Прежде чем оплачивать ещё одно решение, изучите ответ приложения и исходящий запрос. Готовая задача означает, что решение сгенерировано; принимать ли отправленные данные, по-прежнему решает приложение.
- Поле CSRF не найдено.
Проверьте статус и тело ответа GET. Переход по перенаправлениям отключён, поэтому ответ с перенаправлением не является ожидаемой формой.
Попробуйте: Явно загрузите нужную форму через ту же сессию, затем настройте парсер под её фактическое поле CSRF.
- Приложение сообщает об отсутствии сессии или некорректном значении CSRF.
Проверьте, получил ли GET cookie, отправил ли POST подходящие cookie и было ли его значение CSRF взято из ответа с этой формой.
Попробуйте: Выполняйте оба запроса в одном requests.Session. Не загружайте форму одним клиентом, чтобы затем отправить её другим.
- Приложение отклоняет CAPTCHA.
Проверьте отправляемое поле токена, действие, прокси, User-Agent и sec-ch-ua. Убедитесь, что отправляете solution.token, а не ID задачи или старый токен.
Попробуйте: Используйте текущий токен, тот же прокси, который использовался для решения, и возвращённые заголовки браузера. Если токен истёк или уже был проверен, получите новый непосредственно перед отправкой.
- POST завершается, но вход не выполняется.
Проверьте тело ответа и адрес перенаправления, если оно есть, а также фактический URL отправки и обязательные поля формы.
Попробуйте: Адаптируйте данные формы из примера к требованиям приложения. Токен CAPTCHA не предоставляет учётные данные или другие отсутствующие поля приложения.
Источники и справочник API
Запустите первую задачу.
Начните с $5 на балансе рабочего пространства.