Mantenha os cookies da aplicação ao enviar um token resolvido

Por solvethree4 min de leitura

Um token de reCAPTCHA resolvido não substitui os cookies de sessão nem o valor CSRF da aplicação. Busque e envie o formulário pela mesma requests.Session para que o POST mantenha os cookies recebidos durante o GET.

Use os cabeçalhos de navegador retornados pelo serviço de resolução e o mesmo proxy nas duas requisições à aplicação. O exemplo resolve primeiro para que esses cabeçalhos estejam disponíveis antes de abrir o formulário.

Nesta página

Mantenha o GET e o POST do formulário em uma única sessão

Use Python 3.10+ com requests e o SDK Python oficial da solvethree instalados. O hostname de destino precisa de um perfil ativo no seu espaço de trabalho; enviar o hostname em uma tarefa não cria um perfil. Consulte a configuração de perfil de site se ele não estiver configurado.

  • Defina TARGET_URL como a URL do formulário da sua aplicação. Esta demonstração em ambiente próprio usa a mesma URL para o GET e o POST.
  • Defina SOLVETHREE_PROXY como o único proxy usado para a resolução e para as duas requisições à aplicação.
  • Defina SOLVETHREE_API_KEY como a chave de API do seu espaço de trabalho. Execute este código no servidor.
requests.Session · manter os cookies da aplicação e um valor 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.

A chamada solve do SDK cria a tarefa e consulta seu status até que ela esteja pronta ou uma exceção seja lançada. Em seguida, o exemplo aplica solution.userAgent e solution.secChUa à sessão. O GET preenche o armazenamento de cookies; o POST reutiliza esse armazenamento e envia solution.token junto com o valor CSRF extraído do formulário.

Altere a ação login, a URL de envio e os campos do formulário da demonstração para corresponderem à sua aplicação. csrf_token é o nome do campo deste formulário, não uma exigência da solvethree. Ajuste o parser HTML se o seu formulário usar outro nome ou estrutura e inclua quaisquer outros campos obrigatórios, como credenciais de login. Se a URL de envio for diferente da URL do formulário, continue usando a mesma sessão.

Se a aplicação rejeitar o POST

O status HTTP exibido é um ponto de partida, não uma prova de que o login foi concluído. Inspecione a resposta da aplicação e a requisição enviada antes de pagar por outra resolução. Uma tarefa pronta significa que uma solução foi gerada; a aplicação ainda decide se aceita o envio.

O campo CSRF não é encontrado.

Verifique o status e o corpo da resposta ao GET. O seguimento de redirecionamentos está desativado, portanto uma resposta de redirecionamento não é o formulário esperado.

Experimente: Busque explicitamente o formulário correto pela mesma sessão e ajuste o parser ao campo CSRF real dele.

A aplicação informa que a sessão está ausente ou que o valor CSRF é inválido.

Verifique se o GET recebeu cookies, se o POST enviou os cookies aplicáveis e se o valor CSRF veio da resposta daquele formulário.

Experimente: Mantenha as duas requisições na mesma requests.Session. Não busque o formulário com um cliente e o envie com outro.

A aplicação rejeita o CAPTCHA.

Inspecione o campo de token enviado, a ação, o proxy, User-Agent e sec-ch-ua. Confirme que está enviando solution.token, e não o ID da tarefa ou um token antigo.

Experimente: Use o token atual, o mesmo proxy usado na resolução e os cabeçalhos de navegador retornados. Se o token expirou ou já foi avaliado, obtenha um novo perto do momento do envio.

O POST é concluído, mas o login não.

Inspecione o corpo da resposta e qualquer destino de redirecionamento, além da URL de envio efetivamente usada e dos campos obrigatórios do formulário.

Experimente: Adapte os dados do formulário da demonstração ao contrato da aplicação. Um token de CAPTCHA não fornece credenciais nem outros campos ausentes da aplicação.

Execute sua primeira tarefa.

Comece com $5 em créditos no espaço de trabalho.

Criar um espaço de trabalho
Mantenha os cookies da aplicação ao enviar um token resolvido · solvethree