Si tu automatización se topa con Cloudflare y no avanza, lo primero es saber qué tienes delante. La confusión habitual es meter en el mismo saco Bot Management y Turnstile, que son dos productos distintos. Bot Management es una defensa de nivel enterprise que actúa en la red —con reglas WAF, límite de solicitudes y análisis de comportamiento—; Turnstile es solo un widget que reemplaza al CAPTCHA de siempre y que cualquier sitio inserta gratis.
En la práctica, un mismo dominio detrás de Cloudflare —pensemos en un marketplace tipo MercadoLibre o un portal de trámites que monitorizas con permiso— puede responderte de tres formas, y cada una apunta a un producto distinto:
- Una página de espera de 5 segundos.
- Un widget en el formulario de login o registro.
- Un 403 seco, sin más.
Saber cuál te ha tocado decide el método de resolución que necesitas.
Cómo funciona Bot Management (enterprise)
Bot Management forma parte del plan Enterprise de Cloudflare y opera a nivel de red: cada solicitud al dominio se evalúa antes de llegar al servidor de origen. No protege un formulario concreto, sino todo el tráfico.
El motor de puntuación, paso a paso
El recorrido de una solicitud, desde el edge de Cloudflare hasta la decisión final, es este:
Request arrives at Cloudflare edge
↓
Bot Management engine evaluates:
├─ Machine learning model (behavioral fingerprint)
├─ Heuristics (known bot patterns)
├─ JavaScript fingerprinting (if JS challenge triggered)
├─ JA3/JA4 TLS fingerprint
├─ HTTP header analysis
└─ IP reputation (Cloudflare sees ~20% of internet traffic)
↓
Bot score assigned: 1 (definitely bot) to 99 (definitely human)
↓
WAF rules act on the score:
- Score > 50 → Allow
- Score 30-50 → Managed challenge
- Score < 30 → Block or JavaScript challenge
Componentes de Bot Management
Bajo el capó conviven varias piezas, y no todas se activan en cada solicitud:
| Componente | Para qué sirve |
|---|---|
| Bot Score | Puntuación por ML para cada solicitud |
| Managed Challenge | Muestra de forma adaptativa un desafío JS o Turnstile |
| Super Bot Fight Mode | Modo simplificado en los planes de pago de Cloudflare |
| Bot Analytics | Panel que separa tráfico de bots y humanos |
| Reglas personalizadas del WAF | Reglas que se activan según umbrales de bot score |
| Límite de solicitudes | Umbrales de frecuencia por IP/sesión |
| Detección por JavaScript | Detecta navegadores headless y herramientas de automatización |
Qué se encuentra tu automatización
Cuando un sitio usa Bot Management, una solicitud automatizada puede recibir cualquiera de estas cuatro respuestas:
- Bloqueo directo (403) — bot score muy bajo; lo bloquea una regla del WAF.
- Página de desafío JavaScript — la clásica "Checking your browser" de 5 segundos.
- Managed challenge — widget Turnstile o desafío JS, según decida Cloudflare.
- Paso invisible — solicitud permitida porque el bot score es suficientemente alto.
Nota: automatiza solo flujos propios o con permiso, y respeta los términos de servicio y la normativa de protección de datos aplicable.
Cloudflare Turnstile, el widget gratuito
Turnstile es un widget CAPTCHA independiente que sustituye a los CAPTCHA de siempre. Funciona por su cuenta, sin Bot Management, y puede colocarse en cualquier sitio web, no solo en dominios con proxy de Cloudflare.
Qué comprueba Turnstile por dentro
Page loads Turnstile widget
↓
Widget runs background checks:
├─ Browser proof-of-work challenge (cryptographic puzzle)
├─ Private Access Token (Apple devices)
├─ Browser environment validation
└─ Cloudflare threat intelligence
↓
Result: cf-turnstile-response token generated
↓
Token submitted with form data
↓
Server validates token via Cloudflare API (siteverify)
Modos del widget Turnstile
El sitio elige cuánta fricción impone al usuario según el modo que configure:
| Mode | Comportamiento | Cuándo se usa |
|---|---|---|
| Managed | Cloudflare elige entre invisible e interactivo | Predeterminado y recomendado |
| Non-interactive | Siempre invisible (solo proof-of-work) | Formularios de baja fricción |
| Invisible | Sin widget visible; se ejecuta al cargar la página | Verificación en segundo plano |
Insertar Turnstile en una página
<!-- Simple Turnstile integration -->
<div class="cf-turnstile" data-sitekey="0x4AAAAAAAC3DHQhMMQ_Rxrg"></div>
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
Comparativa rápida: Bot Management frente a Turnstile
Con las dos piezas sobre la mesa, la vista lado a lado deja clara la diferencia de alcance, precio y forma de despliegue:
| Característica | Bot Management | Turnstile |
|---|---|---|
| Qué es | Plataforma enterprise de defensa contra bots | Widget CAPTCHA gratuito |
| Precio | Plan Enterprise ($$$) | Gratis en todos los planes |
| Despliegue | Nivel de red (proxy de Cloudflare) | Widget JavaScript (se inserta en la página) |
| Requiere DNS de Cloudflare | Sí | No (funciona en cualquier sitio) |
| Desafío visible | A veces (managed challenge) | Casi nunca (mayormente invisible) |
| Alcance de detección | Todas las solicitudes al dominio | Acciones concretas de página (envío de formulario, etc.) |
| Bot score | 1-99 (por solicitud) | Aprobado/rechazado (por desafío) |
| Integración con WAF | Sí (reglas según el bot score) | No |
| Desafío JavaScript | Sí (página de espera de 5 s) | Sí (proof-of-work en segundo plano) |
| Límite de solicitudes | Sí | No |
| Soporte de CaptchaAI | Vía los métodos Turnstile/Challenge | Sí (alta tasa de éxito) |
Cómo resolver cada protección con CaptchaAI
La regla mental es sencilla:
- Turnstile: resuelve el token y listo.
- Bot Management: resuelve el token y, además, haz que tu cliente HTTP parezca un navegador real (cabeceras, TLS, IP).
Resolver Turnstile (lo fácil)
Turnstile se resuelve con el método turnstile de CaptchaAI, con una alta tasa de éxito:
import requests
import time
API_KEY = "YOUR_API_KEY"
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "turnstile",
"sitekey": "0x4AAAAAAAC3DHQhMMQ_Rxrg",
"pageurl": "https://example.com/signup",
"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:
token = result["request"]
print(f"Turnstile token: {token[:50]}...")
break
Resolver los desafíos de Bot Management
Cuando Bot Management muestra un CAPTCHA, suele ser un managed challenge que se renderiza como Turnstile, así que el token se resuelve igual; lo demás (cabeceras, TLS, IP) corre de tu lado:
# Bot Management flow for automation:
# 1. Make initial request
response = requests.get("https://protected-site.com/api/data")
# 2. Check if challenged
if response.status_code == 403:
# Hard block — need to adjust headers, proxy, or approach
pass
elif "challenge" in response.text.lower() or response.status_code == 503:
# JavaScript challenge or managed challenge
# If it contains a Turnstile widget, solve it:
if "cf-turnstile" in response.text or "challenges.cloudflare.com" in response.text:
# Extract sitekey and solve via CaptchaAI
sitekey = extract_turnstile_sitekey(response.text)
token = solve_turnstile(sitekey, "https://protected-site.com/api/data")
La página Cloudflare Challenge (que no es Turnstile)
Ojo con confundirlas: la página JavaScript "Checking your browser" NO es un widget Turnstile. Para esa pantalla, CaptchaAI usa el método cloudflare_challenge:
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "cloudflare_challenge",
"sitekey": "managed",
"pageurl": "https://protected-site.com/login",
"json": 1,
})
Detección automática antes de resolver
Para no adivinar en cada solicitud, conviene clasificar la respuesta y decidir el método a partir de ahí:
import requests
def identify_cloudflare_protection(url):
"""Identify which Cloudflare protection a URL uses."""
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/120.0.0.0",
}
response = requests.get(url, headers=headers, timeout=15, allow_redirects=False)
html = response.text
result = {
"cloudflare_protected": "cf-ray" in response.headers.get("cf-ray", "")
or "cloudflare" in response.headers.get("server", "").lower(),
"bot_management_challenge": False,
"turnstile_widget": False,
"hard_block": False,
"passed": False,
}
if response.status_code == 403:
result["hard_block"] = True
elif response.status_code == 503 and "jschl" in html:
result["bot_management_challenge"] = True
elif "cf-turnstile" in html:
result["turnstile_widget"] = True
elif response.status_code == 200:
result["passed"] = True
return result
Preguntas frecuentes
¿Un 403 de Cloudflare significa que hay Bot Management?
Casi siempre, sí. Un 403 con la plantilla de error de Cloudflare y la cabecera cf-ray indica un bloqueo a nivel de red, propio de Bot Management, no de Turnstile. Turnstile no bloquea solicitudes: solo genera (o no) un token en un formulario concreto. El problema estará en tus cabeceras, tu TLS o tu IP, no en el CAPTCHA.
¿Me basta con resolver el CAPTCHA o necesito también un proxy?
Depende del producto. Con Turnstile suelto, resolver el token con CaptchaAI suele bastar. Con Bot Management necesitas, además, una salida de red autorizada y cabeceras coherentes: la puntuación se calcula por solicitud con señales de TLS y reputación de IP.
¿Turnstile es más fácil de resolver por ser gratuito?
Que sea gratis para el sitio no lo hace trivial, pero sí más acotado: Turnstile solo evalúa una acción de página concreta, mientras que Bot Management juzga todo el tráfico.
¿Qué método de CaptchaAI corresponde a cada caso?
Usa el método turnstile para los widgets Turnstile (y para los managed challenge que se renderizan como Turnstile) y el método cloudflare_challenge para la página "Checking your browser". Son los dos flujos que cubren el componente CAPTCHA de Cloudflare.
¿Puede un mismo sitio combinar las dos protecciones?
Sí, y es habitual. Bot Management filtra a nivel de red todo el tráfico, y encima el sitio coloca Turnstile en el login o el registro como verificación extra. Entonces trabajas las dos capas a la vez.
Tabla de referencia: cómo identificar cada protección
Estas son las pistas que delatan a cada producto en las cabeceras y en el HTML:
| Escenario | Producto probable | Cómo identificarlo |
|---|---|---|
| Página "Checking your browser" de 5 s | Bot Management (desafío JS) | cf-chl-bypass, jschl_vc en el código de la página |
| Widget Turnstile en un formulario | Turnstile (independiente) | Clase cf-turnstile, challenges.cloudflare.com/turnstile |
| 403 Forbidden con página de error de Cloudflare | Bot Management (bloqueo duro) | Cabecera cf-ray, plantilla de error de Cloudflare |
| Casilla interactiva en una página de Cloudflare | Managed challenge (Bot Management) | Dominio challenges.cloudflare.com |
| Sin desafío visible pero con cookies cf establecidas | Bot Management (aprobado) | Cookie qa_validation_cookie presente |
Resumen
Bot Management es una defensa enterprise de nivel de red que puntúa cada solicitud con ML, reglas WAF y análisis de comportamiento; Turnstile es un widget gratuito que verifica con proof-of-work del navegador. Para automatizar, el token de Turnstile se resuelve directamente con CaptchaAI con una alta tasa de éxito, mientras que Bot Management exige, además, simular bien el navegador. Identifica primero la protección y el método sale solo.
Artículos relacionados
- Browser Integrity Check de Cloudflare frente al CAPTCHA
- Cómo distinguir Cloudflare Challenge de Turnstile
- Comparativa entre GeeTest y Cloudflare Turnstile