Cómo solucionar el error "Enable JavaScript and cookies to continue"
Este mensaje aparece cuando un sitio web (especialmente uno protegido por Cloudflare) detecta que el navegador del cliente no cumple con los requisitos mínimos de seguridad: JavaScript deshabilitado o cookies bloqueadas. Pero en entornos de desarrollo o automatización (como scrapers, pruebas con Selenium, o peticiones HTTP directas), el problema suele ser más sutil.
🔍 Raíz técnica
Cloudflare (u otros WAFs) emite este desafío (/cdn-cgi/challenge-platform/...) como parte de su mecanismo de verificación de navegador real. Ocurre cuando:
- No se ejecuta JavaScript (obligatorio para generar tokens dinámicos).
- No se aceptan cookies (necesarias para mantener el estado del desafío resuelto).
-
El cliente HTTP no simula un navegador real (falta de headers como
User-Agent,Accept-Language, etc.). - El servidor detecta comportamiento no humano (peticiones rápidas, sin interacción, sin cookies previas).
⚠️ No es un error de tu código front-end — es una defensa del servidor contra bots.
✅ Solución definitiva (según caso de uso)
🧪 Caso 1: Automatización (Selenium, Playwright, Puppeteer)
No uses requests o curl para este caso. Necesitas un navegador real.
✅ Ejemplo con Playwright (recomendado):
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
# Simula comportamiento humano (opcional pero recomendado)
page.add_init_script("""
Object.defineProperty(navigator, 'webdriver', { get: () => false });
""")
page.goto("https://example.com", wait_until="networkidle")
# Espera a que Cloudflare resuelva el desafío (si no se resuelve automáticamente)
page.wait_for_selector("#challenge-error-text", state="detached", timeout=10000)
# Ahora puedes hacer scraping
content = page.content()
browser.close()
💡 Clave: Playwright mantiene cookies, ejecuta JS y emula headers reales por defecto.
🌐 Caso 2: Peticiones HTTP directas (Python requests, Node.js axios, etc.)
No es posible resolver el desafío sin un navegador. Cloudflare usa:
-
cf_clearancecookie (generada tras resolver el desafío JS). - Tokens dinámicos (
__cf_chl_rt_tk). - Tiempos de resolución medidos en milisegundos.
✅ Solución realista:
- Usa un proxy con navegador headless (como browserless.io) o
- Almacena cookies válidas de una sesión previa resuelta manualmente.
Ejemplo: Reutilizar cookies de una sesión resuelta (solo para pruebas locales)
import requests
# 1. Resuelve el desafío manualmente en tu navegador → copia la cookie `cf_clearance`
# 2. Usa esa cookie en tus peticiones
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"Cookie": "cf_clearance=abc123xyz; __cf_bm=def456..."
}
response = requests.get("https://example.com", headers=headers)
print(response.text)
⚠️ Advertencia: Las cookies
cf_clearancecaducan (usualmente 1-2 horas). No es escalable para producción.
🛠️ Caso 3: Desarrollo local (tu propio sitio protegido por Cloudflare)
Si estás probando tu app detrás de Cloudflare:
- Desactiva temporalmente el modo "Under Attack" en Cloudflare Dashboard → Security → Settings.
- O usa Modo de desarrollo (Cloudflare Dashboard → Caching → Configuration → Purge everything + Development mode).
🧠 Pro-tip: Evita este problema desde el diseño
- Usa Cloudflare con modo "I'm Under Attack" desactivado en entornos de desarrollo.
- Si necesitas automatización real: implementa una API propia que haga de proxy con navegador (ej: FastAPI + Playwright).
- Para scraping: considera scraping legal y ético → usa APIs oficiales o servicios como Zyte o ScraperAPI.
✅ Regla de oro: Si ves
/challenge-error-text, no es un bug de tu código — es una defensa activa. Tu solución debe burlarla (con navegador) o evitarla (con API autorizada).
Top comments (0)