Mantenha os cookies da aplicação ao enviar um token resolvido
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_URLcomo 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_PROXYcomo o único proxy usado para a resolução e para as duas requisições à aplicação. - Defina
SOLVETHREE_API_KEYcomo a chave de API do seu espaço de trabalho. Execute este código no servidor.
# 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.
Fontes e referência da API
Execute sua primeira tarefa.
Comece com $5 em créditos no espaço de trabalho.