ProductosIntegracionesRecursosDocumentaciónPrecios
Empezar ahora

© 2026 CapSolver. All rights reserved.

Contáctenos

Slack: lola@capsolver.com

Productos

  • reCAPTCHA v2
  • reCAPTCHA v3
  • Cloudflare Turnstile
  • Cloudflare Challenge
  • AWS WAF
  • Extensión de navegador
  • Más tipos de CAPTCHA

Integraciones

  • Selenium
  • Playwright
  • Puppeteer
  • n8n
  • Socios
  • Ver todas las integraciones

Recursos

  • Programa de referidos
  • Documentación
  • Referencia de API
  • Blog
  • Preguntas frecuentes
  • Glosario
  • Estado

Legal

  • Términos de servicio
  • Política de privacidad
  • Política de reembolso
  • No vender mi información personal
//Cómo resolver el WAF de AWS en n8n con CapSolver
Mar12, 2026

Cómo resolver el WAF de AWS en n8n con CapSolver

Rajinder Singh

Rajinder Singh

Deep Learning Researcher

AWS WAF (Web Application Firewall) es el sistema de protección de bots de nivel empresarial de Amazon utilizado por algunos de los sitios web más grandes de Internet. A diferencia de los CAPTCHAs tradicionales que muestran rompecabezas de imágenes o casillas de verificación, AWS WAF utiliza desafíos invisibles y verificación basada en tokens, lo que lo hace particularmente desafiante para las herramientas de automatización.

¿Qué pasaría si pudieras resolver los desafíos de AWS WAF automáticamente dentro de tus flujos de trabajo de n8n, ya sea que estés construyendo una API de resolución reutilizable, extrayendo datos de un sitio protegido por captcha o automatizando un formulario de inicio de sesión, todo sin escribir una sola línea de código tradicional?

En esta guía, aprenderás cómo combinar n8n (una herramienta de automatización de flujos de trabajo visual) con CapSolver (un servicio de resolución de captcha impulsado por IA) para resolver desafíos de AWS WAF bajo demanda, ya sea como un endpoint de API independiente o como un paso dentro de cualquier flujo de trabajo de automatización más grande.

Lo que construirás:

API de resolución — un endpoint reutilizable que tus otras herramientas pueden llamar:

  • Una API de resolución de AWS WAF

Flujos de trabajo de uso directo — CapSolver incrustado como un paso dentro de automatizaciones más grandes:

  • Un raspador de precios y productos que resuelve AWS WAF, obtiene páginas protegidas y alerta sobre cambios de precios
  • Una automatización de inicio de sesión de cuenta que resuelve AWS WAF antes de enviar las credenciales

¿Qué es AWS WAF?

AWS WAF (Web Application Firewall) es el servicio de mitigación de bots y seguridad web de Amazon Web Services. Protege los sitios web de exploits web comunes, tráfico de bots y abuso automatizado. Muchos sitios de alto tráfico, especialmente plataformas de comercio electrónico, servicios financieros y aplicaciones empresariales, utilizan AWS WAF para restringir el acceso detrás de desafíos CAPTCHA invisibles.

Cómo AWS WAF difiere de reCAPTCHA y Turnstile:

  • No se requiere clave de sitio — A diferencia de reCAPTCHA o Turnstile, AWS WAF no expone una clave de sitio pública. Solo necesitas la websiteURL para comenzar a resolver.
  • Autenticación basada en cookies — En lugar de devolver un token que envías en un campo de formulario, AWS WAF devuelve una cookie aws-waf-token que debe enviarse con las solicitudes posteriores a través del encabezado HTTP Cookie.
  • Múltiples parámetros opcionales — AWS WAF puede exponer awsKey, awsIv, awsContext, awsChallengeJS y otros parámetros dependiendo de la configuración del sitio. Estos son opcionales y solo se necesitan para implementaciones específicas.
  • Desafío invisible — Los desafíos de AWS WAF suelen ejecutarse completamente en segundo plano utilizando JavaScript, sin un widget visible para que el usuario interactúe.

No es lo mismo que CloudFront. AWS WAF es la capa de firewall que se encuentra frente a las aplicaciones web. CloudFront es el CDN de Amazon. Un sitio puede usar CloudFront sin AWS WAF, o AWS WAF sin CloudFront; son servicios separados, aunque comúnmente se usan juntos.


Prerrequisitos

Antes de comenzar, asegúrate de tener lo siguiente:

  1. Una instancia de n8n — Autoalojada o n8n Cloud
  2. Una cuenta de CapSolver — Regístrate aquí y obtén tu clave de API
  3. El nodo CapSolver de n8n — Ya disponible como un nodo oficial en n8n (no se necesita instalación)

Importante: Asegúrate de tener saldo suficiente en tu cuenta de CapSolver. Las tareas de resolución de AWS WAF consumen créditos según el uso.


Configuración de CapSolver en n8n

CapSolver está disponible como una integración oficial en n8n, no se requiere la instalación de nodos de la comunidad. Puedes encontrarlo directamente en el panel de nodos al construir tus flujos de trabajo.

Dado que es una integración oficial, debes crear una credencial en n8n para que el nodo CapSolver pueda autenticarse con tu cuenta.

Paso 1: Abre la página de credenciales

Ve a tu instancia de n8n y navega a Settings -> Credentials. Verás todas tus credenciales configuradas aquí.

Página de credenciales de n8n mostrando la cuenta de CapSolver

Paso 2: Crea la credencial de CapSolver

  1. Haz clic en Create credential (arriba a la derecha)
  2. Busca "CapSolver" y selecciona CapSolver API
  3. Introduce tu clave de API — cópiala directamente desde el Panel de CapSolver
  4. Deja Allowed HTTP Request Domains configurado en All (predeterminado)
  5. Haz clic en Save

n8n probará automáticamente la conexión. Deberías ver un banner verde "Connection tested successfully" confirmando que tu clave de API es válida.

