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
Blog/n8n/Cómo resolver GeeTest V3 en n8n con CapSolver: Guía completa de integración
Mar12, 2026

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

Ethan Collins

Ethan Collins

Pattern Recognition Specialist

GeeTest V3 es uno de los CAPTCHA conductuales más ampliamente desplegados en la web. A diferencia de los simples desafíos de casilla de verificación, GeeTest V3 utiliza rompecabezas interactivos (deslizar para verificar, selección de iconos y coincidencia de palabras) para distinguir a los humanos de los bots. Se encuentra comúnmente en páginas de inicio de sesión, formularios de registro y sitios con gran cantidad de datos en Asia y, cada vez más, en todo el mundo.

¿Qué pasaría si pudieras resolver GeeTest V3 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 visual de automatización de flujos de trabajo) con CapSolver (un servicio de resolución de captcha impulsado por IA) para resolver desafíos de GeeTest V3 bajo demanda, ya sea como un punto final de API independiente o como un paso dentro de cualquier flujo de trabajo de automatización.

Lo que construirás:

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

  • Una API de resolución de GeeTest V3

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 GeeTest V3, obtiene páginas protegidas y alerta sobre cambios de precios
  • Una automatización de inicio de sesión de cuenta que resuelve GeeTest V3 antes de enviar las credenciales

¿Qué es GeeTest V3?

GeeTest V3 es un sistema CAPTCHA de desafío-respuesta que verifica a los usuarios a través de tareas interactivas. A diferencia de reCAPTCHA (que usa un solo token) o Cloudflare Turnstile (que se ejecuta de forma invisible), GeeTest V3 presenta rompecabezas visibles que requieren la interacción del usuario:

  • Rompecabezas deslizante — Arrastra un deslizador para completar una pieza de rompecabezas
  • Clic de icono — Haz clic en iconos específicos en el orden correcto
  • Coincidencia de palabras — Selecciona caracteres que coincidan con una indicación

Desde una perspectiva de resolución, GeeTest V3 tiene dos parámetros críticos:

  • gt — Un identificador por sitio (como una clave de sitio). Esto es estático — no cambia entre sesiones.
  • challenge — Un token por sesión. Esto es dinámico — cambia cada vez y caduca en aproximadamente 60-120 segundos.

Este parámetro challenge dinámico es la diferencia clave con otros tipos de CAPTCHA. Cada flujo de trabajo que resuelve GeeTest V3 necesita un paso adicional para obtener un desafío nuevo antes de enviarlo a CapSolver.

Formato de solución: A diferencia de reCAPTCHA o Turnstile que devuelven un solo token, GeeTest V3 devuelve tres valores separados:

  • challenge — La cadena de desafío resuelta
  • validate — El hash de validación
  • seccode — El código de seguridad

Estos se envían como tres campos de formulario: geetest_challenge, geetest_validate y geetest_seccode.

GeeTest V3 vs V4: GeeTest V4 utiliza una estructura de API diferente (captcha_id en lugar de gt, sin una obtención de challenge separada). Esta guía cubre específicamente V3. Si ves captcha_id en el código fuente de la página, estás tratando con V4.


Requisitos previos

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

  1. Una instancia de n8n — Autohospedada o n8n Cloud
  2. Una cuenta de CapSolver — Regístrate aquí y obtén tu clave de API
  3. El nodo CapSolver 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 GeeTest V3 consumen créditos según el uso.


Configuración de CapSolver en n8n

CapSolver está disponible como una integración oficial en n8n, sin necesidad de instalar 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 que muestra 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 GeeTest V3!


Cómo identificar los parámetros de GeeTest V3

Antes de que puedas resolver un desafío de GeeTest V3, necesitas encontrar tres cosas: el parámetro gt, el punto final de la API de desafío, y entender cómo se obtiene dinámicamente el valor challenge.

Método 1: Pestaña de red de las herramientas de desarrollo

  1. Abre las Herramientas de desarrollo (F12) -> pestaña Red
  2. Activa el desafío GeeTest en la página
  3. Busca solicitudes que contengan gt= en la URL o respuestas que contengan los campos "gt" y "challenge"
  4. Patrones de punto final comunes:
    • /api/geetest/register
    • /gt/register-slide
    • /captcha?gt=...
  5. La respuesta suele tener este aspecto:
json Copy
{
  "gt": "81dc9bdb52d04dc20036dbd8313ed055",
  "challenge": "4a8a08f09d37b73795649038408b5f33ab",
  "success": 1,
  "new_captcha": true
}

