Comparisons

Solução de CAPTCHA baseada em token vs. baseada em cookies

Quem decide o formato é o site, não o seu código: se a verificação vive dentro do formulário, a resolução termina em token — uma string de uso único enviada junto com os campos. Se ela bloqueia a página antes do conteúdo, termina em cookie — uma sessão validada que serve às requisições seguintes.

O formato define se um navegador entra no caminho crítico, quantas resoluções o fluxo consome por minuto e quantas threads ficam ocupadas — e explica a maioria dos 403 que aparecem após uma resolução bem-sucedida.


Como saber em qual formato você está

Abra a página com o DevTools e observe quando a verificação aparece:

  • Dentro do formulário, ao lado do botão de envio → token: reCAPTCHA v2, reCAPTCHA v3 e Cloudflare Turnstile.
  • Antes de qualquer conteúdo, em uma página intermediária que recarrega sozinha → cookie: páginas de desafio da Cloudflare, desafio JS e alguns WAFs.
  • 403 mesmo com um token recém-resolvido → provavelmente os dois formatos convivem na mesma jornada.

Regra prática: o token acompanha um envio; o cookie acompanha uma sessão.


Aspecto Baseado em token Baseado em cookies
Saída String longa (500+ caracteres) Cookie de navegador (cookie_qa_validacao)
Onde aparece reCAPTCHA v2/v3, Turnstile Páginas de desafio da Cloudflare, desafio JS, WAFs
Validade 60 a 120 segundos 30 minutos a 24 horas
Reutilizável Não, uso único Sim, enquanto a sessão durar
Navegador Só para extrair a sitekey Necessário para resolver
Vínculo de rede Vale a partir de qualquer IP Preso ao IP e ao User-Agent

Segundo as páginas públicas da CaptchaAI, o Turnstile é resolvido em menos de 10 s, o reCAPTCHA v2 em menos de 60 s e imagem/OCR em menos de 0,5 s.


Fluxo por token: uma string nova a cada envio

São cinco passos, e nenhum exige navegador na hora do envio: extraia a sitekey (chave pública do widget), envie sitekey e URL para a API, receba o token, preencha o campo oculto e faça o POST.

Desafio Onde o token entra
reCAPTCHA v2 textarea g-recaptcha-response
reCAPTCHA v3 mesmo campo, com action e o score mínimo do site
Cloudflare Turnstile campo cf-turnstile-response

O hCaptcha usa h-captcha-response, mas a CaptchaAI não resolve hCaptcha nem FunCaptcha (Arkose Labs).

Resolver e enviar em Python

import requests
import time

API_KEY = "YOUR_API_KEY"

# 1. Solve
resp = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY,
    "method": "userrecaptcha",
    "googlekey": "6Le-wvkSAAAAAPBMR...",
    "pageurl": "https://staging.example.com/qa-login",
    "json": "1",
}).json()
task_id = resp["request"]

# 2. Poll
token = None
for _ in range(24):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": API_KEY, "action": "get", "id": task_id, "json": "1"
    }).json()
    if result["status"] == 1:
        token = result["request"]
        break

# 3. Submit form with token (no browser needed)
form_response = requests.post("https://staging.example.com/qa-login", data={
    "email": "[email protected]",
    "password": "password",
    "g-recaptcha-response": token,
})

O que isso muda na operação

  • Vida curta: a janela é de 60 a 120 segundos — resolva e use em seguida
  • Uso único: cada token vale um envio; outro formulário exige outra resolução
  • Sem navegador no envio: o POST sai de uma requisição HTTP comum, o que deixa o worker leve

Aqui a lógica se inverte: você paga o custo uma vez, na entrada, e depois navega com requisições HTTP comuns.

  1. A página de desafio aparece antes do conteúdo
  2. Um navegador completo conclui a verificação
  3. O servidor grava um cookie de sessão (cookie_qa_validacao)
  4. As requisições seguintes que carregam esse cookie passam direto
from selenium import webdriver
import requests
import time

# 1. Solve the challenge in a browser
driver = webdriver.Chrome()
driver.get("https://example.com/protected")

