Você enviou um CAPTCHA Turnstile para CaptchaAI, recebeu um token de volta, mas o site de destino o rejeitou. O token está tecnicamente resolvido – o problema é como ou quando você o usa. Este guia cobre todos os motivos pelos quais os tokens da catraca falham após a resolução.
Sintomas
| O que você vê | Causa provável |
|---|---|
| Site retorna 403 após enviar token | O token expirou antes do envio |
| O envio do formulário falha silenciosamente | Nome de campo incorreto para envio controlado ao endpoint QA |
| Token aceito, mas ação bloqueada | Incompatibilidade de Sitekey – widget errado resolvido |
| Funciona uma vez e depois falha | Token já utilizado (uso único) |
| Funciona no navegador, falha no script | Cookies ou cabeçalhos ausentes |
Causa 1: token expirou
Os tokens da catraca expiram rapidamente – normalmente em 300 segundos (5 minutos). Se o seu código demorar muito entre o recebimento do token e o envio, o token estará morto.
Correção: Envie o token imediatamente após recebê-lo.
import requests
import time
API_KEY = "YOUR_API_KEY"
# Submit Turnstile task
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "turnstile",
"sitekey": "0x4AAAAAAADnPIDROz1234",
"pageurl": "https://staging.example.com/qa-login",
"json": 1
}).json()
task_id = submit["request"]
time.sleep(10)
# Poll for result
for _ in range(24):
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
token = result["request"]
# USE TOKEN IMMEDIATELY — do not delay
response = requests.post("https://staging.example.com/qa-login", data={
"username": "user",
"password": "pass",
"cf-turnstile-response": token
})
break
time.sleep(5)
Causa 2: chave do site errada
Cada widget Turnstile possui uma chave de site exclusiva. Se a página tiver vários widgets ou você copiou a chave errada, o token será válido, mas rejeitado.
Como encontrar a chave do site correta:
// In browser console on the target page
document.querySelectorAll('[data-sitekey]').forEach(el => {
console.log('Sitekey:', el.getAttribute('data-sitekey'));
console.log('Element:', el);
});
Se houver várias chaves de site, use aquela anexada ao formulário que você está enviando.
Causa 3: nome de campo incorreto
Turnstile espera o token em cf-turnstile-response, não em g-recaptcha-response.
# WRONG — this is for reCAPTCHA
data = {"g-recaptcha-response": token}
# CORRECT — this is for Turnstile
data = {"cf-turnstile-response": token}
Alguns sites usam um nome de campo personalizado. Inspecione o formulário para encontrar o campo real:
// Check what field the Turnstile widget populates
document.querySelector('[name*="turnstile"], [name*="cf-"]')
Causa 4: Token já utilizado
Os tokens da catraca são descartáveis. Se o seu código tentar novamente uma solicitação com o mesmo token, a segunda tentativa falhará.
Correção: Resolva um novo CAPTCHA para cada tentativa de envio.
Causa 5: Cookies ou contexto de sessão ausentes
A Cloudflare pode validar o token em relação aos cookies de sessão. Se você resolver o CAPTCHA em uma sessão e enviar em outra, é provável que haja rejeição.
# Use the SAME session for page load and token submission
session = requests.Session()
# Load the page first to establish cookies
session.get("https://staging.example.com/qa-login")
# Then solve and submit using the same session
token = solve_turnstile(sitekey, pageurl)
session.post("https://staging.example.com/qa-login", data={
"cf-turnstile-response": token
})
Causa 6: Ação ou incompatibilidade de cData
Algumas implementações do Turnstile incluem parâmetros action ou cData vinculados ao token. Se o site espera isso, você deve passá-los ao resolver.
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "turnstile",
"sitekey": "0x4AAAAAAADnPIDROz1234",
"pageurl": "https://staging.example.com/qa-login",
"action": "login", # If required by the site
"data": "custom_cdata_value", # If required by the site
"json": 1
}).json()
Árvore de decisão
Token solved but rejected
↓
Used within 5 minutes? → No → Solve again, submit immediately
↓ Yes
Correct sitekey? → No → Find the correct sitekey from the page
↓ Yes
Using cf-turnstile-response field? → No → Change field name
↓ Yes
Same session for page load + submit? → No → Use session persistence
↓ Yes
Token used only once? → No → Solve a new token per submission
↓ Yes
Site requires action/cData? → Check page source, add to API call
Perguntas frequentes
Quanto tempo duram os tokens da Cloudflare Turnstile?
Normalmente 300 segundos (5 minutos). Algumas implementações definem uma expiração mais curta. Envie o token segundos após recebê-lo.
Cloudflare Turnstile é igual a Cloudflare Turnstile em staging?
Não. O Turnstile é um widget incorporado (como o reCAPTCHA). Cloudflare Turnstile em staging é um intersticial de página inteira. Eles usam métodos CaptchaAI diferentes: turnstile vs turnstile_staging.
Por que meu token funciona no Postman, mas não no meu script?
O Postman pode estar enviando cabeçalhos ou cookies diferentes. Combine os cabeçalhos do seu script e o estado da sessão com o que o navegador envia.
Resolva CAPTCHAs de catraca em CaptchaAI
Obtenha uma solução confiável de catraca emcaptchaai.com.