Cómo resolver el Captcha de AWS con NodeJS

Adélia Cruz
Neural Network Developer
03-Nov-2025

En el paisaje web moderno, proteger los recursos en línea frente a amenazas automatizadas es fundamental. AWS Web Application Firewall (WAF) es una capa de seguridad robusta que suele implementar desafíos o CAPTCHAS gestionados para filtrar bots maliciosos. Aunque efectiva para la seguridad, estas mecanismos representan un obstáculo significativo para tareas de automatización legítimas, como el scraping web, el monitoreo o las pruebas.
Esta guía completa proporciona una solución automatizada poderosa utilizando Node.js y el servicio CapSolver. Recorreremos paso a paso la configuración del entorno, la implementación de un script modular de Node.js y el uso de la función especializada AntiAwsWafTask de CapSolver para superar tanto los escenarios de WAF Challenge (HTTP 202) como de WAF Captcha (HTTP 405). Al finalizar este tutorial, tendrás un script listo para producción capaz de obtener el cookie aws-waf-token necesario para acceder al contenido protegido.
⚙️ Requisitos previos
Antes de comenzar, asegúrate de tener listos el siguiente entorno y información:
- Entorno de Node.js: Node.js está instalado en tu sistema (se recomienda la versión LTS).
- Clave de API de CapSolver: Necesitas una cuenta en CapSolver y tu clave de API.
- Proxy (Opcional): Si el sitio web objetivo tiene restricciones geográficas o necesitas ocultar tu IP real, prepara un proxy HTTP/HTTPS.
🛠️ Paso Uno: Instalar Dependencias Necesarias
En tu directorio de proyecto, ejecuta el siguiente comando para instalar los módulos de Node.js requeridos:
bash
npm install axios cheerio
axios: Usado para enviar solicitudes HTTP.cheerio: Usado para analizar contenido HTML y extraer parámetros necesarios para el desafío de AWS WAF.
💻 Paso Dos: Implementación del Código Principal de Node.js
A continuación, te presentamos el script de Node.js para resolver desafíos y CAPTCHAS de AWS WAF. Detecta automáticamente el código de estado devuelto por el sitio web y ejecuta la tarea correspondiente de CapSolver según sea necesario.
Guarda el siguiente código como aws_waf_solver.js.
javascript
const axios = require('axios');
const cheerio = require('cheerio');
const { URL } = require('url');
// ⚠️ Configuración: Por favor reemplázalos con tus valores reales
const CLIENT_KEY = "TU_CLAVE_DE_API_DE_CAPSOLVER"; // Reemplaza con tu clave de API de CapSolver
const PAGE_URL = "https://norway-meetup.aws.wslab.no/"; // Reemplaza con la URL del sitio web objetivo
const PROXY = "TU_DIRECCIÓN_DE_PROXY"; // Reemplaza con tu dirección de proxy (Formato: user:pass@ip:port o ip:port)
// --- Funciones Auxiliares ---
/**
* Pausa la ejecución durante un número especificado de milisegundos
* @param {number} ms Milisegundos
*/
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
/**
* Crea una tarea con CapSolver
* @param {object} payload Payload de la tarea
* @returns {Promise<object>} Resultado de la creación de la tarea
*/
async function createTask(payload) {
try {
const res = await axios.post('https://api.capsolver.com/createTask', {
clientKey: CLIENT_KEY,
task: payload
});
if (res.data.errorId !== 0) {
throw new Error(`Error de API de CapSolver: ${res.data.errorDescription}`);
}
return res.data;
} catch (error) {
console.error("Fallo al crear la tarea de CapSolver:", error.message);
return null;
}
}
/**
* Obtiene el resultado de la tarea de CapSolver hasta que esté completada
* @param {string} taskId ID de la tarea
* @returns {Promise<object>} Resultado de la tarea
*/
async function getTaskResult(taskId) {
if (!taskId) return null;
console.log(`Esperando resultado de la tarea (ID: ${taskId})...`);
try {
let success = false;
let result = null;
while (!success) {
await sleep(3000); // Consulta cada 3 segundos
const res = await axios.post('https://api.capsolver.com/getTaskResult', {
clientKey: CLIENT_KEY,
taskId: taskId
});
if (res.data.errorId !== 0) {
throw new Error(`Error de API de CapSolver: ${res.data.errorDescription}`);
}
if (res.data.status === "ready") {
success = true;
result = res.data;
console.log("Tarea completada, solución obtenida.");
} else if (res.data.status === "processing") {
console.log("La tarea aún está en proceso...");
}
}
return result;
} catch (error) {
console.error("Fallo al obtener el resultado de la tarea de CapSolver:", error.message);
return null;
}
}
// --- Funciones Principales de Resolución ---
/**
* Resuelve el desafío de AWS WAF (Código de estado 202)
* @param {string} awsChallengeJS URL del JavaScript del desafío de AWS WAF
* @returns {Promise<string|null>} Valor del cookie de AWS WAF resuelto
*/
async function solveAwsChallenge(awsChallengeJS) {
console.log("Se detectó el desafío de AWS WAF (Código de estado 202), iniciando la resolución...");
const taskPayload = {
type: "AntiAwsWafTask",
websiteURL: PAGE_URL,
awsChallengeJS,
proxy: PROXY
};
const taskData = await createTask(taskPayload);
if (!taskData) return null;
const result = await getTaskResult(taskData.taskId);
if (result && result.solution && result.solution.cookie) {
return result.solution.cookie;
}
return null;
}
/**
* Resuelve el CAPTCHA de AWS WAF + Desafío (Código de estado 405)
* @param {string} htmlContent Contenido HTML que contiene parámetros de CAPTCHA
* @param {string} awsChallengeJS URL del JavaScript del desafío de AWS WAF
* @returns {Promise<string|null>} Valor del cookie de AWS WAF resuelto
*/
async function solveAwsCaptchaChallenge(htmlContent, awsChallengeJS) {
console.log("Se detectó el CAPTCHA de AWS WAF (Código de estado 405), iniciando la resolución...");
const $ = cheerio.load(htmlContent);
const scriptTags = $('script[src*="token.awswaf.com"]');
const awsChallengeJS = scriptTags.attr('src');
if (!awsChallengeJS) {
console.log("No se detectó el script de desafío de AWS WAF. El sitio web puede no estar protegido o ya haberlo superado.");
// Si no hay script de desafío, usar la respuesta inicial directamente
if (initialResponse.status === 200) {
console.log("Sitio web cargado exitosamente.");
// console.log(initialResponse.data); // Imprimir contenido final
return;
}
} else {
console.log(`URL del script de desafío de AWS WAF detectada: ${awsChallengeJS}`);
}
// 2. Determinar y resolver el desafío/captcha según el código de estado
if (initialResponse.status === 202) {
// Solo desafío de AWS WAF
awsWafCookie = await solveAwsChallenge(awsChallengeJS);
} else if (initialResponse.status === 405) {
// CAPTCHA de AWS WAF + Desafío
awsWafCookie = await solveAwsCaptchaChallenge(initialResponse.data, awsChallengeJS);
} else if (initialResponse.status === 200) {
console.log("Sitio web cargado exitosamente, no se requiere resolver CAPTCHA.");
// console.log(initialResponse.data); // Imprimir contenido final
return;
} else {
console.log(`Se encontró un código de estado no manejado: ${initialResponse.status}.`);
return;
}
// 3. Solicitar nuevamente la página objetivo usando el cookie obtenido
if (awsWafCookie) {
try {
console.log("\n--- Segunda solicitud: Usando el cookie de AWS WAF ---");
console.log(`Cookie usada: ${awsWafCookie}`);
const finalResponse = await axios.get(PAGE_URL, {
headers: {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36",
"Cookie": `aws-waf-token=${awsWafCookie}`
},
validateStatus: (status) => status === 200 // Esperar éxito final
});
console.log(`Código de estado de la respuesta final: ${finalResponse.status}`);
console.log("Contenido del sitio web obtenido exitosamente!");
// console.log(finalResponse.data); // Imprimir contenido final
} catch (error) {
console.error(`Fallo en la solicitud final: ${error.message}`);
}
} else {
console.log("Fallo al obtener el cookie de AWS WAF, no se puede realizar la segunda solicitud.");
}
}
main();
💡 Resumen de Puntos Clave
| Punto Clave | Problema en el Código Original | Mejora Optimizada |
|---|---|---|
| Instalación de Dependencias | Falta de cheerio, uso de resaltado de sintaxis de Python incorrecto. |
Se especifica claramente la necesidad de instalar axios y cheerio, se usa el resaltado de sintaxis bash correcto. |
| Tipo de Tarea | Uso mixto de FunCaptchaTaskProxyless y AntiAwsWafTask. |
Uso unificado del AntiAwsWafTask oficialmente recomendado por CapSolver para todos los escenarios de AWS WAF. |
| Extracción de Parámetros | Lógica incompleta para extraer awsChallengeJS en la lógica 405, no se extrae en la lógica 202. |
Extracción unificada de awsChallengeJS después de la solicitud inicial en la función main, y se llaman funciones de solucionador diferentes según el código de estado (202 o 405). |
| Manejo de Errores | Manejo simple de errores, sin comprobaciones de errores de API ni mensajes de espera de tarea. | Se añadieron comprobaciones de errores de API (errorId !== 0) en createTask y getTaskResult, y se proporcionaron mensajes de estado durante el procesamiento de la tarea. |
| Estructura del Código | Toda la lógica estaba agrupada en la función main, lo que dificultaba la lectura. |
Se separó en funciones auxiliares claras (sleep, createTask, getTaskResult) y funciones principales de solucionador (solveAwsChallenge, solveAwsCaptchaChallenge), mejorando la claridad de la lógica. |
| Encabezados de Solicitud | Los encabezados originales eran redundantes e incompletos. | Se simplificaron y se usaron encabezados más estándar que simulan una solicitud de navegador. |
❓ Preguntas Frecuentes (FAQ)
P: ¿Por qué debo manejar ambos códigos de estado HTTP 202 y HTTP 405?
R: AWS WAF utiliza medidas de seguridad diferentes que resultan en códigos de estado HTTP distintos:
- HTTP 202 (Aceptado): Suele indicar que se requiere un desafío de WAF. Es una verificación de seguridad más ligera que implica ejecutar un fragmento de JavaScript.
- HTTP 405 (Método No Permitido): Suele indicar que se requiere un CAPTCHA de WAF, que es una verificación más compleja que implica resolver un rompecabezas visual o interactivo, junto con los parámetros del desafío. Nuestro script está diseñado para detectar y manejar automáticamente ambos escenarios.
P: ¿Puedo usar este script sin un proxy?
R: Sí, puedes hacerlo. La variable PROXY es opcional. Si no necesitas un proxy, puedes configurar const PROXY = ""; en la configuración. Sin embargo, se recomienda encarecidamente usar un proxy de alta calidad para tareas de scraping web y automatización para evitar bloqueos de IP y garantizar un acceso constante.
P: ¿Qué es el AntiAwsWafTask?
R: AntiAwsWafTask es un tipo de tarea especializado proporcionado por CapSolver diseñado específicamente para manejar el mecanismo de seguridad de AWS WAF. Procesa inteligentemente los parámetros del desafío (incluyendo awsKey, awsIv, awsContext y awsChallengeJS) extraídos de la página protegida y devuelve el cookie aws-waf-token válido necesario para superar la protección.
📚 Más Información
- Documentación Oficial de CapSolver para AWS WAF: https://docs.capsolver.com/en/guide/captcha/awsWaf/
- Documentación de la API de CapSolver: https://docs.capsolver.com/en/api/
✅ Conclusión
Este guía ha demostrado un método robusto y eficiente para resolver desafíos y captchas de AWS WAF de manera programática utilizando Node.js y CapSolver. Al implementar el script modular y aprovechar el tipo de tarea especializado de CapSolver, puede integrar de manera fluida esta solución en sus flujos de automatización. La clave del éxito radica en identificar correctamente el código de estado de WAF (202 o 405), extraer los parámetros necesarios y usar la cookie aws-waf-token resultante para las solicitudes posteriores. Este enfoque garantiza que sus tareas de automatización puedan acceder de manera confiable al contenido protegido por AWS WAF.
Aviso de Cumplimiento: La información proporcionada en este blog es solo para fines informativos. CapSolver se compromete a cumplir con todas las leyes y regulaciones aplicables. El uso de la red de CapSolver para actividades ilegales, fraudulentas o abusivas está estrictamente prohibido y será investigado. Nuestras soluciones para la resolución de captcha mejoran la experiencia del usuario mientras garantizan un 100% de cumplimiento al ayudar a resolver las dificultades de captcha durante el rastreo de datos públicos. Fomentamos el uso responsable de nuestros servicios. Para obtener más información, visite nuestros Términos de Servicio y Política de Privacidad.
Máse

