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
- Cómo resolver Cloudflare Turnstile usando API
- Cómo resolver Cloudflare Challenge usando API
- Cloudflare Turnstile 403 después del token: solución
- Referencia de códigos de error CaptchaAI