Сохранение cookie приложения при отправке готового токена

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

Полученный токен reCAPTCHA не заменяет сессионные cookie приложения или значение CSRF. Получайте и отправляйте форму через один и тот же requests.Session, чтобы POST сохранял cookie, полученные при GET.

Для обоих запросов к приложению используйте возвращённые сервисом решения заголовки браузера и один и тот же прокси. В примере сначала решается CAPTCHA, чтобы эти заголовки были доступны до открытия формы.

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

Выполняйте GET и POST формы в одной сессии

Используйте Python 3.10+ с установленными requests и официальным Python SDK solvethree. Для имени хоста целевого сайта нужен активный профиль в вашем рабочем пространстве; передача имени хоста в задаче не создаёт профиль. Если он ещё не настроен, см. настройку профиля сайта.

  • Задайте в TARGET_URL URL формы вашего приложения. В этом демонстрационном примере на подконтрольном сайте для GET и POST используется один URL.
  • Задайте в SOLVETHREE_PROXY единственный прокси, используемый для решения и обоих запросов к приложению.
  • Задайте в SOLVETHREE_API_KEY API-ключ вашего рабочего пространства. Выполняйте этот код на сервере.
requests.Session · сохранение cookie приложения и значения CSRF
# 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 не предоставляет учётные данные или другие отсутствующие поля приложения.

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

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

Создать рабочее пространство
Сохранение cookie приложения при отправке готового токена · solvethree