Cómo resolver Cloudflare en 2025: Resolver Cloudflare Turnstile y desafío usando CapSolver
Explorar el Desafío de Cloudflare y el CAPTCHA de Turnstile y aprender a evitarlos utilizando CapSolver, navegadores automatizados y proxies de alta calidad. Incluye ejemplos prácticos de Python y Node.js para resolver CAPTCHA de forma fluida en tareas de automatización.

Adélia Cruz
03-Nov-2025

Cómo resolver el Captcha de AWS con NodeJS
En este artículo, te mostraremos cómo resolver el Captcha / Desafío de AWS con Node.JS.

Adélia Cruz
03-Nov-2025

Resolución Automática de CAPTCHA de AWS WAF mediante integración de navegador o de API
Aprende a resolver automáticamente CAPTCHA de AWS WAF usando extensiones de navegador e integración de API. Este guía cubre reconocimiento de imágenes, desafíos basados en tokens y soluciones de CapSolver para una automatización fluida y scraping web.

Aloísio Vítor
23-Oct-2025

Cómo resolver AWS WAF en Crawl4AI con Integración de CapSolver
Aprende cómo resolver las protecciones de AWS WAF en Crawl4AI usando la API de CapSolver y los métodos de integración de extensión de navegador. Esta guía proporciona ejemplos de código para el raspado web sin problemas.

Aloísio Vítor
21-Oct-2025

El Mejor Solucionador de CAPTCHA de AWS WAF para Automatización y Scraping
Descubre el mejor solucionador de CAPTCHA para AWS WAF. La solución impulsada por IA de CapSolver supera los desafíos de WAF instantáneamente, garantizando un scraping web y automatización sin interrupciones a gran escala.

Aloísio Vítor
17-Oct-2025