# Wait for challenge to complete (manually or with CaptchaAI)
time.sleep(10)  # Or use CaptchaAI envio controlado ao endpoint QA

# 2. Extract cookies from browser
cookies = driver.get_cookies()
cookie_qa_validacao = next(
    (c for c in cookies if c["name"] == "cookie_qa_validacao"), None
)
user_agent = driver.execute_script("return navigator.userAgent")
driver.quit()

# 3. Use cookies for subsequent requests (no browser needed)
session = requests.Session()
session.headers.update({"User-Agent": user_agent})

for cookie in cookies:
    session.cookies.set(cookie["name"], cookie["value"])

# All requests now pass the challenge
for page in range(1, 50):
    resp = session.get(f"https://example.com/api/data?page={page}")
    print(f"Page {page}: {resp.status_code}")

Limites que costumam pegar as equipes de surpresa

Limite Como conviver com ele
Navegador na resolução O desafio precisa de um ambiente completo
Cookie preso ao IP Use o mesmo egress autorizado do começo ao fim
Cookie preso ao User-Agent Reenvie o cabeçalho capturado no navegador
Vida de 30 min a 24 h Renove antes de expirar, não a cada requisição

Cenário comum em times brasileiros: o worker roda em São Paulo (sa-east-1), consulta o catálogo da própria empresa em staging e encontra os dois formatos — desafio na entrada (cookie) e formulário com reCAPTCHA (token).

# Step 1: Get past Cloudflare (cookie)
session = get_cookie_qa_validacao_session("https://example.com")

# Step 2: Load the form (using the cookie session)
html = session.get("https://example.com/submit").text
sitekey = extract_sitekey(html)

# Step 3: Solve reCAPTCHA (token)
token = solve_recaptcha(sitekey, "https://example.com/submit")

# Step 4: Submit form (cookie + token)
resp = session.post("https://example.com/submit", data={
    "data": "value",
    "g-recaptcha-response": token,
})

Mantenha o worker no mesmo egress autorizado do começo ao fim: trocar de região no meio do lote invalida o cookie. Se o fluxo tocar dados pessoais, considere as obrigações da LGPD (RGPD, em Portugal) antes de gravar payloads inteiros em log.


Custo: o que cada formato consome do plano

A CaptchaAI cobra por thread simultânea, não por resolução: cada plano inclui resoluções ilimitadas dentro das threads contratadas, de BASIC (US$ 15/mês, 5 threads) a ADVANCE (US$ 90/mês, 50 threads).

Um fluxo por token ocupa uma thread a cada envio, então a conta acompanha os envios por minuto. Um fluxo por cookie ocupa a thread uma vez e depois só dispara requisições comuns — o gargalo passa a ser o tempo de vida do cookie.


Perguntas frequentes

O token expira antes do envio. Como evitar?

Resolva o mais tarde possível no fluxo. Se o formulário tem várias etapas, deixe a chamada à API para a última: a janela útil é de 60 a 120 segundos e validações locais demoradas consomem metade dela.

Dá para reaproveitar o mesmo token em outro formulário?

Não. O token é de uso único: assim que o site o manda para verificação, ele queima. Reaproveitar produz o mesmo erro de um token expirado — resolva de novo a cada envio.

Porque ele está preso ao IP e ao User-Agent que resolveram o desafio. Mantenha o mesmo cabeçalho User-Agent capturado do navegador e o mesmo egress de rede autorizado durante todo o lote.

E se o formulário usar hCaptcha ou FunCaptcha?

Nenhum dos dois é suportado hoje, e o GeeTest v4 segue apenas anunciado como em breve. A cobertura atual inclui reCAPTCHA v2/v3 e Enterprise, Turnstile e Challenge da Cloudflare, GeeTest v3, imagem/OCR, grade de imagens e BLS, além de CaptchaFox (beta), Friendly Captcha (beta) e Lemin (beta).


Rode os dois formatos na sua própria stack

Pegue sua chave de API em captchaai.com, rode um envio por token e um por cookie no seu ambiente de QA e compare os tempos.


Guias relacionados

Os comentários estão desativados para este artigo.