Comparações

Desafio gerenciado da Cloudflare versus desafio interativo

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/.

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

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