Explainers

Como funciona o desafio Cloudflare

Você clica em um link e, antes do conteúdo aparecer, vê "Verificando seu navegador antes de continuar..." Isso é o desafio de página inteira da Cloudflare — não confunda com o Turnstile, o widget pequeno embutido na página. Aqui, a página inteira fica bloqueada até o navegador provar que não é automatizado.

Depois de aprovado, a Cloudflare grava um cookie de sessão (cookie_qa_validacao) que libera as requisições seguintes. Sem esse cookie — ou fora do contexto em que foi emitido — cada nova requisição volta a cair no mesmo desafio.


Desafio de página inteira vs Turnstile vs verificação silenciosa

Característica Desafio de página inteira Turnstile Verificação JS silenciosa
Tipo Interstitial de página inteira Widget na página Verificação em segundo plano
O que o visitante vê Página "Verificando seu navegador" Caixa de seleção ou nada Nada
Bloqueia o acesso à página Sim Não Rapidamente
Grava cookie de verificação Sim Às vezes Sim
Exige proxy para resolver via API Sim Não N/A
Depende da CDN da Cloudflare Sim, obrigatório Opcional Sim, obrigatório

O que aciona o desafio da Cloudflare

Gatilho O que costuma acontecer
IP de datacenter Requisição de provedor de hospedagem conhecido, não de IP residencial
Cabeçalhos ausentes Cabeçalhos HTTP fora do padrão de um navegador real
Sinal de navegador (TLS) JA3/JA4 combina com assinaturas de bot catalogadas
Taxa de requisição alta Muitas requisições do mesmo IP em pouco tempo
Nível de segurança do site Proprietário define o limite do desafio como alto
Regras por país Bloqueio geográfico ou regra de desafio configurada
Pontuação de bot Modelo de ML da Cloudflare atribui pontuação baixa
Lista de ameaças conhecida IP aparece em lista de inteligência de ameaças

Como o navegador passa pelo desafio

Request → Cloudflare proxy → Suspicious? → Challenge page
                                              ↓
                                    Browser verification
                                              ↓
                                    cookie_qa_validacao cookie set
                                              ↓
                                    Original page loads

Disparado o gatilho, o fluxo segue seis etapas:

  1. Requisição interceptada — o proxy reverso da Cloudflare avalia a requisição antes de chegar à origem
  2. Avaliação de risco — reputação de IP, cabeçalhos, sinal de navegador (TLS) e comportamento entram na pontuação
  3. Página de verificação exibida — se o risco for alto, a Cloudflare substitui a resposta original
  4. Verificação executada no navegador — scripts confirmam que existe um navegador real por trás da requisição
  5. Cookie de sessão definido — aprovado o desafio, a Cloudflare grava cookie_qa_validacao com um TTL configurável
  6. Acesso liberado — o navegador recarrega e recebe o conteúdo original

Depois que o desafio é aprovado, o navegador recebe:

cookie_qa_validacao=abc123...; path=/; domain=.example.com; secure; HttpOnly; SameSite=None

Propriedades principais:

  • Duração: de 15 minutos a 24 horas, definida pelo proprietário do site
  • Escopo: vale só para o domínio específico onde foi emitido
  • Vínculo: preso ao User-Agent e ao endereço IP usados durante a verificação
  • Uso: precisa acompanhar todas as requisições seguintes, ou o desafio volta a aparecer

Atenção: o cookie cookie_qa_validacao está vinculado ao User-Agent e ao endereço IP específicos usados na verificação. Mudar qualquer um dos dois invalida o cookie na hora.


Por que a automação via API exige proxy

A CaptchaAI resolve esse desafio, mas a resolução só funciona com proxy, porque o cookie de verificação está amarrado a três sinais:

  • Endereço IP — usado na resolução
  • User-Agent — precisa ser idêntico ao das requisições seguintes
  • Handshake TLS — verificado em algumas configurações

