Cómo solucionar el error “Enable JavaScript and cookies to continue”
Este error aparece cuando Cloudflare (u otro proxy inverso de seguridad) detecta que el navegador del usuario no cumple con los requisitos mínimos para acceder al sitio: JavaScript está deshabilitado o las cookies no están permitidas. Pero en entornos reales, el problema suele ser más sutil: el navegador sí tiene JS y cookies habilitados, pero la configuración del entorno de ejecución (como un headless browser, test automation, o un scraper) no emula correctamente el comportamiento del cliente.
🔍 Causa raíz técnica
Cloudflare emite un desafío (CAPTCHA o JS challenge) para verificar que el cliente es un navegador real. Si la respuesta no cumple con el desafío (por ejemplo, porque:
- El navegador no ejecuta el JS del desafío (headless sin soporte),
- Las cookies no se persisten entre solicitudes,
- El
User-AgentoAccept-Languageno coinciden con navegadores reales, - Falta el
RefereroOriginen headers, - Se bloquean cookies de terceros (como las de Cloudflare),
… entonces el servidor devuelve este mensaje estático en lugar de redirigir a la página solicitada.
⚠️ Nota crítica: Si estás usando herramientas como curl, requests de Python, o navegadores headless sin configuración especial, no pasarás el desafío de Cloudflare. Es intencional: Cloudflare bloquea tráfico no humano por diseño.
✅ Solución definitiva (por escenario)
🛠️ Caso 1: Navegador real (usuario final)
-
Verifica que JavaScript esté habilitado:
- Chrome:
Configuración → Privacidad y seguridad → Configuración de sitios → JavaScript → Permitido. - Firefox:
Preferencias → Privacidad y seguridad → Cookies y datos de sitios → Deshabilitar “Bloquear cookies y datos de sitios”.
- Chrome:
-
Limpia cookies y caché (especialmente para
*.cloudflare.com). - Reinicia el navegador y vuelve a cargar la página.
🛠️ Caso 2: Automatización / Scraping (Python + Playwright/Selenium)
No uses requests o urllib: no ejecutan JS. Usa un navegador real con soporte para Cloudflare.
✅ Ejemplo con Playwright (recomendado):
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False) # headless=True también funciona si se configura bien
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()
# Opcional: simular interacción humana para evitar bloqueos
page.goto("https://tu-sitio.com", wait_until="networkidle")
# Espera explícita al desafío Cloudflare y su resolución automática
try:
page.wait_for_selector("#challenge-error-text", timeout=5000)
raise RuntimeError("Cloudflare bloqueó la solicitud. Asegúrate de usar un navegador real.")
except:
pass # No hay desafío → todo bien
# Procede con la navegación
content = page.content()
Enter fullscreen mode Exit fullscreen mode
🔑 Claves:
- Usa
wait_until="networkidle"para esperar a que termine todo el JS. -
Nunca uses
headless="new"sin configuración extra: Cloudflare detecta headless moderno fácilmente. - Si usas
headless=True, añade:
context = browser.new_context(
# ... otros parámetros ...
bypass_csp=True, # Evita bloqueos de Content Security Policy
java_script_enabled=True,
cookies=[{"name": "cf_clearance", "value": "...", "domain": ".tu-sitio.com"}] # Si ya tienes un clearance válido
)
Enter fullscreen mode Exit fullscreen mode
🛠️ Caso 3: App móvil / WebView (Android/iOS)
- En Android: Asegúrate de que
WebView.getSettings().setJavaScriptEnabled(true)ysetAcceptCookies(true)estén activos. - En iOS: Verifica que
WKWebViewtengadataStore = WKWebsiteDataStore.default()(para persistir cookies).
🧪 Verificación rápida (CLI)
Si quieres probar si el sitio responde sin desafío:
curl -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" \
-H "Accept: text/html,application/xhtml+xml" \
-H "Accept-Language: es-ES,es;q=0.9" \
-H "Referer: https://www.google.com/" \
-c /tmp/cookies.txt \
-L https://tu-sitio.com
Enter fullscreen mode Exit fullscreen mode
Si el HTML contiene #challenge-error-text, el servidor sigue bloqueando. Necesitas emular un navegador real.
💡 Pro-tip: Evita el desafío desde el origen
Si tú controlas el backend:
- Agrega tu IP o rango a la lista blanca de Cloudflare (Panel → Firewall → Tools → Add IP Address).
- Usa Cloudflare Access con autenticación por token si es una API interna.
- Para APIs públicas: desactiva el “Under Attack Mode” y ajusta las reglas de WAF para excluir endpoints de API.
⚠️ Nunca intentes “bypassear” Cloudflare sin autorización. Es una violación de sus Términos y puede generar bloqueos permanentes.
✅ Solución definitiva resumida: Usa un navegador real (Playwright/Selenium) con cookies habilitadas, User-Agent realista y espera a que termine el JS. Si eres el propietario del sitio, configura Cloudflare para excluir tráfico legítimo.
답글 남기기