Cómo solucionar el error “Enable JavaScript and cookies to continue”
Este mensaje aparece cuando Cloudflare (o un proxy similar como Brotli/WAF) bloquea la solicitud del cliente porque detecta que JavaScript y/o cookies están deshabilitados, o porque la verificación de seguridad (como un challenge de JavaScript) no se completó correctamente.
🔍 Causa técnica
Cloudflare implementa mecanismos de seguridad como:
-
JavaScript Challenge: El servidor envía una página intermedia que requiere ejecutar JS para generar un token válido (
cf_chl_opt,cf_chl_hash, etc.). -
Cookie validation: El navegador debe aceptar y enviar cookies (
__cf_bm,__cfduid, etc.) para demostrar ser un cliente legítimo.
Este error ocurre cuando:
- El cliente (navegador o scraper) no ejecuta JavaScript (ej.
curl,requestssin headless, bots). - El cliente bloquea cookies (configuración de privacidad, extensiones como uBlock Origin, configuración de Firefox/Chrome restrictiva).
- El entorno de pruebas (ej. Selenium, Playwright) no persiste cookies ni maneja el challenge correctamente.
- El servidor detecta comportamiento anómalo (falta de headers como
User-Agent,Accept-Language,Referer, o IPs compartidas en redes P2P/VPN).
✅ Pasos para solucionarlo
1. Si eres un usuario final
- ✅ Habilita JavaScript en tu navegador.
- ✅ Asegúrate de que las cookies estén permitidas (especialmente para el dominio en cuestión).
- ✅ Desactiva temporalmente bloqueadores de anuncios o scripts (uBlock, NoScript, Privacy Badger).
- ✅ Limpia la caché y cookies del sitio, luego recarga.
2. Si eres desarrollador (automatización/scraping)
✅ Opción A: Usa un navegador headless con soporte JS y cookies
# Ejemplo con Playwright (recomendado)
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless="new")
context = browser.new_context()
page = context.new_page()
page.goto("https://ejemplo.com", wait_until="networkidle")
# El challenge se resuelve automáticamente si el navegador es realista
content = page.content()
browser.close()
⚠️ Evita
requests+BeautifulSouppara sitios protegidos por Cloudflare. No ejecutan JS y no pasan el challenge.
✅ Opción B: Usa cloudscraper (solo para casos simples)
pip install cloudscraper
import cloudscraper
scraper = cloudscraper.create_scraper()
resp = scraper.get("https://ejemplo.com")
print(resp.text)
❗
cloudscraperno siempre funciona con Cloudflare Under Attack Mode o versiones recientes (v4+). Requiere configuración extra y no es confiable para producción.
✅ Opción C: Simula un navegador real con headers y delay
import requests
from fake_useragent import UserAgent
headers = {
"User-Agent": UserAgent().random,
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "es-ES,es;q=0.9,en;q=0.8",
"Accept-Encoding": "gzip, deflate, br",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"Cache-Control": "max-age=0",
}
session = requests.Session()
resp = session.get("https://ejemplo.com", headers=headers)
# Si falla, NO podrás avanzar sin ejecutar JS → usa Playwright.
🧠 Pro-tip: Diagnóstico rápido
- Verifica si el sitio usa Cloudflare:
curl -I https://ejemplo.com | grep -i "cf-ray\|cf-request-id\|via"
Si ves cf-ray o via cloudflare, estás bajo protección.
-
Abre el sitio en modo incógnito sin extensiones:
- Si funciona → problema de configuración del navegador o extensiones.
- Si falla → el sitio está en Under Attack Mode (Cloudflare bloquea todo tráfico no validado).
-
En entornos automatizados, siempre usa un navegador real:
- Playwright > Puppeteer > Selenium (en orden de confiabilidad para Cloudflare).
- Asegúrate de que el navegador no tenga bloqueo de cookies (
ignoreHTTPSErrors=True,acceptDownloads=True, etc.).
🔥 Solución definitiva: Usa Playwright con headless="new" y una configuración de contexto realista (sin bloqueo de cookies, con viewport y user-agent). Cloudflare ya no puede distinguirlo de un navegador humano.
# Configuración robusta para Playwright
page.set_extra_http_headers({
"Accept-Language": "es-ES,es;q=0.9",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
})
await page.set_viewport_size({"width": 1920, "height": 1080})
await page.add_init_script("""
Object.defineProperty(navigator, 'webdriver', { get: () => false });
""")
Top comments (0)