Mudou qualquer um deles entre a resolução e a requisição seguinte, o cookie perde a validade.

Erro comum em QA autorizado no Brasil: usar proxy fora da região do resto do tráfego — por exemplo, workers em sa-east-1 resolvendo com proxy de outro continente. A diferença de latência já basta para acionar um novo desafio.

Boa prática: IP e User-Agent registrados nesse fluxo seguem a mesma política de retenção de logs dos demais dados de acesso — considere a LGPD.


Como resolver esse desafio com a API da CaptchaAI

Os exemplos enviam a tarefa com proxy obrigatório e fazem o polling do resultado — aqui o proxy não é opcional.

Python

A chamada de envio, seguida do polling em loop:

import requests
import time

API_KEY = "YOUR_API_KEY"

# Submit task — proxy is REQUIRED
response = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": API_KEY,
    "method": "turnstile_staging",
    "pageurl": "https://example.com/protected-page",
    "proxy": "username:password@proxy.example.com:8080",
    "proxytype": "HTTP",
    "json": 1
})

task_id = response.json()["request"]

# Poll for result
for _ in range(60):
    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.get("status") == 1:
        solution = result["request"]
        # solution contains cookie_qa_validacao cookie + user_agent
        print(f"cookie_qa_validacao: {solution}")
        break

Node.js

Equivalente em Node.js, com async/await:

const axios = require('axios');

async function solveCloudflareChallenge(pageurl, proxy) {
  const { data } = await axios.get('https://ocr.captchaai.com/in.php', {
    params: {
      key: 'YOUR_API_KEY',
      method: 'turnstile_staging',
      pageurl,
      proxy,
      proxytype: 'HTTP',
      json: 1
    }
  });

  const taskId = data.request;

  for (let i = 0; i < 60; i++) {
    await new Promise(r => setTimeout(r, 5000));
    const res = await axios.get('https://ocr.captchaai.com/res.php', {
      params: { key: 'YOUR_API_KEY', action: 'get', id: taskId, json: 1 }
    });
    if (res.data.status === 1) return res.data.request;
  }
  throw new Error('Timeout');
}

Use o mesmo proxy e o mesmo user agent nas requisições reais — é essa combinação que mantém o cookie válido:

# After getting the solution
cookie_qa_validacao = solution["cookie_qa_validacao"]
user_agent = solution["user_agent"]

# Use the SAME proxy and user agent for subsequent requests
session = requests.Session()
session.cookies.set("cookie_qa_validacao", cookie_qa_validacao, domain=".example.com")
session.headers["User-Agent"] = user_agent
session.proxies = {"https": "http://username:password@proxy.example.com:8080"}

# Now access the protected page
page = session.get("https://example.com/protected-page")
print(f"Status: {page.status_code}")

Perguntas frequentes

Por que esse desafio aparece só às vezes, mesmo em sites que você acessa direto?

  • A Cloudflare recalcula o risco a cada requisição, combinando IP, comportamento e pontuação de bot
  • O mesmo visitante pode passar direto hoje e cair no desafio amanhã

Dá para testar esse fluxo em ambiente de staging antes de automatizar em produção?

  • Sim: use um domínio de teste com a mesma configuração da Cloudflare
  • Valide o par proxy + User-Agent em QA antes de levar para produção

Qual é a diferença entre esse desafio e o Turnstile?

O desafio bloqueia o acesso até a verificação terminar; o Turnstile é um widget na página, parecido com o reCAPTCHA, e não exige Cloudflare como proxy reverso.

Quanto tempo leva para resolver automaticamente pela API?

  • Faixa típica: 20 a 60 segundos
  • Por que é mais lento: a verificação completa do navegador pesa mais que o Turnstile ou o reCAPTCHA

Confira o campo request da resposta com status: 1:

  • Ele traz a string de solução com o cookie de verificação e o user agent usados
  • Grave os dois juntos — separar um do outro invalida o cookie

Guias relacionados

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