Cómo solucionar el error "Enable JavaScript and cookies to continue"
Este mensaje aparece cuando Cloudflare (u otro proxy de seguridad similar) bloquea la solicitud porque detecta que el cliente no cumple con los requisitos mínimos de seguridad: JavaScript deshabilitado o cookies rechazadas.
🔍 Causa técnica
Cloudflare implementa mecanismos de verificación de navegador (como Browser Integrity Check o Challenge) para filtrar tráfico malicioso. Cuando una solicitud no cumple con:
- Ejecutar JavaScript (necesario para calcular tokens como
cf_chl_hshocf_chl_opt) - Aceptar y enviar cookies de sesión (
__cf_bm,cf_clearance, etc.)
...el servidor responde con una página de desafío (HTTP 200 con contenido HTML de bloqueo), en lugar de servir la página real.
Esto ocurre comúnmente en:
- Solicitudes automatizadas (scraping, bots, scripts sin navegador)
- Navegadores con JavaScript deshabilitado
- Configuraciones de privacidad estrictas (bloqueo de cookies de terceros)
- Uso de proxies o VPNs que alteran headers o fingerprints
✅ Solución definitiva (pasos)
1. Si eres usuario final
- Habilita JavaScript en tu navegador.
-
Acepta cookies (especialmente de
*.cloudflare.com). - Desactiva temporalmente extensiones como uBlock Origin o Privacy Badger (pueden bloquear scripts de verificación).
- Espera 5–10 segundos tras cargar la página: Cloudflare ejecuta un desafío invisible y luego redirige automáticamente.
2. Si eres desarrollador (automatización/scraping)
✅ Opción recomendada: Usa un navegador real con headless
# Ejemplo con Playwright (Python)
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless="new")
page = browser.new_page()
page.goto("https://tu-sitio.com")
# Cloudflare resuelve el desafío automáticamente
content = page.content()
# ...procesa el contenido
browser.close()
✅ Opción avanzada: Simula un navegador real (sin headless)
- Usa
cloudscraper(Python) ocloudflare-scrape(Node.js), que incluyen lógica para resolver desafíos:
# Python con cloudscraper
import cloudscraper
scraper = cloudscraper.create_scraper()
resp = scraper.get("https://tu-sitio.com")
print(resp.text) # Ya resuelto el desafío
❌ Evita:
-
requests/urllibpuros: no ejecutan JS ni manejan cookies dinámicas. -
curlsin opciones avanzadas: no pasa los desafíos de Cloudflare. - Deshabilitar Cloudflare en producción: compromete la seguridad.
🛠️ Bloque de código corregido (ejemplo con Playwright)
# ✅ Solución robusta para scraping
from playwright.sync_api import sync_playwright
import time
def bypass_cloudflare(url: str) -> str:
with sync_playwright() as p:
browser = p.chromium.launch(headless="new")
context = browser.new_context(
viewport={"width": 1920, "height": 1080},
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
)
page = context.new_page()
page.goto(url, wait_until="networkidle")
# Espera explícita si Cloudflare lanza un desafío manual
try:
page.wait_for_selector("#challenge-success-text", timeout=10000)
except:
pass # No hay desafío o ya se resolvió
return page.content()
# Uso
html = bypass_cloudflare("https://ejemplo.com")
💡 Pro-tip
-
Cloudflare no bloquea permanentemente: El bloqueo es transitorio (5–10 segundos). Si usas
requests, cada llamada reinicia el desafío → bucle infinito. -
Guarda cookies y headers: En automatización, persiste la sesión (
cf_clearance+ cookies) entre sesiones para evitar repetir el desafío. -
Verifica headers: Asegúrate de enviar
Accept-Language,Sec-Fetch-*, yRefererrealistas. Cloudflare analiza el fingerprint del navegador. - Si controlas el servidor: En Cloudflare Dashboard → Security → Bot Management, ajusta el nivel de desafío ("Low", "Medium", "High") o añade tu IP a la lista blanca.
⚠️ Importante: No intentes "bypassear" Cloudflare en sitios que no te pertenecen. Puede violar sus Términos de Servicio y generar bloqueos permanentes.
Top comments (0)