Entendiendo el desafío dinámico

Este es el concepto más importante para la automatización de GeeTest V3:

  • El valor gt es estático por sitio; permanece igual en todas las sesiones
  • El valor challenge es dinámico; cambia cada vez y caduca en ~60-120 segundos
  • Debes obtener un challenge nuevo inmediatamente antes de enviar la solicitud de resolución a CapSolver
  • El punto final de la API de desafío es específico del sitio (por ejemplo, https://example.com/api/geetest/register)

Esto significa que cada flujo de trabajo de GeeTest V3 necesita un nodo de solicitud HTTP adicional antes del nodo de CapSolver para obtener el desafío nuevo. Esta es la diferencia estructural clave con los flujos de trabajo de reCAPTCHA o Turnstile.

Consejo: Agrega ?t={{ Date.now() }} a la URL de la API de desafío como un parámetro para evitar el almacenamiento en caché y asegurarte de que siempre obtengas un desafío nuevo.

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 GeeTest V3

Este flujo de trabajo crea un punto final POST que acepta parámetros de GeeTest V3 y devuelve un desafío resuelto. A diferencia de los solucionadores de reCAPTCHA o Turnstile, el llamador debe proporcionar el valor challenge (recién obtenido) junto con gt y websiteURL.

Flujo de trabajo de resolución de GeeTest V3 en n8n

Cómo funciona

El flujo de trabajo consta de cuatro nodos:

  1. Webhook — Recibe solicitudes POST entrantes con parámetros de GeeTest V3
  2. GeeTest V3 — 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-geetest-v3
Responder Response Node

Esto crea un punto final en: https://your-n8n-instance.com/webhook/solver-geetest-v3

2. Nodo CapSolver GeeTest V3

Parámetro Valor Descripción
Operación GeeTest V3 Debe configurarse en GeeTest V3
Tipo GeeTestTaskProxyLess Única opción disponible — variante sin proxy
URL del sitio web ={{ $json.body.websiteURL }} La URL de la página con el desafío GeeTest
GT ={{ $json.body.gt }} El identificador de GeeTest por sitio
Desafío ={{ $json.body.challenge }} El desafío dinámico por sesión (debe ser nuevo)
Subdominio del servidor API de GeeTest (Opcional) Servidor API de GeeTest personalizado si el sitio utiliza uno

También selecciona tus credenciales de CapSolver en el 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) }}

Pruébalo

Envía una solicitud POST a tu punto final de webhook:

bash Copy
curl -X POST https://your-n8n-instance.com/webhook/solver-geetest-v3 \
  -H "Content-Type: application/json" \
  -d '{
    "websiteURL": "https://example.com/login",
    "gt": "81dc9bdb52d04dc20036dbd8313ed055",
    "challenge": "4a8a08f09d37b73795649038408b5f33ab"
  }'

Respuesta esperada:

json Copy
{
  "taskId": "abc123...",
  "solution": {
    "challenge": "4a8a08f09d37b73795649038408b5f33",
    "validate": "68f0c05d0c8a8b2b1e2f3a4b5c6d7e8f",
    "seccode": "68f0c05d0c8a8b2b1e2f3a4b5c6d7e8f|jordan"
  },
  "status": "ready"
}

Importante: El challenge en el cuerpo de la solicitud debe ser recién obtenido. Si envías un desafío caducado, CapSolver no podrá resolverlo. Los desafíos suelen caducar en 60-120 segundos.

Importar este flujo de trabajo

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

