
Emma Foster
Machine Learning Engineer

GeeTest V4 es la última generación del sistema CAPTCHA de comportamiento de GeeTest, utilizado por un número creciente de sitios web para proteger formularios de inicio de sesión, páginas de registro y puntos finales de datos. A diferencia de los sistemas CAPTCHA más antiguos que se basan en rompecabezas de imágenes, GeeTest V4 utiliza desafíos adaptativos y análisis de comportamiento, lo que lo convierte en una de las protecciones más sofisticadas que encontrará en los flujos de trabajo de automatización.
¿Qué pasaría si pudieras resolver GeeTest V4 automáticamente dentro de tus flujos de trabajo de n8n, ya sea que estés construyendo una API de solució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 GeeTest V4 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:
APIs de Solución — puntos finales reutilizables que otras herramientas pueden llamar:
Flujos de trabajo de uso directo — CapSolver incrustado como un paso dentro de automatizaciones más grandes:
GeeTest V4 es la versión más reciente de la plataforma CAPTCHA de GeeTest. Reemplaza el sistema V3 anterior con un modelo de integración simplificado y una detección de comportamiento mejorada. Desde una perspectiva de resolución, V4 es estructuralmente más simple que V3: solo requiere un parámetro estático (captchaId) en lugar del flujo de desafío dinámico que necesita V3.

Diferencias clave con GeeTest V3:
| Característica | GeeTest V3 | GeeTest V4 |
|---|---|---|
| Parámetro principal | gt + challenge dinámico |
captchaId (estático) |
| Obtención de desafío | Requerido — debe llamar a la API de GeeTest primero | No es necesario — captchaId es estático |
| Campos de solución | 3 (challenge, validate, seccode) |
5 (captcha_id, lot_number, pass_token, gen_time, captcha_output) |
| Script de widget | gt.js |
gcaptcha4.js |
| Tipo de tarea | GeeTestTask / GeeTestTaskProxyLess |
Solo GeeTestTaskProxyLess |
Ventaja clave de V4: El
captchaIdestá incrustado en el código fuente de la página y nunca cambia; encuéntralo una vez, úsalo para siempre. La ausencia de obtención de desafíos dinámicos significa menos nodos en tu flujo de trabajo.
Antes de comenzar, asegúrate de tener lo siguiente:
Importante: Asegúrate de tener suficiente saldo en tu cuenta de CapSolver. Las tareas de resolución de GeeTest V4 consumen créditos según el uso.
CapSolver está disponible como una integración oficial en n8n, no se requiere la instalación de ningún nodo 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.
Ve a tu instancia de n8n y navega a Settings > Credentials. Verás todas tus credenciales configuradas aquí.

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

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 solución compartirán la misma credencial.
¡Ahora estás listo para construir tu flujo de trabajo de solución de GeeTest V4!
Antes de poder resolver un CAPTCHA de GeeTest V4, debes encontrar su captchaId, el único parámetro requerido. A diferencia de GeeTest V3 (que requiere obtener un challenge dinámico), el captchaId de V4 es estático y está incrustado directamente en el código fuente de la página.
captcha_id o captchaId en el código fuente de la páginagcaptcha4.js, el script del widget de GeeTest V4captchaId se suele pasar como parámetro de configuración al inicializar el widget<!-- Ejemplo: inicialización de GeeTest V4 en el código fuente de la página -->
<script>
initGeetest4({
captchaId: 'e392e1d7fd421dc63325744d5a2b9c73',
product: 'bind'
});
</script>
gcaptcha4 o geetestgcaptcha4.geetest.com; el parámetro captcha_id estará en la cadena de consultaVentaja clave de V4: El
captchaIdes estático; una vez que lo encuentres, puedes usarlo indefinidamente sin necesidad de obtener un nuevo desafío cada vez. Esto hace que los flujos de trabajo de V4 sean estructuralmente idénticos a los flujos de trabajo de Turnstile.
Este flujo de trabajo crea un punto final de API POST que acepta parámetros de GeeTest V4 y devuelve un conjunto de tokens resueltos.