Configuración de credenciales de CapSolver con prueba de conexión exitosa

Importante: Cada nodo de CapSolver en tus flujos de trabajo hará referencia a esta credencial. Solo necesitas crearla una vez; todos tus flujos de trabajo de resolución compartirán la misma credencial.

¡Ahora estás listo para construir tu flujo de trabajo de resolución de AWS WAF!


Cómo identificar los parámetros de AWS WAF

Antes de poder resolver un desafío de AWS WAF, debes confirmar que el sitio de destino está utilizando AWS WAF y recopilar cualquier parámetro opcional. La forma más sencilla es usar la Extensión del navegador CapSolver combinada con la inspección manual.

Paso 1: Busca indicadores de AWS WAF

Navega a tu sitio web de destino y abre las Herramientas de desarrollo (F12). Busca estas señales reveladoras:

  • Cookies — Busca una cookie aws-waf-token en la pestaña Aplicación
  • Solicitudes de red — Busca solicitudes a captcha.awswaf.com o URLs que contengan challenge.js
  • Encabezados de respuesta — AWS WAF a menudo devuelve encabezados x-amzn-waf-*

Paso 2: Recopila parámetros opcionales (si es necesario)

La mayoría de las resoluciones de AWS WAF solo requieren la websiteURL. Sin embargo, algunos sitios exponen parámetros adicionales que pueden mejorar la precisión de la resolución:

Parámetro Dónde encontrarlo Descripción
awsKey Código fuente de la página / variables JS El valor de la clave devuelto por la página del captcha
awsIv Código fuente de la página / variables JS El valor iv devuelto por la página del captcha
awsContext Código fuente de la página / variables JS El valor de contexto devuelto por la página del captcha
awsChallengeJS Pestaña de red La URL de challenge.js (por ejemplo, https://captcha.awswaf.com/.../challenge.js)
awsApiJs Pestaña de red La URL de jsapi.js
awsProblemUrl Pestaña de red La URL del endpoint del problema
awsApiKey Pestaña de red El valor api_key del endpoint del problema
awsExistingToken Cookies Un aws-waf-token anterior si se está actualizando

Consejo: Para la mayoría de los sitios, solo necesitas websiteURL. Comienza solo con ese parámetro y agrega los opcionales solo si el token no está siendo aceptado.

Para una guía detallada sobre cómo identificar los parámetros de captcha, consulta la documentación oficial de CapSolver.


Flujo de trabajo: API de resolución de AWS WAF

Este flujo de trabajo crea un endpoint de API POST que acepta parámetros de AWS WAF y devuelve un token de cookie resuelto.

Flujo de trabajo de resolución de AWS WAF en n8n

Cómo funciona

El flujo de trabajo consta de cuatro nodos:

  1. Webhook — Recibe solicitudes POST entrantes con parámetros de AWS WAF
  2. AWS WAF — Envía el desafío a CapSolver y espera una solución
  3. ¿Error de CapSolver? — Nodo IF que se ramifica según si la resolución falló ($json.error no está vacío)
  4. Responder al Webhook — Devuelve la solución en caso de éxito, o {"error": "..."} en caso de fallo

Configuración del nodo

1. Nodo Webhook

Configuración Valor
Método HTTP POST
Ruta solver-aws-waf
Responder Response Node

Esto crea un endpoint en: https://your-n8n-instance.com/webhook/solver-aws-waf

2. Nodo CapSolver AWS WAF

Parámetro Valor Descripción
Operación AWS WAF Debe establecerse en AWS WAF
Tipo AntiAwsWafTaskProxyLess No se necesita proxy (predeterminado). Usa AntiAwsWafTask con un proxy para sitios más estrictos
URL del sitio web {{ $json.body.websiteURL }} La URL de la página con el desafío de AWS WAF
awsKey (Opcional) El valor de la clave devuelto por la página del captcha
awsIv (Opcional) El valor iv devuelto por la página del captcha
awsContext (Opcional) El valor de contexto devuelto por la página del captcha
awsChallengeJS (Opcional) El enlace challenge.js
awsApiJs (Opcional) El enlace jsapi.js

Diferencia clave con Turnstile/reCAPTCHA: AWS WAF no requiere una websiteKey. Solo websiteURL es obligatorio. También selecciona tus credenciales de CapSolver en este nodo.

3. ¿Nodo de error de CapSolver? (IF)

Configuración Valor
Condición ={{ $json.error }} no está vacío
Rama verdadera Dirige al nodo Error Responder al Webhook
Rama falsa Dirige al nodo Éxito Responder al Webhook

Esto hace que la ruta de error sea explícita en el lienzo. El nodo CapSolver continúa en caso de error (onError: continueRegularOutput), por lo que los fallos llegan aquí como {"error": "..."} en lugar de bloquear el flujo de trabajo.

4. Nodos Responder al Webhook

Rama de éxito (salida falsa de ¿Error de CapSolver?):

Configuración Valor
Responder con JSON
Cuerpo de la respuesta ={{ JSON.stringify($json.data) }}

Rama de error (salida verdadera de ¿Error de CapSolver?):

Configuración Valor
Responder con JSON
Cuerpo de la respuesta ={{ JSON.stringify({ error: $json.error }) }}

Los mensajes de error siguen uno de dos formatos dependiendo de dónde ocurrió el fallo:

Punto de fallo Formato
Creación de tarea rechazada (clave incorrecta, sin saldo, datos inválidos, etc.) {"error": "Failed to create task: Request failed with status code 400"}
Tarea creada pero el captcha no pudo resolverse {"error": "Solve failed: <reason>"}
Resolución agotada después de 120 s {"error": "Get task result timeout: unable to solve within 120000 seconds"}

Nota: Los fallos de creación de tareas (clave de API incorrecta, saldo cero, datos de tarea inválidos) se muestran como el mismo mensaje HTTP 400; el nodo n8n captura la excepción HTTP antes de leer el cuerpo de error de CapSolver.

Ejemplos de errores comunes:

json Copy
{"error": "Failed to create task: Request failed with status code 400"}
{"error": "Solve failed: Invalid parameters"}
{"error": "Get task result timeout: unable to solve within 120000 seconds"}

Pruébalo

Envía una solicitud POST a tu endpoint de webhook:

bash Copy
curl -X POST https://your-n8n-instance.com/webhook/solver-aws-waf \
  -H "Content-Type: application/json" \
  -d '{
    "websiteURL": "https://example.com/login"
  }'