Haz clic para expandir el JSON del flujo de trabajo
json Copy
{
  "name": "GeeTest V3 Scraping — Price & Product Details — CapSolver + Schedule + Webhook",
  "nodes": [
    {
      "parameters": {
        "content": "## Raspado de GeeTest V3 — Monitor de precios y productos\n\n**Para quién:** Equipos que monitorean precios o datos de productos en sitios protegidos por GeeTest V3.\n\n**Qué hace:** Resuelve GeeTest V3, 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. El programador (cada 6h) o el Webhook activan el flujo\n2. CapSolver resuelve el desafío GeeTest V3\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 URL 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 Crear alerta a tu canal de notificación",
        "height": 560,
        "width": 460,
        "color": 1
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -1220,
        -380
      ],
      "id": "sticky-blog-main-1773678228108-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": 2200,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -740,
        -280
      ],
      "id": "sticky-blog-section-1773678228108-2",
      "name": "Sticky Note1"
    },
    {
      "parameters": {
        "content": "### Ruta de Webhook\nActivador bajo demanda — misma lógica, devuelve el resultado como respuesta JSON.",
        "height": 480,
        "width": 2200,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -740,
        140
      ],
      "id": "sticky-blog-section-1773678228108-3",
      "name": "Sticky Note2"
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 6
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.3,
      "position": [
        -700,
        0
      ],
      "id": "88888888-8888-8888-8888-888888888801",
      "name": "Every 6 Hours"
    },
    {
      "parameters": {
        "url": "https://YOUR-TARGET-SITE.com/api/geetest/register?t={{ Date.now() }}",
        "options": {
          "response": {
            "response": {
              "fullResponse": false
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        -400,
        0
      ],
      "id": "88888888-8888-8888-8888-888888888802",
      "name": "Fetch GeeTest Challenge"
    },
    {
      "parameters": {
        "operation": "GeeTest V3",
        "websiteURL": "https://YOUR-TARGET-SITE.com/product-page",
        "gt": "={{ $json.gt }}",
        "challenge": "={{ $json.challenge }}",
        "optional": {}
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        -96,
        0
      ],
      "id": "88888888-8888-8888-8888-888888888803",
      "name": "Solve GeeTest V3",
      "credentials": {
        "capSolverApi": {
          "id": "YOUR_CREDENTIAL_ID",
          "name": "CapSolver account"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "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": "content-type",
              "value": "application/x-www-form-urlencoded"
            }
          ]
        },
        "sendBody": true,
        "contentType": "form-urlencoded",
        "bodyParameters": {
          "parameters": [
            {
              "name": "geetest_challenge",
              "value": "={{ $(\'Solve GeeTest V3\').item.json.data.solution.challenge }}"
            },
            {
              "name": "geetest_validate",
              "value": "={{ $(\'Solve GeeTest V3\').item.json.data.solution.validate }}"
            },
            {
              "name": "geetest_seccode",
              "value": "={{ $(\'Solve GeeTest V3\').item.json.data.solution.seccode }}"
            }
          ]
        },
        "options": {
          "response": {
            "response": {
              "fullResponse": false
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        208,
        0
      ],
      "id": "88888888-8888-8888-8888-888888888804",
      "name": "Fetch Product Page"
    },
    {
      "parameters": {
        "operation": "extractHtmlContent",
        "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": "88888888-8888-8888-8888-888888888805",
      "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": "88888888-8888-8888-8888-888888888806",
      "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": "88888888-8888-8888-8888-888888888807",
      "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": "88888888-8888-8888-8888-888888888808",
      "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": "88888888-8888-8888-8888-888888888809",
      "name": "No Change"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "price-monitor-geetest-v3",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        -700,
        420
      ],
      "id": "88888888-8888-8888-8888-888888888810",
      "name": "Webhook Trigger",
      "webhookId": "88888888-aaaa-bbbb-cccc-888888888810",
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "url": "https://YOUR-TARGET-SITE.com/api/geetest/register?t={{ Date.now() }}",
        "options": {
          "response": {
            "response": {
              "fullResponse": false
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        -400,
        420
      ],
      "id": "88888888-8888-8888-8888-888888888811",
      "name": "Fetch GeeTest Challenge [Webhook]"
    },
    {
      "parameters": {
        "operation": "GeeTest V3",
        "websiteURL": "https://YOUR-TARGET-SITE.com/product-page",
        "gt": "={{ $json.gt }}",
        "challenge": "={{ $json.challenge }}",
        "optional": {}
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        -96,
        420
      ],
      "id": "88888888-8888-8888-8888-888888888812",
      "name": "Solve GeeTest V3 [Webhook]",
      "credentials": {
        "capSolverApi": {
          "id": "YOUR_CREDENTIAL_ID",
          "name": "CapSolver account"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "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": "content-type",
              "value": "application/x-www-form-urlencoded"
            }
          ]
        },
        "sendBody": true,
        "contentType": "form-urlencoded",
        "bodyParameters": {
          "parameters": [
            {
              "name": "geetest_challenge",
              "value": "={{ $(\'Solve GeeTest V3 [Webhook]\').item.json.data.solution.challenge }}"
            },
            {
              "name": "geetest_validate",
              "value": "={{ $(\'Solve GeeTest V3 [Webhook]\').item.json.data.solution.validate }}"
            },
            {
              "name": "geetest_seccode",
              "value": "={{ $(\'Solve GeeTest V3 [Webhook]\').item.json.data.solution.seccode }}"
            }
          ]
        },
        "options": {
          "response": {
            "response": {
              "fullResponse": false
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        208,
        420
      ],
      "id": "88888888-8888-8888-8888-888888888813",
      "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": "88888888-8888-8888-8888-888888888814",
      "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": "88888888-8888-8888-8888-888888888815",
      "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": "88888888-8888-8888-8888-888888888816",
      "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": "88888888-8888-8888-8888-888888888817",
      "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": "88888888-8888-8888-8888-888888888818",
      "name": "No Change [Webhook]"
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify($json) }}",
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.5,
      "position": [
        1712,
        420
      ],
      "id": "88888888-8888-8888-8888-888888888819",
      "name": "Respond to Webhook [Webhook]"
    }
  ],
  "connections": {
    "Every 6 Hours": {
      "main": [
        [
          {
            "node": "Fetch GeeTest Challenge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch GeeTest Challenge": {
      "main": [
        [
          {
            "node": "Solve GeeTest V3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Solve GeeTest V3": {
      "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": "Fetch GeeTest Challenge [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch GeeTest Challenge [Webhook]": {
      "main": [
        [
          {
            "node": "Solve GeeTest V3 [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Solve GeeTest V3 [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 GeeTest V3 y enviar credenciales

Este flujo de trabajo automatiza el envío de formularios de inicio de sesión protegidos por GeeTest V3 de principio a fin. Resuelve el desafío GeeTest V3 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. Obtener desafío GeeTest — Realiza una solicitud HTTP al sitio de destino para obtener un nuevo valor de challenge
  3. Resolver GeeTest V3 — Envía gt, challenge y websiteURL a CapSolver
  4. Enviar formulario de inicio de sesión — Realiza una solicitud HTTP POST al sitio de destino, que contiene las credenciales y el token de GeeTest V3 resuelto
  5. 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-geetest-v3
Responder Response Node

Esto crea un punto final en: https://your-n8n-instance.com/webhook/login-geetest-v3

2. Obtener desafío GeeTest (Solicitud HTTP)

Configuración Valor
URL https://YOUR-TARGET-SITE.com/api/geetest/register?t={{ Date.now() }}
Opciones Full Response = false

Esto devolverá una respuesta JSON que contiene los valores gt y challenge.

3. Resolver GeeTest V3 (CapSolver)

Parámetro Valor
Operación GeeTest V3
URL del sitio web https://YOUR-TARGET-SITE.com/login
GT ={{ $json.gt }}
Desafío ={{ $json.challenge }}

También selecciona tus credenciales de CapSolver.

4. 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, geetest_challenge={{ $(\'Solve GeeTest V3\').item.json.data.solution.challenge }}, geetest_validate={{ $(\'Solve GeeTest V3\').item.json.data.solution.validate }}, geetest_seccode={{ $(\'Solve GeeTest V3\').item.json.data.solution.seccode }}

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.

5. 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 punto final de webhook:

bash Copy
curl -X POST https://your-n8n-instance.com/webhook/login-geetest-v3 \
  -H "Content-Type: application/json" \
  -d ''

Respuesta esperada (éxito):

json Copy
{
  "status": "success",
  "message": "Login successful",
  "solution": {
    "challenge": "...",
    "validate": "...",
    "seccode": "..."
  }
}

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 en n8n a través de Menu -> Import from JSON:

Haz clic para expandir el JSON del flujo de trabajo
json Copy
{
  "name": "Account Login Automation — Solve GeeTest V3 & Submit Credentials",
  "nodes": [
    {
      "parameters": {
        "content": "## Automatización de inicio de sesión de cuenta — Resolver GeeTest V3 y enviar credenciales\n\n**Para quién:** Equipos que necesitan automatizar el inicio de sesión en cuentas protegidas por GeeTest V3.\n\n**Qué hace:** Obtiene el desafío GeeTest V3, lo resuelve con CapSolver y luego envía el formulario de inicio de sesión con el token resuelto y las credenciales del usuario.\n\n**Cómo funciona:**\n1. El Webhook activa el flujo\n2. La solicitud HTTP obtiene un nuevo desafío GeeTest V3\n3. CapSolver resuelve el desafío\n4. La solicitud HTTP envía el formulario de inicio de sesión, que contiene el token GeeTest V3 resuelto y las credenciales del usuario\n5. 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 URL 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": [
        -1020,
        -280
      ],
      "id": "sticky-login-main-1773678228108-1",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "login-geetest-v3",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        -700,
        0
      ],
      "id": "99999999-9999-9999-9999-999999999901",
      "name": "Webhook Trigger",
      "webhookId": "99999999-aaaa-bbbb-cccc-999999999901",
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "url": "https://YOUR-TARGET-SITE.com/api/geetest/register?t={{ Date.now() }}",
        "options": {
          "response": {
            "response": {
              "fullResponse": false
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        -400,
        0
      ],
      "id": "99999999-9999-9999-9999-999999999902",
      "name": "Fetch GeeTest Challenge"
    },
    {
      "parameters": {
        "operation": "GeeTest V3",
        "websiteURL": "https://YOUR-TARGET-SITE.com/login",
        "gt": "={{ $json.gt }}",
        "challenge": "={{ $json.challenge }}",
        "optional": {}
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        -96,
        0
      ],
      "id": "99999999-9999-9999-9999-999999999903",
      "name": "Solve GeeTest V3",
      "credentials": {
        "capSolverApi": {
          "id": "YOUR_CREDENTIAL_ID",
          "name": "CapSolver account"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://YOUR-TARGET-SITE.com/login",
        "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"
            }
          ]
        },
        "sendBody": true,
        "contentType": "form-urlencoded",
        "bodyParameters": {
          "parameters": [
            {
              "name": "username",
              "value": "YOUR_USERNAME"
            },
            {
              "name": "password",
              "value": "YOUR_PASSWORD"
            },
            {
              "name": "geetest_challenge",
              "value": "={{ $(\'Solve GeeTest V3\').item.json.data.solution.challenge }}"
            },
            {
              "name": "geetest_validate",
              "value": "={{ $(\'Solve GeeTest V3\').item.json.data.solution.validate }}"
            },
            {
              "name": "geetest_seccode",
              "value": "={{ $(\'Solve GeeTest V3\').item.json.data.solution.seccode }}"
            }
          ]
        },
        "options": {
          "response": {
            "response": {
              "fullResponse": false
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        208,
        0
      ],
      "id": "99999999-9999-9999-9999-999999999904",
      "name": "Submit Login Form"
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify($json) }}",
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.5,
      "position": [
        512,
        0
      ],
      "id": "99999999-9999-9999-9999-999999999905",
      "name": "Respond to Webhook"
    }
  ],
  "connections": {
    "Webhook Trigger": {
      "main": [
        [
          {
            "node": "Fetch GeeTest Challenge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch GeeTest Challenge": {
      "main": [
        [
          {
            "node": "Solve GeeTest V3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Solve GeeTest V3": {
      "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 GeeTest V3 no encontrado"

Este error significa que tu cuenta o plan de CapSolver no incluye acceso a GeeTest V3. Verifica tu panel de CapSolver para comprobar si tu plan incluye este servicio.

"Desafío caducado" o "Desafío no válido"

El valor challenge de GeeTest V3 es dinámico y caduca rápidamente (normalmente en 60-120 segundos). Debes obtener un challenge nuevo inmediatamente antes de enviar la solicitud de resolución a CapSolver. Asegúrate de que tu flujo de trabajo obtenga el challenge más reciente antes de cada intento de resolución.

"URL del sitio web no válida" o "Parámetro GT no válido"

Estos errores indican que los parámetros websiteURL o gt que proporcionaste en el nodo CapSolver son incorrectos. Vuelve a verificar la pestaña de red de las herramientas de desarrollo del sitio de destino para asegurarte de que estás utilizando los valores correctos.

Inicio de sesión fallido, incluso si GeeTest V3 se resolvió

Si GeeTest V3 se resolvió con éxito, pero el inicio de sesión sigue fallando, es posible que haya 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 GeeTest 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 requerido.
  • Agente de usuario: Algunos sitios pueden rechazar solicitudes basadas en la cadena del agente de usuario. Intenta establecer un agente de usuario de navegador común en tus solicitudes HTTP.

"Credenciales de CapSolver no válidas"

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


Mejores prácticas

  1. Siempre obtén un desafío nuevo: Antes de cada intento de resolución de GeeTest V3, siempre realiza una solicitud HTTP al sitio de destino para obtener el valor challenge más reciente. Los desafíos caducan rápidamente.
  2. Mantén 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 las cookies.
  3. Valida los parámetros: Vuelve a verificar que los parámetros gt, websiteURL y challenge sean correctos. Estos son clave para el éxito de la resolución de GeeTest V3.
  4. Maneja los errores: Incluye lógica de manejo de errores en tus flujos de trabajo para manejar elegantemente los fallos de resolución o de inicio de sesión. Esto puede incluir mecanismos de reintento o notificaciones.
  5. Usa 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.
  6. Prueba e itera: Las implementaciones de GeeTest V3 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 funcione de manera confiable en tu objetivo específico.
  7. No se necesita proxy: A diferencia de otros tipos de captcha, la resolución de GeeTest V3 generalmente no requiere 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 GeeTest V3 y flujos de trabajo de automatización de inicio de sesión de cuenta usando n8n y CapSolver.

Resumen:

  • Cómo funciona GeeTest V3 — Utiliza rompecabezas interactivos y se basa en un parámetro gt estático y un parámetro challenge dinámico.
  • Cómo identificar los parámetros de GeeTest V3 — Usa la pestaña de red de las herramientas de desarrollo para encontrar gt y el punto final de la API de desafío.
  • La importancia del desafío dinámico — Se debe obtener un nuevo valor de challenge antes de cada intento de resolución.
  • Un punto final de API de resolución — Acepta parámetros de GeeTest V3 y devuelve el desafío resuelto.
  • Un flujo de trabajo de automatización de inicio de sesión de cuenta — Resuelve GeeTest V3 antes de enviar las credenciales.
  • Consejos para la solución de problemas — Maneja errores comunes como desafíos caducados, parámetros no válidos e inicios de sesión fallidos.
  • Mejores prácticas — Siempre obtén un desafío nuevo, mantén la sesión, valida los parámetros y maneja los errores.

La principal complejidad de GeeTest V3 radica en su parámetro challenge dinámico y su formato de solución de tres partes. Al agregar un nodo de solicitud HTTP antes del nodo de CapSolver para obtener un desafío nuevo, puedes automatizar eficazmente la resolución de GeeTest V3. Luego, puedes integrar sin problemas estos tokens resueltos en tus flujos de trabajo de inicio de sesión o raspado.

Consejo: Estos flujos de trabajo utilizan activadores de Webhook, pero puedes intercambiar el nodo de activador por cualquier otro activador de n8n — manual, eventos de aplicación, envíos de formularios, etc. Una vez que se resuelve el GeeTest V3, 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 GeeTest V3?

GeeTest V3 es un sistema CAPTCHA conductual que verifica a los usuarios a través de rompecabezas interactivos (como rompecabezas deslizantes, clics de iconos y coincidencia de palabras). Utiliza un parámetro gt estático y un parámetro challenge dinámico que caduca rápidamente.

¿En qué se diferencia GeeTest V3 de GeeTest V4?

GeeTest V4 utiliza una estructura de API diferente, como captcha_id en lugar de gt, y no requiere una obtención de challenge separada. Esta guía se centra específicamente en GeeTest V3. Si ves captcha_id en el código fuente de la página, estás tratando con V4.

¿Cuánto cuesta resolver un desafío GeeTest V3?

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

¿Cuánto tiempo se tarda en resolver un desafío GeeTest V3?

Las tareas de resolución de GeeTest V3 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 GeeTest V3 implica la creación y el sondeo de tareas, por lo que no es instantánea.

¿Necesito un proxy para GeeTest V3?

El servicio de resolución de GeeTest V3 de CapSolver generalmente no requiere que proporciones un proxy. CapSolver maneja los requisitos de proxy internamente. Solo necesitas proporcionar los parámetros websiteURL, gt y challenge.

¿Por qué mi valor challenge siempre caduca?

El valor challenge de GeeTest V3 es dinámico y caduca rápidamente (normalmente en 60-120 segundos). Debes obtener un challenge nuevo inmediatamente antes de enviar la solicitud de resolución a CapSolver. Asegúrate de que tu flujo de trabajo incluya un nodo de solicitud HTTP para obtener el challenge más reciente antes de cada intento de resolución.

¿Qué pasa si la resolución de GeeTest V3 tiene éxito pero el inicio de sesión sigue fallando?

Si la resolución de GeeTest V3 tiene éxito pero el inicio de sesión sigue fallando, 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: Verifica el formulario HTML para ver si hay otros campos ocultos o tokens CSRF requeridos.
  • Agente de usuario: Intenta establecer una cadena de 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 autohospedado como con n8n Cloud. El nodo 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 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

Contenido

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
n8nMar 16, 2026

Cómo resolver puzzles visuales en n8n con CapSolver

Resuelve CAPTCHAs visuales con el motor de visión de CapSolver en n8n. Maneja deslizadores, rotación, selección de objetos y OCR de GIF de forma inmediata.

Aloísio Vítor
Aloísio Vítor