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 está deshabilitado o las cookies no están permitidas.
¿Por qué ocurre?
Cloudflare implementa mecanismos de protección contra bots y ataques automatizados. Cuando una solicitud llega sin:
- Ejecutar JavaScript (necesario para resolver el JavaScript Challenge),
- o sin aceptar cookies (para mantener el estado de la sesión tras la validación),
...Cloudflare interrumpe la conexión y muestra este mensaje.
Causas comunes:
- Uso de
curl,wget, o scripts sin motor JS (como Node.js puro sin Puppeteer/Playwright). - Configuración de navegador que bloquea JavaScript o cookies.
- Requests desde herramientas de scraping o automatización sin emular un navegador real.
- Errores en el flujo de validación de Cloudflare (raro, pero posible si hay redirecciones rotas).
Pasos para solucionarlo
✅ 1. Si eres un usuario final (navegando):
-
Habilita JavaScript en tu navegador:
- Chrome:
Configuración > Privacidad y seguridad > Seguridad > Permitir JavaScript. - Firefox:
Preferencias > Privacidad y seguridad > Permisos > Habilitar JavaScript.
- Chrome:
-
Habilita cookies de terceros (si el sitio usa dominios distintos para autenticación):
- Chrome:
Configuración > Privacidad y seguridad > Cookies y otros datos de sitios > Permitir cookies de terceros.
- Chrome:
- Borra la caché y las cookies del dominio problemático.
- Prueba en modo incógnito (para descartar extensiones bloqueantes).
✅ 2. Si eres desarrollador (haciendo requests programáticos)
🔧 Opción A: Usa un navegador headless (recomendado)
No intentes resolver el desafío manualmente. Usa herramientas que ejecuten JS y gestionen cookies:
# Ejemplo con Puppeteer (Node.js)
npx puppeteer-core --executable-path="/path/to/chrome" \
--no-sandbox --disable-setuid-sandbox \
--disable-dev-shm-usage \
--viewport-width=1920 --viewport-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" \
--timeout=30000 \
--wait-for-selector="body" \
https://example.com
O en código (Node.js con puppeteer):
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
headless: 'new',
args: ['--no-sandbox', '--disable-setuid-sandbox']
});
const page = await browser.newPage();
// Simula un navegador real
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36');
await page.goto('https://example.com', { waitUntil: 'networkidle2' });
// Espera a que se resuelva el desafío (Cloudflare lo hace automáticamente)
await page.waitForSelector('body:not(:has(#challenge-error-text))', { timeout: 30000 });
const content = await page.content();
console.log(content);
await browser.close();
})();
🔧 Opción B: Usa cloudscraper (solo para sitios con Cloudflare básico)
⚠️ Solo funciona si Cloudflare no usa Managed Challenge o Under Attack Mode. Ya está obsoleto, pero hay forks activos.
npm install cloudscraper
const cloudscraper = require('cloudscraper');
cloudscraper.get({
url: 'https://example.com',
jar: true, // Importante: gestiona cookies
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
}).then(body => {
console.log(body);
}).catch(err => {
console.error('Fallo:', err.message);
});
🔧 Opción C: Usa playwright (más robusto que Puppeteer hoy en día)
npm install playwright
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({ headless: true });
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://example.com');
await page.waitForLoadState('networkidle'); // Espera a que todo cargue, incluido JS
// Si Cloudflare pide interacción manual (raro en headless), usa:
// await page.click('#challenge-form button'); // si hay botón explícito
const html = await page.content();
console.log(html);
await browser.close();
})();
Pro-tip: Verifica si Cloudflare está activo y qué modo usa
- Abre
https://www.cloudflare.com/ssl-website/y entra tu dominio. - O usa
digpara ver los registros DNS y confirmar si está detrás de Cloudflare:
dig example.com +short
# Si ves IPs como 104.16.x.x o 172.67.x.x → está en Cloudflare.
- Revisa en el panel de Cloudflare:
- Security > Settings > Browser Integrity Check → debe estar On.
- Security > Bot Fight Mode o Under Attack Mode → si están activos, el desafío será más estricto.
💡 Clave: Si estás haciendo scraping, no evites el desafío. Usa una estrategia de resolución real (con JS). Cloudflare detecta requests sin JS y los bloquea intencionalmente.
✅ Solución definitiva: Usa un navegador headless real (Puppeteer/Playwright) con cookies habilitadas y espera a que se resuelva el desafío. No hay atajos seguros ni sostenibles.
Top comments (0)