El flujo de trabajo consta de cuatro nodos:
$json.error no está vacío){"error": "..."} si falla| Configuración | Valor |
|---|---|
| Método HTTP | POST |
| Ruta | solver-geetest-v4 |
| Responder | Response Node |
Esto crea un punto final en: https://your-n8n-instance.com/webhook/solver-geetest-v4
| Parámetro | Valor | Descripción |
|---|---|---|
| Operación | GeeTest V4 |
Debe establecerse en GeeTest V4 |
| Tipo | GeeTestTaskProxyLess |
Este es el único tipo de tarea disponible (sin variante de proxy) |
| URL del sitio web | {{ $json.body.websiteURL }} |
La URL de la página con el widget GeeTest V4 |
| ID de Captcha | {{ $json.body.captchaId }} |
El ID de captcha estático de GeeTest V4 |
| Subdominio del servidor API de GeeTest | (Opcional) | Servidor API de GeeTest personalizado si el sitio usa uno |
Selecciona tus credenciales de CapSolver en este nodo. El parámetro opcional
geetestApiServerSubdomainrara vez es necesario; solo agrégalo si el servidor GeeTest predeterminado no funciona para tu sitio de destino.
| Configuración | Valor |
|---|---|
| Condición | ={{ $json.error }} no está vacío |
| Rama verdadera | Dirige al nodo Webhook de respuesta de Error |
| Rama falsa | Dirige al nodo Webhook de respuesta de Éxito |
Rama de éxito (salida falsa de ¿Error de CapSolver?):
| Configuración | Valor |
|---|---|
| Responder con | JSON |
| Cuerpo de la respuesta | ={{ JSON.stringify($json.data) }} |
Envía una solicitud POST a tu punto final de Webhook:
curl -X POST https://your-n8n-instance.com/webhook/solver-geetest-v4 \
-H "Content-Type: application/json" \
-d '{
"websiteURL": "https://example.com/login",
"captchaId": "e392e1d7fd421dc63325744d5a2b9c73"
}'
Respuesta esperada:
{
"taskId": "abc123...",
"solution": {
"captcha_id": "e392e1d7fd421dc63325744d5a2b9c73",
"lot_number": "7c18c041a6ed4e...",
"pass_token": "d88ce40c0a5c5a18...",
"gen_time": "1709123456",
"captcha_output": "dGVzdF9jYXB0Y2hh..."
},
"status": "ready"
}
Copia el JSON a continuación e impórtalo a n8n a través de Menu > Import from JSON:
{
"name": "GeeTest V4 — Solver API",
"nodes": [
{
"parameters": {
"content": "## GeeTest V4 — API de Solución\n\n**Para quién es:** Desarrolladores que necesitan resolver desafíos de GeeTest V4 a través de un simple punto final POST.\n\n**Qué hace:** Expone un webhook que acepta parámetros de captcha, resuelve el desafío con CapSolver y devuelve el token o el error como JSON.\n\n**Cómo funciona:**\n1. El Webhook recibe un POST con la URL de destino, la clave del sitio y los parámetros opcionales.\n2. El nodo CapSolver resuelve el desafío de GeeTest V4.\n3. El nodo IF verifica si hay errores → devuelve el token de éxito o el JSON de error.\n\n**Configuración:**\n1. Agrega tu clave API de CapSolver en **Settings → Credentials → CapSolver API**.\n2. Activa el flujo de trabajo.\n3. Haz un POST a la URL del webhook con tus parámetros de captcha.",
"height": 494,
"width": 460,
"color": 1
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-712,
-400
],
"id": "sticky-blog-main-1773678228112-1",
"name": "Sticky Note"
},
{
"parameters": {
"httpMethod": "POST",
"path": "solver-geetest-v4",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
-192,
0
],
"id": "a1b2c3d4-0001-0001-0001-a1b2c3d40001",
"name": "Webhook Trigger",
"webhookId": "a1b2c3d4-aaaa-bbbb-cccc-a1b2c3d40001",
"onError": "continueRegularOutput"
},
{
"parameters": {
"operation": "GeeTest V4",
"websiteURL": "={{ $json.body.websiteURL }}",
"captchaId": "={{ $json.body.captchaId }}",
"geetestApiServerSubdomain": "={{ $json.body.geetestApiServerSubdomain }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
104,
0
],
"id": "a1b2c3d4-0001-0001-0001-a1b2c3d40002",
"name": "Solve GeeTest V4",
"credentials": {
"capSolverApi": {
"id": "YOUR_CREDENTIAL_ID",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "geetest-if-001",
"leftValue": "={{ $json.error }}",
"operator": {
"type": "string",
"operation": "isEmpty",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
408,
0
],
"id": "a1b2c3d4-0001-0001-0001-a1b2c3d40003",
"name": "CapSolver Error?"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json.data) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
712,
-80
],
"id": "a1b2c3d4-0001-0001-0001-a1b2c3d40004",
"name": "Respond to Webhook (Success)"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify({ error: $json.error }) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
712,
128
],
"id": "a1b2c3d4-0001-0001-0001-a1b2c3d40005",
"name": "Respond to Webhook (Error)"
}
],
"connections": {
"Webhook Trigger": {
"main": [
[
{
"node": "Solve GeeTest V4",
"type": "main",
"index": 0
}
]
]
},
"Solve GeeTest V4": {
"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"
}
}
Este flujo de trabajo raspa una página de producto cada 6 horas (programación) o bajo demanda (webhook), extrae precios usando un nodo HTML y los compara con valores almacenados previamente.
Ruta de programación:
Cada 6 horas -> Resolver GeeTest V4 -> Obtener página de producto -> Extraer datos
-> Comparar datos -> ¿Datos cambiaron? -> Construir alerta / Sin cambios
Comportamiento clave:
.product-price, h1)$workflow.staticData.lastPrice persiste el precio anterior entre ejecucionesdeal) como aumentos (gravedad: info){
"name": "GeeTest V4 Scraping — Price & Product Details — CapSolver + Schedule + Webhook",
"nodes": [
{
"parameters": {
"content": "## Raspado de GeeTest V4 — Monitor de precios y productos\n\n**Para quién es:** Equipos que necesitan monitorear precios o datos de productos en sitios protegidos por GeeTest V4.\n\n**Qué hace:** Resuelve GeeTest V4, obtiene la página del producto, extrae precios y nombres a través de selectores CSS, compara con valores almacenados y alerta sobre cambios si los hay.\n\n**Cómo funciona:**\n1. Una programación (cada 6 horas) o un Webhook activa el flujo.\n2. El CapSolver resuelve el desafío de GeeTest V4.\n3. Una solicitud HTTP obtiene la página del producto con el token resuelto.\n4. Un nodo HTML extrae precios y nombres de productos.\n5. Un nodo de código compara el precio actual con el precio almacenado → alerta sobre cambios si los hay.\n\n**Configuración:**\n1. Agrega tu clave API de CapSolver en **Settings → Credentials**.\n2. Reemplaza la URL de marcador de posición y la clave del 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-1773678228112-1",
"name": "Sticky Note"
},
{
"parameters": {
"content": "### Ruta de programación\nSe ejecuta automáticamente cada 6 horas.\nLos resultados se almacenan en 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-1773678228112-2",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "### Ruta de Webhook\nActivador 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-1773678228112-3",
"name": "Sticky Note2"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 6
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [
-400,
0
],
"id": "99999999-9999-9999-9999-999999999901",
"name": "Every 6 Hours"
},
{
"parameters": {
"operation": "GeeTest V4",
"websiteURL": "https://YOUR-TARGET-SITE.com/product-page",
"captchaId": "YOUR_CAPTCHA_ID_HERE",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
0
],
"id": "99999999-9999-9999-9999-999999999902",
"name": "Solve GeeTest V4",
"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"
}
]
},
"sendBody": true,
"contentType": "form-urlencoded",
"bodyParameters": {
"parameters": [
{
"name": "captcha_id",
"value": "={{ $json.data.solution.captcha_id }}"
},
{
"name": "lot_number",
"value": "={{ $json.data.solution.lot_number }}"
},
{
"name": "pass_token",
"value": "={{ $json.data.solution.pass_token }}"
},
{
"name": "gen_time",
"value": "={{ $json.data.solution.gen_time }}"
},
{
"name": "captcha_output",
"value": "={{ $json.data.solution.captcha_output }}"
}
]
},
"options": {
"response": {
"response": {
"fullResponse": false
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
208,
0
],
"id": "99999999-9999-9999-9999-999999999903",
"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": "99999999-9999-9999-9999-999999999904",
"name": "Extract Data"
},
{
"parameters": {
"jsCode": "// Obtener el precio actual y anterior de los datos estáticos del flujo de trabajo\nconst staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Product';\n\n// Analizar valores numéricos para la comparación\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// Actualizar el precio almacenado\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": "99999999-9999-9999-9999-999999999905",
"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": "99999999-9999-9999-9999-999999999906",
"name": "Data Changed?"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "alert-001",
"name": "alert",
"value": "=El precio {{ $json.direction }} para {{ $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": "99999999-9999-9999-9999-999999999907",
"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": "99999999-9999-9999-9999-999999999908",
"name": "No Change"
},
{
"parameters": {
"httpMethod": "POST",
"path": "price-monitor-geetest-v4",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-400,
420
],
"id": "99999999-9999-9999-9999-999999999909",
"name": "Webhook Trigger",
"webhookId": "99999999-aaaa-bbbb-cccc-999999999909",
"onError": "continueRegularOutput"
},
{
"parameters": {
"operation": "GeeTest V4",
"websiteURL": "https://YOUR-TARGET-SITE.com/product-page",
"captchaId": "YOUR_CAPTCHA_ID_HERE",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
420
],
"id": "99999999-9999-9999-9999-999999999910",
"name": "Solve GeeTest V4 [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"
}
]
},
"sendBody": true,
"contentType": "form-urlencoded",
"bodyParameters": {
"parameters": [
{
"name": "captcha_id",
"value": "={{ $json.data.solution.captcha_id }}"
},
{
"name": "lot_number",
"value": "={{ $json.data.solution.lot_number }}"
},
{
"name": "pass_token",
"value": "={{ $json.data.solution.pass_token }}"
},
{
"name": "gen_time",
"value": "={{ $json.data.solution.gen_time }}"
},
{
"name": "captcha_output",
"value": "={{ $json.data.solution.captcha_output }}"
}
]
},
"options": {
"response": {
"response": {
"fullResponse": false
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
208,
420
],
"id": "99999999-9999-9999-9999-999999999911",
"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": "99999999-9999-9999-9999-999999999912",
"name": "Extract Data [Webhook]"
},
{
"parameters": {
"jsCode": "// Obtener el precio actual y anterior de los datos estáticos del flujo de trabajo\nconst staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Product';\n\n// Analizar valores numéricos para la comparación\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// Actualizar el precio almacenado\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": "99999999-9999-9999-9999-999999999913",
"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": "99999999-9999-9999-9999-999999999914",
"name": "Data Changed? [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "alert-004",
"name": "alert",
"value": "=El precio {{ $json.direction }} para {{ $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": "99999999-9999-9999-9999-999999999915",
"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": "99999999-9999-9999-9999-999999999916",
"name": "No Change [Webhook]"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
1712,
420
],
"id": "99999999-9999-9999-9999-999999999917",
"name": "Respond to Webhook [Webhook]"
}
],
"connections": {
"Every 6 Hours": {
"main": [
[
{
"node": "Solve GeeTest V4",
"type": "main",
"index": 0
}
]
]
},
"Solve GeeTest V4": {
"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 GeeTest V4 [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Solve GeeTest V4 [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"
}
}
Este flujo de trabajo automatiza el envío de un formulario de inicio de sesión protegido por GeeTest V4 de principio a fin. Resuelve el desafío de GeeTest V4 antes de enviar las credenciales.
Este flujo de trabajo consta de cinco nodos:
| Configuración | Valor |
|---|---|
| Método HTTP | POST |
| Ruta | login-geetest-v4 |
| Responder | Response Node |
Esto crea un punto final en: https://your-n8n-instance.com/webhook/login-geetest-v4
| Parámetro | Valor |
|---|---|
| Operación | GeeTest V4 |
| URL del sitio web | https://YOUR-TARGET-SITE.com/login |
| ID de Captcha | YOUR_CAPTCHA_ID_HERE |
Asegúrate también de seleccionar tus credenciales de CapSolver.
| 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, captcha_id={{ $('Solve GeeTest V4').item.json.data.solution.captcha_id }}, lot_number={{ $('Solve GeeTest V4').item.json.data.solution.lot_number }}, pass_token={{ $('Solve GeeTest V4').item.json.data.solution.pass_token }}, gen_time={{ $('Solve GeeTest V4').item.json.data.solution.gen_time }}, captcha_output={{ $('Solve GeeTest V4').item.json.data.solution.captcha_output }} |
Importante: Reemplaza
YOUR_USERNAMEyYOUR_PASSWORDcon tus credenciales reales. Además, es posible que debas ajustar los nombres de los campos del formulario para que coincidan con el HTML de tu sitio de destino.
| Configuración | Valor |
|---|---|
| Responder con | JSON |
| Cuerpo de la respuesta | ={{ JSON.stringify($json) }} |
Envía una solicitud POST a tu punto final de Webhook:
curl -X POST https://your-n8n-instance.com/webhook/login-geetest-v4 \
-H "Content-Type: application/json" \
-d '{
"websiteURL": "https://example.com/login",
"captchaId": "e392e1d7fd421dc63325744d5a2b9c73",
"username": "testuser",
"password": "testpass"
}'
Respuesta esperada (Éxito):
{
"status": "success",
"message": "Login successful",
"solution": {
"captcha_id": "e392e1d7fd421dc63325744d5a2b9c73",
"lot_number": "7c18c041a6ed4e...",
"pass_token": "d88ce40c0a5c5a18...",
"gen_time": "1709123456",
"captcha_output": "dGVzdF9jYXB0Y2hh..."
}
}
Respuesta esperada (Fallo):
{
"status": "failed",
"message": "Login failed: Invalid credentials or captcha",
"error": "..."
}
Copia el JSON a continuación e impórtalo a n8n a través de Menu > Import from JSON:
{
"name": "GeeTest V4 Account Login — CapSolver + Schedule + Webhook",
"nodes": [
{
"parameters": {
"content": "## Automatización de inicio de sesión de cuenta de GeeTest V4 — CapSolver + Programación + Webhook\n\n**Para quién es:** Equipos que necesitan automatizar el inicio de sesión en cuentas protegidas por GeeTest V4.\n\n**Qué hace:** Resuelve el desafío de GeeTest V4 y envía el formulario de inicio de sesión con el token resuelto y las credenciales de usuario.\n\n**Cómo funciona:**\n1. El Webhook activa el flujo.\n2. El CapSolver resuelve el desafío de GeeTest V4.\n3. Una solicitud HTTP envía el formulario de inicio de sesión con el token resuelto y las credenciales de usuario.\n4. El Webhook devuelve el resultado del inicio de sesión.\n\n**Configuración:**\n1. Agrega tu clave API de CapSolver en **Settings → Credentials**.\n2. Reemplaza la 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": [
-728,
-400
],
"id": "sticky-blog-main-1773678228112-1",
"name": "Sticky Note"
},
{
"parameters": {
"httpMethod": "POST",
"path": "login-geetest-v4",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-400,
0
],
"id": "a2b3c4d5-0001-0001-0001-a2b3c4d50001",
"name": "Webhook Trigger",
"webhookId": "a2b3c4d5-aaaa-bbbb-cccc-a2b3c4d50001",
"onError": "continueRegularOutput"
},
{
"parameters": {
"operation": "GeeTest V4",
"websiteURL": "={{ $json.body.websiteURL }}",
"captchaId": "={{ $json.body.captchaId }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
0
],
"id": "a2b3c4d5-0001-0001-0001-a2b3c4d50002",
"name": "Solve GeeTest V4",
"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"
}
]
},
"sendBody": true,
"contentType": "form-urlencoded",
"bodyParameters": {
"parameters": [
{
"name": "username",
"value": "={{ $json.body.username }}"
},
{
"name": "password",
"value": "={{ $json.body.password }}"
},
{
"name": "captcha_id",
"value": "={{ $('Solve GeeTest V4').item.json.data.solution.captcha_id }}"
},
{
"name": "lot_number",
"value": "={{ $('Solve GeeTest V4').item.json.data.solution.lot_number }}"
},
{
"name": "pass_token",
"value": "={{ $('Solve GeeTest V4').item.json.data.solution.pass_token }}"
},
{
"name": "gen_time",
"value": "={{ $('Solve GeeTest V4').item.json.data.solution.gen_time }}"
},
{
"name": "captcha_output",
"value": "={{ $('Solve GeeTest V4').item.json.data.solution.captcha_output }}"
}
]
},
"options": {
"response": {
"response": {
"fullResponse": false
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
208,
0
],
"id": "a2b3c4d5-0001-0001-0001-a2b3c4d50003",
"name": "Submit Login Form"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
512,
0
],
"id": "a2b3c4d5-0001-0001-0001-a2b3c4d50004",
"name": "Respond to Webhook"
}
],
"connections": {
"Webhook Trigger": {
"main": [
[
{
"node": "Solve GeeTest V4",
"type": "main",
"index": 0
}
]
]
},
"Solve GeeTest V4": {
"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"
}
}
Este error indica que tu cuenta o plan de CapSolver no incluye acceso a GeeTest V4. Verifica tu Panel de CapSolver para confirmar si este servicio está incluido en tu plan.
Este error indica que el parámetro websiteURL que proporcionaste en el nodo CapSolver es incorrecto. Vuelve a verificar la pestaña de red de las herramientas de desarrollador de tu sitio de destino para asegurarte de que estás utilizando el valor correcto.
Si el inicio de sesión falla incluso con GeeTest V4 resuelto con éxito, el problema puede estar en los siguientes puntos:
Este error indica que la clave API de CapSolver que configuraste en n8n es incorrecta o ha caducado. Verifica tu Panel de CapSolver y actualiza las credenciales en n8n.
websiteURL y cualquier parámetro opcional como captchaId y geetestApiServerSubdomain sean correctos. Estos son cruciales para una resolución exitosa de GeeTest V4.¿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.

GeeTest V4 es la última generación del sistema CAPTCHA de comportamiento de GeeTest, que utiliza desafíos adaptativos y análisis de comportamiento para proteger los sitios web.
GeeTest V4 es estructuralmente más simple que V3, ya que solo requiere un parámetro captchaId estático en lugar del flujo de desafío dinámico que necesita V3. También utiliza el script gcaptcha4.js y devuelve 5 campos de solución.
Los precios varían según el uso. Consulta la página de precios de CapSolver para conocer los precios actuales de GeeTest V4. Las tareas de resolución de GeeTest V4 son más caras que el reconocimiento simple de imagen a texto, pero más baratas que otros tipos de CAPTCHA complejos.
Las tareas de resolución de GeeTest V4 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 V4 implica la creación y el sondeo de tareas, por lo que no es instantánea.
El servicio de resolución de GeeTest V4 de CapSolver generalmente no requiere que proporciones un proxy. CapSolver maneja los requisitos de proxy internamente. Solo necesitas proporcionar la websiteURL y el captchaId.
Si tu token de GeeTest V4 no se acepta, verifica lo siguiente:
websiteURL y captchaId sean correctos.Si el inicio de sesión falla incluso con GeeTest V4 resuelto con éxito, verifica lo siguiente:
Sí. Este flujo de trabajo funciona tanto con n8n autoalojado como con n8n Cloud. El nodo CapSolver ya está disponible como una integración oficial. Solo necesitas agregar tus credenciales de API.
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.

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