Solución de Problemas

Cloudflare Challenge vs Turnstile: cómo detectar cuál tienes

Usar el método CaptchaAI incorrecto para las protecciones de Cloudflare es uno de los errores más comunes. Cloudflare Challenge y Cloudflare Turnstile parecen similares pero son fundamentalmente diferentes. Enviar turnstile cuando el sitio utiliza un desafío de página completa, o viceversa, siempre fallará.


Los dos tipos de protección de Cloudflare

Característica Cloudflare Challenge Cloudflare Turnstile
Tipo Intersticial de página completa Widget integrado
Apariencia Bloquea toda la página, "Revisando tu navegador" Pequeña casilla de verificación o widget invisible dentro de un formulario
Método CaptchaAI cloudflare_challenge turnstile
Devuelve Cookie qa_validation_cookie Cadena de token
Requiere proxy Sí (obligatorio) Recomendado
Requiere User-Agent Sí (obligatorio) No

Cómo identificar Cloudflare Challenge

Un Cloudflare Challenge es un intersticial de página completa que bloquea el acceso al contenido. Lo ve antes de que se cargue la página real.

Señales visuales:

  • Mensaje "Comprueba tu navegador antes de acceder..."
  • Rueda giratoria de carga de Cloudflare
  • El título de la página contiene "Sólo un momento..."
  • La URL sigue siendo la misma pero el contenido es una página de Cloudflare

Signos HTML:

<!-- Cloudflare Challenge page indicators -->
<title>Just a moment...</title>
<div id="challenge-running">...</div>
<div class="cf-browser-verification">...</div>

Detección programática:

import requests

resp = requests.get("https://example.com")

is_cf_challenge = (
    resp.status_code == 403 and
    "Just a moment" in resp.text or
    "cf-browser-verification" in resp.text or
    "challenge-platform" in resp.text
)

if is_cf_challenge:
    print("Cloudflare Challenge detectado — use method: cloudflare_challenge")

Cómo identificar Cloudflare Turnstile

Turnstile es un widget integrado dentro de una página que ya está cargada. Aparece dentro de formularios, como reCAPTCHA.

Señales visuales:

  • Pequeño widget de Cloudflare dentro de un formulario (estilo de casilla de verificación)
  • El resto del contenido de la página es visible.
  • El widget dice "Verifica que eres humano"

Signos HTML:

<!-- Turnstile widget indicators -->
<div class="cf-turnstile" data-sitekey="0x4AAAAAAADnPIDROz1234"></div>

<!-- Or loaded via JavaScript -->
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js"></script>

Detección programática:

import requests

resp = requests.get("https://staging.example.com/qa-login")

is_turnstile = (
    "cf-turnstile" in resp.text or
    "challenges.cloudflare.com/turnstile" in resp.text
)

if is_turnstile:
    # Extract sitekey
    if 'data-sitekey="' in resp.text:
        start = resp.text.index('data-sitekey="') + 14
        end = resp.text.index('"', start)
        sitekey = resp.text[start:end]
        print(f"Turnstile detected — sitekey: {sitekey}")
        print("Use method: turnstile")

Función de detección combinada

def detect_cloudflare_type(url):
    """Detect which Cloudflare protection a URL uses."""
    resp = requests.get(url, allow_redirects=True)

    # Check for full-page Challenge
    if resp.status_code in [403, 503]:
        if any(marker in resp.text for marker in [
            "Just a moment",
            "cf-browser-verification",
            "challenge-platform",
            "challenge-running"
        ]):
            return {"type": "cloudflare_challenge", "method": "cloudflare_challenge"}

    # Check for embedded Turnstile
    if "cf-turnstile" in resp.text or "challenges.cloudflare.com/turnstile" in resp.text:
        sitekey = None
        if 'data-sitekey="' in resp.text:
            start = resp.text.index('data-sitekey="') + 14
            end = resp.text.index('"', start)
            sitekey = resp.text[start:end]
        return {"type": "turnstile", "method": "turnstile", "sitekey": sitekey}

    return {"type": "none", "method": None}


# Usage
result = detect_cloudflare_type("https://example.com")
print(f"Protection: {result['type']}")
print(f"CaptchaAI method: {result['method']}")

Resolviendo cada tipo

Cloudflare Challenge:

data = {
    "key": "YOUR_API_KEY",
    "method": "cloudflare_challenge",
    "pageurl": "https://example.com",
    "proxy": "host:port:user:pass",   # MANDATORY
    "proxytype": "HTTP",               # MANDATORY
    "userAgent": "Mozilla/5.0 ...",    # MANDATORY
    "json": 1
}
# Returns qa_validation_cookie cookie — set it in your session

Cloudflare Turnstile:

data = {
    "key": "YOUR_API_KEY",
    "method": "turnstile",
    "sitekey": "0x4AAAAAAADnPIDROz1234",
    "pageurl": "https://staging.example.com/qa-login",
    "json": 1
}
# Returns a token — inject into cf-turnstile-response field

Errores comunes

Error Resultado Solución
Usando turnstile para una página de challenge ERROR_CAPTCHA_UNSOLVABLE Cambiar a cloudflare_challenge
Usando cloudflare_challenge para Turnstile Formato de respuesta incorrecto Cambiar a turnstile
Sin proxy para el Challenge ERROR_PROXY_NOT_AUTHORIZED Añadir proxy: es obligatorio para el Challenge
Sin sitekey para Turnstile ERROR_BAD_PARAMETERS Extraer el sitekey del HTML de la página

Preguntas frecuentes

¿Puede un sitio utilizar tanto Challenge como Turnstile?

Sí. Un sitio puede usar Cloudflare Challenge en el acceso inicial y Turnstile dentro de su formulario de inicio de sesión. Debes resolver ambos en secuencia.

¿Por qué Challenge requiere un proxy pero Turnstile no?

El desafío devuelve una cookie qa_validation_cookie vinculada a una IP. CaptchaAI debe utilizar su proxy para generar una cookie que funcione desde su IP. Turnstile devuelve un token independiente de IP.

¿Qué pasa si la detección arroja "ninguno" pero sigo viendo Cloudflare?

Algunas protecciones de Cloudflare solo se activan en acciones específicas (solicitudes POST, llamadas API) o para ciertos agentes de usuario. Intente acceder a la URL con un agente de usuario similar a un bot para activar el desafío.


Resuelva los CAPTCHA de Cloudflare con CaptchaAI

Maneja tanto Challenge como Turnstile en captchaai.com.


Guías relacionadas

Los comentarios están deshabilitados para este artículo.