Respuesta esperada:

json Copy
{
  "taskId": "abc123...",
  "solution": {
    "cookie": "aws-waf-token=AQAAAA..."
  },
  "status": "ready"
}

Importar este flujo de trabajo

Copia el JSON a continuación e impórtalo a n8n a través de Menu -> Import from JSON:

Haz clic para expandir el JSON completo del flujo de trabajo
json Copy
{
  "name": "AWS WAF Solver API",
  "nodes": [
    {
      "parameters": {
        "content": "## API de resolución de AWS WAF\n\n**Para quién:** Equipos que necesitan resolver desafíos de AWS WAF en otras herramientas.\n\n**Qué hace:** Acepta parámetros de AWS WAF, envía el desafío a CapSolver y devuelve una cookie `aws-waf-token` resuelta.\n\n**Cómo funciona:**\n1. El Webhook recibe solicitudes POST con `websiteURL` y parámetros opcionales.\n2. CapSolver resuelve el desafío de AWS WAF.\n3. En caso de éxito, el Webhook devuelve una respuesta JSON que contiene la cookie `aws-waf-token`.\n4. En caso de fallo, el Webhook devuelve un mensaje de error.\n\n**Configuración:**\n1. Agrega tu clave de API de CapSolver en **Settings → Credentials**.\n2. Activa el flujo de trabajo.\n3. Anota la URL del Webhook.\n\n**Importante:**\n- AWS WAF no requiere `websiteKey`. Solo `websiteURL`.\n- La solución es una cookie `aws-waf-token` que debe enviarse como encabezado HTTP `Cookie`.",
        "height": 480,
        "width": 460,
        "color": 1
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -728,
        -400
      ],
      "id": "sticky-blog-main-1773678228095-1",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "solver-aws-waf",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        -400,
        0
      ],
      "id": "aw111111-1111-1111-1111-aw1111111101",
      "name": "Webhook Trigger",
      "webhookId": "aw111111-aaaa-bbbb-cccc-aw1111111101",
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "operation": "AWS WAF",
        "type": "AntiAwsWafTaskProxyLess",
        "websiteURL": "={{ $json.body.websiteURL }}",
        "awsKey": "={{ $json.body.awsKey }}",
        "awsIv": "={{ $json.body.awsIv }}",
        "awsContext": "={{ $json.body.awsContext }}",
        "awsChallengeJS": "={{ $json.body.awsChallengeJS }}",
        "awsApiJs": "={{ $json.body.awsApiJs }}",
        "optional": {}
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        -96,
        0
      ],
      "id": "aw111111-1111-1111-1111-aw1111111102",
      "name": "Solve AWS WAF",
      "credentials": {
        "capSolverApi": {
          "id": "YOUR_CREDENTIAL_ID",
          "name": "CapSolver account"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "aws-if-001",
              "leftValue": "={{ $json.error }}",
              "operator": {
                "type": "string",
                "operation": "isEmpty",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        208,
        0
      ],
      "id": "aw111111-1111-1111-1111-aw1111111103",
      "name": "CapSolver Error?"
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify($json.data) }}",
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.5,
      "position": [
        512,
        -80
      ],
      "id": "aw111111-1111-1111-1111-aw1111111104",
      "name": "Respond to Webhook (Success)"
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify({ error: $json.error }) }}",
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.5,
      "position": [
        512,
        128
      ],
      "id": "aw111111-1111-1111-1111-aw1111111105",
      "name": "Respond to Webhook (Error)"
    }
  ],
  "connections": {
    "Webhook Trigger": {
      "main": [
        [
          {
            "node": "Solve AWS WAF",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Solve AWS WAF": {
      "main": [
        [
          {
            "node": "CapSolver Error?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "CapSolver Error?": {
      "main": [
        [
          {
            "node": "Respond to Webhook (Success)",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Respond to Webhook (Error)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  }
}

Flujo de trabajo: Ejemplos de casos de uso

La API de resolución y el ejemplo de envío anteriores muestran el patrón central: resolver el desafío de AWS WAF, enviar la cookie, procesar el resultado. Los siguientes flujos de trabajo extienden este patrón a casos de uso listos para producción, cada uno con disparadores duales (programación + webhook), seguimiento de estado persistente y salida estructurada.

Flujo de trabajo Propósito
Extracción de AWS WAF — Detalles de precios y productos — CapSolver + Programación + Webhook Extrae el precio y el nombre del producto cada 6 horas, compara con los valores anteriores almacenados en staticData, alerta sobre cambios
Inicio de sesión de cuenta de AWS WAF — CapSolver + Programación + Webhook Inicia sesión en tu propia cuenta en un sitio protegido por AWS WAF resolviendo primero, luego enviando credenciales con la cookie

Ejemplo 1: Extracción

Este flujo de trabajo extrae una página de producto cada 6 horas (programación) o bajo demanda (webhook), extrae el precio usando el nodo HTML y lo compara con el valor almacenado previamente.

Ruta de programación:

Copy
Cada 6 horas -> Resolver AWS WAF -> Obtener página de producto -> Extraer datos
  -> Comparar datos -> ¿Datos cambiados? -> Construir alerta / Sin cambios

Comportamientos clave:

  • La cookie se envía como un encabezado Cookie (esta es la forma correcta de enviar tokens de AWS WAF, no como un campo de formulario)
  • El nodo HTML extrae el precio y el nombre del producto a través de selectores CSS (.product-price, h1)
  • $workflow.staticData.lastPrice persiste el precio anterior entre ejecuciones
  • La comparación de precios detecta tanto caídas (gravedad: deal) como aumentos (gravedad: info)
Haz clic para expandir el JSON completo del flujo de trabajo (17 nodos)
json Copy
{
  "name": "AWS WAF Scraping — Price & Product Details — CapSolver + Schedule + Webhook",
  "nodes": [
    {
      "parameters": {
        "content": "## Extracción de AWS WAF — Monitor de precios y productos\n\n**Para quién:** Equipos que monitorean precios o datos de productos en sitios protegidos por AWS WAF.\n\n**Qué hace:** Resuelve AWS WAF, obtiene una página de producto, extrae el precio y el nombre a través de selectores CSS, compara con los valores almacenados y alerta sobre cambios.\n\n**Cómo funciona:**\n1. La programación (cada 6h) o el Webhook activan el flujo\n2. CapSolver resuelve el desafío de AWS WAF\n3. La solicitud HTTP obtiene la página del producto con el token resuelto\n4. El nodo HTML extrae el precio y el nombre del producto\n5. El nodo de código compara el precio actual con el almacenado → alerta sobre cambios\n\n**Configuración:**\n1. Agrega tu clave de API de CapSolver en **Settings → Credentials**\n2. Reemplaza las URLs de marcador de posición y las claves de sitio\n3. Actualiza los selectores CSS en Extraer datos para que coincidan con tu página de destino\n4. Conecta la salida de Construir alerta a tu canal de notificación",
        "height": 560,
        "width": 460,
        "color": 1
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -920,
        -380
      ],
      "id": "sticky-blog-main-1773678228094-1",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "content": "### Ruta de programación\nSe ejecuta automáticamente cada 6 horas.\nLos resultados se almacenan en los datos estáticos del flujo de trabajo para la comparación entre ejecuciones.",
        "height": 480,
        "width": 1900,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -440,
        -280
      ],
      "id": "sticky-blog-section-1773678228094-2",
      "name": "Sticky Note1"
    },
    {
      "parameters": {
        "content": "### Ruta de Webhook\nDisparador bajo demanda — misma lógica, devuelve el resultado como respuesta JSON.",
        "height": 480,
        "width": 1900,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -440,
        140
      ],
      "id": "sticky-blog-section-1773678228094-3",
      "name": "Sticky Note2"
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 6
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.3,
      "position": [
        -400,
        0
      ],
      "id": "aw333333-3333-3333-3333-aw3333333301",
      "name": "Every 6 Hours"
    },
    {
      "parameters": {
        "operation": "AWS WAF",
        "type": "AntiAwsWafTaskProxyLess",
        "websiteURL": "https://YOUR-TARGET-SITE.com/product-page",
        "optional": {}
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        -96,
        0
      ],
      "id": "aw333333-3333-3333-3333-aw3333333302",
      "name": "Solve AWS WAF",
      "credentials": {
        "capSolverApi": {
          "id": "YOUR_CREDENTIAL_ID",
          "name": "CapSolver account"
        }
      }
    },
    {
      "parameters": {
        "url": "https://YOUR-TARGET-SITE.com/product-page",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "user-agent",
              "value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
            },
            {
              "name": "Cookie",
              "value": "={{ $json.data.solution.cookie }}"
            }
          ]
        },
        "options": {
          "response": {
            "response": {
              "fullResponse": false
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        208,
        0
      ],
      "id": "aw333333-3333-3333-3333-aw3333333303",
      "name": "Fetch Product Page"
    },
    {
      "parameters": {
        "operation": "extractHtmlContent",
        "sourceData": "json",
        "dataPropertyName": "data",
        "extractionValues": {
          "values": [
            {
              "key": "price",
              "cssSelector": ".product-price, [data-price], .price",
              "returnValue": "text",
              "returnArray": false
            },
            {
              "key": "productName",
              "cssSelector": "h1, .product-title",
              "returnValue": "text",
              "returnArray": false
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.html",
      "typeVersion": 1.2,
      "position": [
        512,
        0
      ],
      "id": "aw333333-3333-3333-3333-aw3333333304",
      "name": "Extract Data"
    },
    {
      "parameters": {
        "jsCode": "// Get current and previous price from workflow static data\nconst staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Product';\n\n// Parse numeric values for comparison\nconst parsePrice = (str) => {\n  if (!str) return null;\n  const match = str.match(/[\\d,]+\\.?\\d*/);\n  return match ? parseFloat(match[0].replace(',', '')) : null;\n};\n\nconst currentNum = parsePrice(currentPrice);\nconst previousNum = parsePrice(previousPrice);\n\n// Update stored price\nstaticData.lastPrice = currentPrice;\nstaticData.lastChecked = new Date().toISOString();\n\nconst changed = previousNum !== null && currentNum !== null && currentNum !== previousNum;\nconst direction = changed ? (currentNum < previousNum ? 'dropped' : 'increased') : 'unchanged';\nconst diff = changed ? Math.abs(currentNum - previousNum).toFixed(2) : '0';\n\nreturn [{\n  json: {\n    productName,\n    currentPrice,\n    previousPrice: previousPrice || 'first check',\n    changed,\n    direction,\n    diff: changed ? `$${diff}` : null,\n    checkedAt: new Date().toISOString()\n  }\n}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        800,
        0
      ],
      "id": "aw333333-3333-3333-3333-aw3333333305",
      "name": "Compare Data"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "price-if-001",
              "leftValue": "={{ $json.changed }}",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        1104,
        0
      ],
      "id": "aw333333-3333-3333-3333-aw3333333306",
      "name": "Data Changed?"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "alert-001",
              "name": "alert",
              "value": "=Price {{ $json.direction }} for {{ $json.productName }}: {{ $json.previousPrice }} → {{ $json.currentPrice }} ({{ $json.direction === 'dropped' ? '-' : '+' }}{{ $json.diff }})",
              "type": "string"
            },
            {
              "id": "alert-002",
              "name": "severity",
              "value": "={{ $json.direction === 'dropped' ? 'deal' : 'info' }}",
              "type": "string"
            },
            {
              "id": "alert-003",
              "name": "checkedAt",
              "value": "={{ $json.checkedAt }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1408,
        -80
      ],
      "id": "aw333333-3333-3333-3333-aw3333333307",
      "name": "Build Alert"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "nc-001",
              "name": "status",
              "value": "no_change",
              "type": "string"
            },
            {
              "id": "nc-002",
              "name": "currentPrice",
              "value": "={{ $json.currentPrice }}",
              "type": "string"
            },
            {
              "id": "nc-003",
              "name": "checkedAt",
              "value": "={{ $json.checkedAt }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1408,
        128
      ],
      "id": "aw333333-3333-3333-3333-aw3333333308",
      "name": "No Change"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "price-monitor-aws-waf",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        -400,
        420
      ],
      "id": "aw333333-3333-3333-3333-aw3333333309",
      "name": "Webhook Trigger",
      "webhookId": "aw333333-aaaa-bbbb-cccc-aw3333333309",
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "operation": "AWS WAF",
        "type": "AntiAwsWafTaskProxyLess",
        "websiteURL": "https://YOUR-TARGET-SITE.com/product-page",
        "optional": {}
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        -96,
        420
      ],
      "id": "aw333333-3333-3333-3333-aw3333333310",
      "name": "Solve AWS WAF [Webhook]",
      "credentials": {
        "capSolverApi": {
          "id": "YOUR_CREDENTIAL_ID",
          "name": "CapSolver account"
        }
      }
    },
    {
      "parameters": {
        "url": "https://YOUR-TARGET-SITE.com/product-page",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "user-agent",
              "value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
            },
            {
              "name": "Cookie",
              "value": "={{ $json.data.solution.cookie }}"
            }
          ]
        },
        "options": {
          "response": {
            "response": {
              "fullResponse": false
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        208,
        420
      ],
      "id": "aw333333-3333-3333-3333-aw3333333311",
      "name": "Fetch Product Page [Webhook]"
    },
    {
      "parameters": {
        "operation": "extractHtmlContent",
        "sourceData": "json",
        "dataPropertyName": "data",
        "extractionValues": {
          "values": [
            {
              "key": "price",
              "cssSelector": ".product-price, [data-price], .price",
              "returnValue": "text",
              "returnArray": false
            },
            {
              "key": "productName",
              "cssSelector": "h1, .product-title",
              "returnValue": "text",
              "returnArray": false
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.html",
      "typeVersion": 1.2,
      "position": [
        512,
        420
      ],
      "id": "aw333333-3333-3333-3333-aw3333333312",
      "name": "Extract Data [Webhook]"
    },
    {
      "parameters": {
        "jsCode": "// Get current and previous price from workflow static data\nconst staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Product';\n\n// Parse numeric values for comparison\nconst parsePrice = (str) => {\n  if (!str) return null;\n  const match = str.match(/[\\d,]+\\.?\\d*/);\n  return match ? parseFloat(match[0].replace(',', '')) : null;\n};\n\nconst currentNum = parsePrice(currentPrice);\nconst previousNum = parsePrice(previousPrice);\n\n// Update stored price\nstaticData.lastPrice = currentPrice;\nstaticData.lastChecked = new Date().toISOString();\n\nconst changed = previousNum !== null && currentNum !== null && currentNum !== previousNum;\nconst direction = changed ? (currentNum < previousNum ? 'dropped' : 'increased') : 'unchanged';\nconst diff = changed ? Math.abs(currentNum - previousNum).toFixed(2) : '0';\n\nreturn [{\n  json: {\n    productName,\n    currentPrice,\n    previousPrice: previousPrice || 'first check',\n    changed,\n    direction,\n    diff: changed ? `$${diff}` : null,\n    checkedAt: new Date().toISOString()\n  }\n}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        800,
        420
      ],
      "id": "aw333333-3333-3333-3333-aw3333333313",
      "name": "Compare Data [Webhook]"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "price-if-002",
              "leftValue": "={{ $json.changed }}",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        1104,
        420
      ],
      "id": "aw333333-3333-3333-3333-aw3333333314",
      "name": "Data Changed? [Webhook]"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "alert-004",
              "name": "alert",
              "value": "=Price {{ $json.direction }} for {{ $json.productName }}: {{ $json.previousPrice }} → {{ $json.currentPrice }} ({{ $json.direction === 'dropped' ? '-' : '+' }}{{ $json.diff }})",
              "type": "string"
            },
            {
              "id": "alert-005",
              "name": "severity",
              "value": "={{ $json.direction === 'dropped' ? 'deal' : 'info' }}",
              "type": "string"
            },
            {
              "id": "alert-006",
              "name": "checkedAt",
              "value": "={{ $json.checkedAt }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1408,
        340
      ],
      "id": "aw333333-3333-3333-3333-aw3333333315",
      "name": "Build Alert [Webhook]"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "nc-004",
              "name": "status",
              "value": "no_change",
              "type": "string"
            },
            {
              "id": "nc-005",
              "name": "currentPrice",
              "value": "={{ $json.currentPrice }}",
              "type": "string"
            },
            {
              "id": "nc-006",
              "name": "checkedAt",
              "value": "={{ $json.checkedAt }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1408,
        548
      ],
      "id": "aw333333-3333-3333-3333-aw3333333316",
      "name": "No Change [Webhook]"
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify($json) }}",
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.5,
      "position": [
        1712,
        420
      ],
      "id": "aw333333-3333-3333-3333-aw3333333317",
      "name": "Respond to Webhook [Webhook]"
    }
  ],
  "connections": {
    "Every 6 Hours": {
      "main": [
        [
          {
            "node": "Solve AWS WAF",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Solve AWS WAF": {
      "main": [
        [
          {
            "node": "Fetch Product Page",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Product Page": {
      "main": [
        [
          {
            "node": "Extract Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Data": {
      "main": [
        [
          {
            "node": "Compare Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Compare Data": {
      "main": [
        [
          {
            "node": "Data Changed?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Data Changed?": {
      "main": [
        [
          {
            "node": "Build Alert",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "No Change",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook Trigger": {
      "main": [
        [
          {
            "node": "Solve AWS WAF [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Solve AWS WAF [Webhook]": {
      "main": [
        [
          {
            "node": "Fetch Product Page [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Product Page [Webhook]": {
      "main": [
        [
          {
            "node": "Extract Data [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Data [Webhook]": {
      "main": [
        [
          {
            "node": "Compare Data [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Compare Data [Webhook]": {
      "main": [
        [
          {
            "node": "Data Changed? [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Data Changed? [Webhook]": {
      "main": [
        [
          {
            "node": "Build Alert [Webhook]",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "No Change [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build Alert [Webhook]": {
      "main": [
        [
          {
            "node": "Respond to Webhook [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "No Change [Webhook]": {
      "main": [
        [
          {
            "node": "Respond to Webhook [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  }
}

Flujo de trabajo: Automatización de inicio de sesión de cuenta — Resolver AWS WAF y enviar credenciales

Este flujo de trabajo automatiza el envío de formularios de inicio de sesión protegidos por AWS WAF de principio a fin. Resuelve el desafío de AWS WAF antes de enviar las credenciales.

Cómo funciona

Este flujo de trabajo consta de cinco nodos:

  1. Webhook — Recibe solicitudes POST entrantes que activan la automatización de inicio de sesión
  2. Resolver AWS WAF — Envía el desafío a CapSolver y espera una solución
  3. Enviar formulario de inicio de sesión — Realiza una solicitud HTTP POST al sitio de destino, que contiene las credenciales y la cookie de AWS WAF resuelta
  4. Responder al Webhook — Devuelve el resultado del inicio de sesión

Configuración del nodo

1. Nodo Webhook

Configuración Valor
Método HTTP POST
Ruta login-aws-waf
Responder Response Node

Esto crea un endpoint en: https://your-n8n-instance.com/webhook/login-aws-waf

2. Resolver AWS WAF (CapSolver)

Parámetro Valor
Operación AWS WAF
URL del sitio web https://YOUR-TARGET-SITE.com/login

También selecciona tus credenciales de CapSolver.

3. Enviar formulario de inicio de sesión (Solicitud HTTP)

Configuración Valor
Método POST
URL https://YOUR-TARGET-SITE.com/login
Tipo de contenido form-urlencoded
Parámetros del cuerpo username=YOUR_USERNAME, password=YOUR_PASSWORD, Cookie={{ $('Solve AWS WAF').item.json.data.solution.cookie }}

Importante: Asegúrate de reemplazar YOUR_USERNAME y YOUR_PASSWORD con las credenciales reales. Además, es posible que debas ajustar los nombres de los campos del formulario para que coincidan con el HTML del sitio de destino.

4. Responder al Webhook (Éxito/Fallo)

Configuración Valor
Responder con JSON
Cuerpo de la respuesta ={{ JSON.stringify($json) }}

Pruébalo

Envía una solicitud POST a tu endpoint de webhook:

bash Copy
curl -X POST https://your-n8n-instance.com/webhook/login-aws-waf \
  -H "Content-Type: application/json" \
  -d '{
    "websiteURL": "https://example.com/login",
    "username": "testuser",
    "password": "testpass"
  }'

Respuesta esperada (éxito):

json Copy
{
  "status": "success",
  "message": "Login successful",
  "solution": {
    "cookie": "aws-waf-token=AQAAAA..."
  }
}

Respuesta esperada (fallo):

json Copy
{
  "status": "failed",
  "message": "Login failed: Invalid credentials or captcha",
  "error": "..."
}

Importar este flujo de trabajo

Copia el JSON a continuación e impórtalo a n8n a través de Menu -> Import from JSON:

Haz clic para expandir el JSON completo del flujo de trabajo
json Copy
{
  "name": "AWS WAF Account Login — CapSolver + Schedule + Webhook",
  "nodes": [
    {
      "parameters": {
        "content": "## Automatización de inicio de sesión de cuenta de AWS WAF — CapSolver + Programación + Webhook\n\n**Para quién:** Equipos que necesitan automatizar el inicio de sesión en cuentas protegidas por AWS WAF.\n\n**Qué hace:** Resuelve el desafío de AWS WAF y luego envía el formulario de inicio de sesión con la cookie resuelta y las credenciales del usuario.\n\n**Cómo funciona:**\n1. El Webhook activa el flujo.\n2. CapSolver resuelve el desafío de AWS WAF.\n3. La solicitud HTTP envía el formulario de inicio de sesión con la cookie resuelta y las credenciales del usuario.\n4. El Webhook responde con el resultado del inicio de sesión.\n\n**Configuración:**\n1. Agrega tu clave de API de CapSolver en **Settings → Credentials**.\n2. Reemplaza las URLs de marcador de posición y las credenciales.\n3. Ajusta los nombres de los campos del formulario para que coincidan con tu sitio de destino.\n4. Activa el flujo de trabajo.",
        "height": 480,
        "width": 460,
        "color": 1
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -728,
        -400
      ],
      "id": "sticky-blog-main-1773678228096-1",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "login-aws-waf",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        -400,
        0
      ],
      "id": "aw444444-4444-4444-4444-aw4444444401",
      "name": "Webhook Trigger",
      "webhookId": "aw444444-aaaa-bbbb-cccc-aw4444444401",
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "operation": "AWS WAF",
        "type": "AntiAwsWafTaskProxyLess",
        "websiteURL": "={{ $json.body.websiteURL }}",
        "optional": {}
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        -96,
        0
      ],
      "id": "aw444444-4444-4444-4444-aw4444444402",
      "name": "Solve AWS WAF",
      "credentials": {
        "capSolverApi": {
          "id": "YOUR_CREDENTIAL_ID",
          "name": "CapSolver account"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "url": "={{ $json.body.websiteURL }}",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "user-agent",
              "value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
            },
            {
              "name": "Content-Type",
              "value": "application/x-www-form-urlencoded"
            },
            {
              "name": "Cookie",
              "value": "={{ $('Solve AWS WAF').item.json.data.solution.cookie }}}"
            }
          ]
        },
        "sendBody": true,
        "contentType": "form-urlencoded",
        "bodyParameters": {
          "parameters": [
            {
              "name": "username",
              "value": "={{ $json.body.username }}"
            },
            {
              "name": "password",
              "value": "={{ $json.body.password }}"
            }
          ]
        },
        "options": {
          "response": {
            "response": {
              "fullResponse": false
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        208,
        0
      ],
      "id": "aw444444-4444-4444-4444-aw4444444403",
      "name": "Submit Login Form"
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify($json) }}",
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.5,
      "position": [
        512,
        0
      ],
      "id": "aw444444-4444-4444-4444-aw4444444404",
      "name": "Respond to Webhook"
    }
  ],
  "connections": {
    "Webhook Trigger": {
      "main": [
        [
          {
            "node": "Solve AWS WAF",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Solve AWS WAF": {
      "main": [
        [
          {
            "node": "Submit Login Form",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Submit Login Form": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  }
}

Solución de problemas

"Acceso a AWS WAF no encontrado"

Este error significa que tu cuenta o plan de CapSolver no incluye acceso a AWS WAF. Por favor, verifica tu panel de CapSolver para verificar si tu plan incluye este servicio.

"URL del sitio web inválida"

Este error indica que el parámetro websiteURL que proporcionaste en el nodo de CapSolver es incorrecto. Por favor, revisa la pestaña de red de las herramientas de desarrollo del sitio de destino para asegurarte de que estás utilizando el valor correcto.

"Inicio de sesión fallido, aunque AWS WAF se haya resuelto"

Si AWS WAF se resolvió con éxito, pero el inicio de sesión aún falla, puede haber un problema con:

  • Credenciales incorrectas: Vuelve a verificar el nombre de usuario y la contraseña que enviaste en el formulario de inicio de sesión.
  • Desajuste de sesión: Si el proceso de inicio de sesión implica sesiones o cookies, asegúrate de mantener la misma sesión entre la obtención del desafío de AWS WAF y el envío del formulario de inicio de sesión.
  • Otros campos del formulario: El sitio de destino puede requerir campos ocultos adicionales, tokens CSRF u otros parámetros para un inicio de sesión exitoso. Inspecciona el HTML del formulario para identificar cualquier otro campo necesario.
  • Agente de usuario: Algunos sitios pueden rechazar solicitudes basándose en la cadena del agente de usuario. Intenta establecer un agente de usuario de navegador común en tus solicitudes HTTP.

"Credenciales de CapSolver inválidas"

Este error indica que tu clave de API de CapSolver configurada en n8n es incorrecta o ha caducado. Por favor, revisa tu panel de CapSolver y actualiza las credenciales en n8n.


Mejores prácticas

  1. Mantener la sesión: Si el sitio de destino utiliza sesiones o cookies, asegúrate de mantener la misma sesión entre la obtención del desafío y el envío del formulario. En n8n, puedes usar nodos de solicitud HTTP para manejar cookies.
  2. Validar parámetros: Vuelve a verificar que la websiteURL y cualquier parámetro opcional awsKey, awsIv, awsContext, awsChallengeJS y awsApiJs sean correctos. Estos son clave para una resolución exitosa de AWS WAF.
  3. Manejar errores: Incluye lógica de manejo de errores en tus flujos de trabajo para manejar elegantemente los fallos de resolución o inicio de sesión. Esto puede incluir mecanismos de reintento o notificaciones.
  4. Usar un agente de usuario apropiado: Establece una cadena de agente de usuario de navegador común en todas tus solicitudes HTTP para evitar ser bloqueado por el sitio.
  5. Probar e iterar: Las implementaciones de AWS WAF pueden variar de un sitio a otro. Comienza poco a poco, prueba tu flujo de trabajo e itera según sea necesario para asegurarte de que funciona de manera confiable en tu objetivo específico.
  6. No se necesita proxy: A diferencia de otros tipos de captcha, la resolución de AWS WAF generalmente no requiere que proporciones un proxy. CapSolver maneja los requisitos de proxy internamente.

¿Listo para empezar? Regístrate en CapSolver y usa el código de bonificación n8n para obtener un 8% de bonificación adicional en tu primera recarga.

Banner de código de bonificación de CapSolver

Conclusión

Has aprendido a construir una API de resolución de AWS WAF y flujos de trabajo de automatización de inicio de sesión de cuenta usando n8n y CapSolver.

Resumen:

  • Cómo funciona AWS WAF — Utiliza desafíos invisibles y autenticación basada en cookies.
  • Cómo identificar los parámetros de AWS WAF — Usa la pestaña de red de las herramientas de desarrollo para encontrar indicadores y parámetros opcionales.
  • Un endpoint de API de resolución — Acepta parámetros de AWS WAF y devuelve un token de cookie resuelto.
  • Un flujo de trabajo de automatización de inicio de sesión de cuenta — Resuelve AWS WAF antes de enviar las credenciales.
  • Consejos para la solución de problemas — Maneja errores comunes como URLs inválidas, inicios de sesión fallidos y credenciales inválidas.
  • Mejores prácticas — Mantén la sesión, valida los parámetros, maneja los errores y usa un agente de usuario apropiado.

La principal complejidad de AWS WAF radica en sus desafíos invisibles y la autenticación basada en cookies. Al manejar correctamente la cookie aws-waf-token en las solicitudes HTTP, puedes automatizar eficazmente la resolución de AWS WAF. Luego puedes integrar sin problemas estos tokens resueltos en tus flujos de trabajo de inicio de sesión o extracción.

Consejo: Estos flujos de trabajo utilizan disparadores de Webhook, pero puedes intercambiar el nodo de disparador por cualquier otro disparador de n8n — manual, eventos de aplicación, envíos de formularios, etc. Una vez que se resuelve AWS WAF, usa los nodos integrados de n8n para guardar los resultados en Hojas de cálculo de Google, bases de datos, almacenamiento en la nube o enviar alertas a través de Telegram/Slack/Correo electrónico.


Preguntas frecuentes

¿Qué es AWS WAF?

AWS WAF es un firewall de aplicaciones web de nivel empresarial de Amazon que protege los sitios web del tráfico de bots y el abuso mediante desafíos invisibles y verificación basada en tokens.

¿En qué se diferencia AWS WAF de reCAPTCHA o Turnstile?

AWS WAF no requiere una clave de sitio, sino que utiliza autenticación basada en cookies y devuelve una cookie aws-waf-token. Suele ser un desafío invisible sin un widget visible para la interacción del usuario.

¿Cuánto cuesta resolver un desafío de AWS WAF?

Los precios varían según el uso. Consulta la página de precios de CapSolver para conocer los precios actuales de AWS WAF. Las tareas de resolución de AWS WAF suelen ser más caras que el simple reconocimiento de imagen a texto, pero más baratas que otros tipos de captcha complejos.

¿Cuánto tiempo se tarda en resolver un desafío de AWS WAF?

Las tareas de resolución de AWS WAF suelen tardar entre 10 y 30 segundos, dependiendo de la complejidad del desafío y la carga del servidor de CapSolver. A diferencia de ImageToTextTask, la resolución de AWS WAF implica la creación y el sondeo de tareas, por lo que no es instantánea.

¿Necesito un proxy para AWS WAF?

El servicio de resolución de AWS WAF de CapSolver generalmente no requiere que proporciones un proxy. CapSolver maneja los requisitos de proxy internamente. Solo necesitas proporcionar la websiteURL y cualquier parámetro opcional.

¿Por qué no se acepta mi aws-waf-token?

Si el aws-waf-token no se acepta, verifica lo siguiente:

  • Desajuste de sesión: Asegúrate de mantener la misma sesión y cookies entre la obtención del desafío de AWS WAF y el envío del formulario.
  • Otros campos del formulario: Inspecciona el HTML del formulario para ver si hay otros campos ocultos o tokens CSRF que deban enviarse.
  • Agente de usuario: Intenta establecer un agente de usuario de navegador común en tus solicitudes HTTP.
  • Parámetros opcionales: Si el sitio utiliza parámetros opcionales como awsKey, awsIv, etc., asegúrate de haberlos proporcionado correctamente.

¿Qué pasa si AWS WAF se resuelve con éxito pero el inicio de sesión aún falla?

Si AWS WAF se resuelve con éxito pero el inicio de sesión aún falla, verifica lo siguiente:

  • Credenciales: Asegúrate de haber enviado el nombre de usuario y la contraseña correctos.
  • Sesión/Cookies: Asegúrate de mantener la misma sesión y cookies entre la obtención del desafío y el envío del formulario de inicio de sesión.
  • Otros campos del formulario: Inspecciona el HTML del formulario para ver si hay otros campos ocultos o tokens CSRF que deban enviarse.
  • Agente de usuario: Intenta establecer un agente de usuario de navegador común en tus solicitudes HTTP.

¿Puedo usar este flujo de trabajo con n8n Cloud?

Sí. Este flujo de trabajo funciona tanto con n8n autoalojado como con n8n Cloud. El nodo de CapSolver ya está disponible como una integración oficial; solo necesitas agregar tus credenciales de API.

Ver más

n8nMar 09, 2026

Cómo Resolver reCAPTCHA v2/v3 Usando CapSolver y n8n

Crea una API para resolver reCAPTCHA v2/v3 utilizando CapSolver y n8n. Aprende a automatizar la obtención de tokens, enviarlos a los sitios web y extraer datos protegidos sin necesidad de programar.

Aloísio Vítor
Aloísio Vítor
n8nMar 12, 2026

Cómo resolver GeeTest V3 en n8n con CapSolver: Guía completa de integración

Aprende a integrar CapSolver con n8n para resolver GeeTest V3 y crear flujos de trabajo de automatización fiables.

Contenido

Ethan Collins
Ethan Collins
n8nMar 16, 2026

Cómo resolver ImageToText usando CapSolver y n8n

imagen a texto, solucionador de captcha, captcha OCR, capsolver, n8n, flujo de trabajo n8n, automatización, API OCR, automatización de captcha, imagen base64, reconocimiento de imágenes, OCR con IA, webhook, flujo de trabajo programado, automatización de formularios, omisión de captcha, gestión de sesiones, captcha sin proxy, OCR instantáneo, reconocimiento de texto

Nikolai Smirnov
Nikolai Smirnov
n8nMar 17, 2026

Cómo usar CapSolver en n8n: La guía completa para resolver CAPTCHA en tus flujos de trabajo

Aprende cómo integrar CapSolver con n8n para resolver CAPTCHAs y crear flujos de trabajo de automatización confiables con facilidad.

Adélia Cruz
Adélia Cruz
Blog
n8n