A Cloudflare oferece duas ações de desafio que os operadores do site podem configurar nas regras do WAF: Desafio Gerenciado e Desafio Interativo. O Desafio Gerenciado é a abordagem moderna e adaptativa – a Cloudflare decide a dificuldade por visitante. O Desafio Interativo é a opção legada, apresentando sempre um CAPTCHA visível. Compreender a diferença determina qual método CaptchaAI usar e o que esperar durante a automação.
Comparação rápida
| Recurso | Desafio gerenciado | Desafio interativo |
|---|---|---|
| Introduzido | 2021 | Legado (pré-2021) |
| Adaptável? | Sim (Cloudflare decide por visitante) | Não (sempre interativo) |
| Passe invisível possível? | Sim (~90% dos visitantes passam de forma invisível) | Não (sempre mostra CAPTCHA) |
| Tipos de desafio usados | Desafio invisível → Cloudflare Turnstile → JS | CAPTCHA sempre visível |
| Recomendado pela Cloudflare? | Sim (padrão para novas regras) | Não (mantido para compatibilidade com versões anteriores) |
| Atrito do usuário | Baixo (a maioria passa sem ver nada) | Alto (sempre requer interação) |
| Status HTTP | 503 | 403 |
| Método CaptchaAI | turnstile ou turnstile_staging |
turnstile |
Desafio gerenciado (moderno)
O Desafio Gerenciado é a ação de desafio recomendada pela Cloudflare. Utiliza uma estrutura de decisão para apresentar o desafio menos perturbador possível:
Fluxo de decisão
WAF rule triggers Managed Challenge
↓
Cloudflare evaluates visitor signals:
├─ Browser sinal de navegador quality
├─ IP reputation score
├─ TLS sinal de navegador (JA3/JA4)
├─ Request history
├─ Behavioral signals
└─ Device capabilities
↓
Risk assessment → Challenge level selected:
├─ LOW risk → Invisible pass (no visible UI)
├─ MEDIUM risk → Non-interactive Turnstile (background PoW)
├─ HIGH risk → Interactive Turnstile (checkbox/widget)
└─ VERY HIGH risk → JavaScript challenge page (5s wait)
↓
Challenge completed
↓
cookie_qa_validacao cookie issued
O que os visitantes experimentam
| Tipo de visitante | O que eles veem | Porcentagem |
|---|---|---|
| Navegador normal, bom IP | Nada (passe invisível) | ~90% |
| Novo navegador, IP neutro | Girador breve | ~5% |
| Sinais suspeitos | Caixa de seleção da catraca | ~4% |
| Sinais de alto risco | Página "Verificando seu navegador..." | ~1% |
Saída HTML
As páginas de Desafio Gerenciado usam a plataforma de desafio da Cloudflare:
<!-- Managed Challenge page (when visible) -->
<body>
<div id="challenge-stage">
<div id="challenge-body-text">
Verifying you are human. This may take a few seconds.
</div>
<!-- Turnstile widget (when rendered) -->
<div class="cf-turnstile"
data-sitekey="0x4AAAAAAAC3DHQhMMQ_Rxrg">
</div>
</div>
<!-- Challenge platform script -->
<script src="/cdn-cgi/challenge-platform/h/g/orchestrate/managed/v1?ray=...">
</script>
</body>
Desafio interativo (legado)
O Desafio Interativo apresenta sempre um CAPTCHA visível com o qual o visitante deve interagir. Não existe passagem invisível – cada visitante vê e deve completar o desafio.
Como funciona
WAF rule triggers Interactive Challenge
↓
Full-page CAPTCHA served (HTTP 403)
↓
Visitor must interact with CAPTCHA widget
↓
CAPTCHA solved
↓
cookie_qa_validacao cookie issued
O que os visitantes experimentam
Cada visitante vê um desafio de página inteira com um widget semelhante ao Turnstile:
<!-- Interactive Challenge page -->
<body>
<div id="challenge-running">
<div class="main-wrapper">
<h2>Please verify you are human</h2>
<!-- Always-visible challenge widget -->
<div class="challenge-widget">
<!-- Checkbox + verification -->
</div>
</div>
</div>
</body>
Por que Cloudflare desencoraja isso
| Problema | Impacto |
|---|---|
| Sempre visível | 100% dos visitantes veem o desafio |
| Maior fricção | Todo visitante deve interagir |
| Maior taxa de rejeição | Os usuários saem em vez de concluírem |
| Sem adaptação ao risco | Visitantes conhecidos também são desafiados |
| Preocupações com acessibilidade | Cada visitante deve concluir a interação |
Detecção: Que desafio estou enfrentando?
import requests
import re
def identify_challenge_type(url):
"""Determine if a URL uses Managed or Interactive Challenge."""
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/120.0.0.0",
"Accept": "text/html,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
}
response = requests.get(url, headers=headers, timeout=15, allow_redirects=False)
html = response.text
status = response.status_code
result = {
"url": url,
"status": status,
"challenge_type": None,
"cf_ray": response.headers.get("cf-ray", ""),
"solve_method": None,
}
if status == 200:
# Check for inline Turnstile widget (not a challenge page)
if "cf-turnstile" in html:
result["challenge_type"] = "turnstile_widget"
result["solve_method"] = "turnstile"
else:
result["challenge_type"] = "none"
return result
if status == 503:
# 503 indicates Managed Challenge or IUAM
if "managed" in html or "challenge-platform" in html:
result["challenge_type"] = "managed_challenge"
result["solve_method"] = "turnstile" # Managed renders as Turnstile
elif "jschl" in html:
result["challenge_type"] = "iuam_js_challenge"
result["solve_method"] = "turnstile_staging"
else:
result["challenge_type"] = "unknown_503"
return result
if status == 403:
if "challenge" in html.lower():
result["challenge_type"] = "interactive_challenge"
result["solve_method"] = "turnstile"
else:
result["challenge_type"] = "waf_block"
result["solve_method"] = None # Hard block, not solvable
return result
return result
# Usage
info = identify_challenge_type("https://protected-site.com/login")
print(f"Challenge: {info['challenge_type']}")
print(f"Solve with: {info['solve_method']}")
Tabela de detecção
| Sinal | Desafio gerenciado | Desafio interativo | IUAM | Bloco WAF |
|---|---|---|---|---|
| Estado HTTP | 503 | 403 | 503 | 403 |
challenge-platform em HTML |
✅ | ✅ | ❌ | ❌ |
Caminho managed no script |
✅ | ❌ | ❌ | ❌ |
jschl em HTML |
❌ | ❌ | ✅ | ❌ |
| Sempre mostra o widget | ❌ | ✅ | ❌ | ❌ |
| Passe invisível possível | ✅ | ❌ | ❌ | ❌ |
Resolvendo cada tipo de desafio
Resolvendo Desafio Gerenciado
Os Desafios Gerenciados normalmente são renderizados como widgets Turnstile. Use o método turnstile de CaptchaAI:
import requests
import time
API_KEY = "YOUR_API_KEY"
def solve_managed_challenge(url, sitekey=None):
"""Solve Cloudflare Managed Challenge."""
# If sitekey not provided, extract from page
if not sitekey:
import re
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/120.0.0.0",
}
page = requests.get(url, headers=headers, timeout=15)
match = re.search(
r'data-sitekey=["\']([0-9x][A-Za-z0-9_-]+)["\']', page.text
)
sitekey = match.group(1) if match else None
if not sitekey:
# No visible Turnstile — try turnstile_staging method
return solve_js_challenge(url)
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "turnstile",
"sitekey": sitekey,
"pageurl": url,
"json": 1,
})
task_id = submit.json()["request"]
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:
return result["request"]
raise TimeoutError("Solve timed out")
def solve_js_challenge(url):
"""Fallback to turnstile_staging method."""
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "turnstile_staging",
"sitekey": "managed",
"pageurl": url,
"json": 1,
})
task_id = submit.json()["request"]
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:
return result["request"]
raise TimeoutError("Solve timed out")
Resolvendo Desafio Interativo
O Desafio Interativo sempre mostra um widget visível. Use o mesmo método turnstile:
def solve_interactive_challenge(url, sitekey):
"""Solve Cloudflare Interactive Challenge (legacy)."""
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "turnstile",
"sitekey": sitekey,
"pageurl": url,
"json": 1,
})
task_id = submit.json()["request"]
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:
return result["request"]
raise TimeoutError("Solve timed out")
Node.js (ambos os tipos)
const axios = require("axios");
const API_KEY = "YOUR_API_KEY";
async function solveCloudflareChallenge(url, type = "managed") {
const method = type === "js_challenge" ? "turnstile_staging" : "turnstile";
const sitekey =
type === "js_challenge" ? "managed" : await extractSitekey(url);
const submit = await axios.post("https://ocr.captchaai.com/in.php", null, {
params: {
key: API_KEY,
method,
sitekey: sitekey || "managed",
pageurl: url,
json: 1,
},
});
const taskId = submit.data.request;
for (let i = 0; i < 60; i++) {
await new Promise((r) => setTimeout(r, 5000));
const result = await axios.get("https://ocr.captchaai.com/res.php", {
params: { key: API_KEY, action: "get", id: taskId, json: 1 },
});
if (result.data.status === 1) {
return result.data.request;
}
}
throw new Error("Solve timed out");
}
async function extractSitekey(url) {
try {
const response = await axios.get(url, {
headers: { "User-Agent": "Mozilla/5.0 Chrome/120.0.0.0" },
validateStatus: () => true,
});
const match = response.data.match(
/data-sitekey=["']([0-9x][A-Za-z0-9_-]+)["']/
);
return match ? match[1] : null;
} catch {
return null;
}
}
Migração de Interativo para Gerenciado
A Cloudflare recomenda migrar do Desafio Interativo para o Desafio Gerenciado. Se um site que você está automatizando mudar:
| Mudança | Efeito na automação |
|---|---|
| → interativo gerenciado | Pode começar a passar de forma invisível (~90% de chance) |
| HTTP 403 → 503 | Atualizar verificações de código de status |
| → adaptativo sempre visível | O widget pode não estar em HTML |
| Mesma chave do site | O código de resolução CaptchaAI permanece o mesmo |
| Mesma saída cookie_qa_validacao | O manuseio de cookies permanece o mesmo |
Fluxo de trabalho rápido do detector
- Verifique se a página mostra uma página de desafio intersticial ou incorpora um widget no fluxo do aplicativo.
- Procure marcadores cf-chl, contêineres Turnstile e ganchos de retorno de chamada antes de decidir o caminho de manuseio.
- Registre o resultado da detecção com o URL da página e a identidade do proxy para que as alterações recorrentes do alvo sejam visíveis rapidamente.
Solução de problemas
| Sintoma | Causa | Correção |
|---|---|---|
| 503 sem widget visível | Desafio Gerenciado passado de forma invisível | Nenhuma ação necessária – você foi aprovado |
| 503 com "Verificando seu navegador" | Gerenciado elevado ao desafio JS | Use o método turnstile_staging |
| 403 com CAPTCHA visível | Desafio interativo (legado) | Use o método turnstile |
| 403 sem desafio | Bloco WAF, não é um desafio | Alterar IP ou padrão de solicitação |
| O tipo de desafio muda aleatoriamente | Desafio gerenciado adaptando-se aos sinais | Lide com o desafio Turnstile e JS |
| cookie_qa_validacao de um tipo rejeitado por outro | Diferentes fluxos de desafio, mesmo domínio | Resolva qualquer desafio apresentado |
Perguntas frequentes
Devo sempre tentar o Desafio Gerenciado primeiro?
Sim. A maioria dos sites usa o Desafio Gerenciado agora. Comece com o método turnstile e volte para turnstile_staging se a página mostrar um desafio de JavaScript (503 com "Verificando seu navegador").
Um site pode usar os dois tipos em páginas diferentes?
Sim, mas é incomum. Cada regra WAF pode ter uma ação diferente. Uma regra pode usar Desafio Gerenciado para /login e Desafio Interativo para /api/.
O Desafio Gerenciado ainda precisa de um cookie cookie_qa_validacao?
Sim. Ambos os tipos de desafio produzem o mesmo cookie cookie_qa_validacao. O tratamento dos cookies é idêntico, independentemente do tipo de desafio.
E se o Managed Challenge passar por mim de forma invisível?
Se o Desafio Gerenciado decidir que sua solicitação é de baixo risco, ele passará a solicitação sem um desafio visível. Sua resposta será 200 normal com o conteúdo da página. Nenhuma solução CaptchaAI é necessária neste caso.
O Interactive Challenge está sendo descontinuado?
A Cloudflare não o descontinuou oficialmente, mas eles recomendam o Managed Challenge para todas as novas regras. O Desafio Interativo permanece para compatibilidade com versões anteriores. Os sites podem migrar a qualquer momento.
Resumo
O Desafio Gerenciado da Cloudflare seleciona de forma adaptativa a dificuldade do desafio por visitante (invisível para o desafio JS completo), enquanto o Desafio Interativo sempre apresenta um CAPTCHA visível. Ambos produzem o mesmo cookie cookie_qa_validacao e são resolvidos comCaptchaAI— use turnstile para a maioria dos desafios e turnstile_staging para páginas de desafio JavaScript. O Desafio Gerenciado é o padrão moderno; O Desafio Interativo é legado.
Artigos relacionados
- Verificação de integridade do navegador Cloudflare versus Captcha
- Cloudflare Turnstile em staging vs detecção de catraca
- Comparação de Geetest vs Cloudflare Turnstile