
Anh Tuan
Data Science Expert

O GeeTest V3 é um dos CAPTCHAs comportamentais mais amplamente implantados na web. Ao contrário dos desafios de caixa de seleção simples, o GeeTest V3 usa quebra-cabeças interativos — deslizar para verificar, seleção de ícones e correspondência de palavras — para distinguir humanos de bots. É comumente encontrado em páginas de login, formulários de registro e sites com muitos dados na Ásia e, cada vez mais, em todo o mundo.
E se você pudesse resolver o GeeTest V3 automaticamente em seus fluxos de trabalho n8n — seja construindo uma API de resolução reutilizável, extraindo dados de um site protegido por captcha ou automatizando um formulário de login — tudo sem escrever uma única linha de código tradicional?
Neste guia, você aprenderá como combinar n8n (uma ferramenta de automação de fluxo de trabalho visual) com CapSolver (um serviço de resolução de captcha alimentado por IA) para resolver desafios do GeeTest V3 sob demanda — seja como um endpoint de API autônomo ou como uma etapa em qualquer fluxo de trabalho de automação maior.
O que você vai construir:
API de Resolução — um endpoint reutilizável que suas outras ferramentas podem chamar:
Fluxos de trabalho de uso direto — CapSolver incorporado como uma etapa em automações maiores:
O GeeTest V3 é um sistema CAPTCHA de desafio-resposta que verifica usuários por meio de tarefas interativas. Ao contrário do reCAPTCHA (que usa um único token) ou do Cloudflare Turnstile (que é executado de forma invisível), o GeeTest V3 apresenta quebra-cabeças visíveis que exigem interação do usuário:
Do ponto de vista da resolução, o GeeTest V3 tem dois parâmetros críticos:
gt — Um identificador por site (como uma chave de site). Isso é estático — não muda entre as sessões.challenge — Um token por sessão. Isso é dinâmico — muda a cada vez e expira em aproximadamente 60-120 segundos.Este parâmetro challenge dinâmico é a principal diferença de outros tipos de CAPTCHA. Todo fluxo de trabalho que resolve o GeeTest V3 precisa de uma etapa adicional para buscar um novo desafio antes de enviá-lo ao CapSolver.
Formato da Solução: Ao contrário do reCAPTCHA ou Turnstile que retornam um único token, o GeeTest V3 retorna três valores separados:
challenge — A string de desafio resolvidavalidate — O hash de validaçãoseccode — O código de segurançaEstes são enviados como três campos de formulário: geetest_challenge, geetest_validate e geetest_seccode.

GeeTest V3 vs V4: O GeeTest V4 usa uma estrutura de API diferente (
captcha_idem vez degt, sem uma busca dechallengeseparada). Este guia cobre especificamente o V3. Se você vircaptcha_idno código-fonte da página, você está lidando com o V4.
Antes de começar, certifique-se de ter o seguinte:
Importante: Certifique-se de ter saldo suficiente em sua conta CapSolver. As tarefas de resolução do GeeTest V3 consomem créditos com base no uso.
O CapSolver está disponível como uma integração oficial no n8n — sem necessidade de instalação de nós da comunidade. Você pode encontrá-lo diretamente no painel de nós ao construir seus fluxos de trabalho.
Como é uma integração oficial, você precisará criar uma credencial no n8n para que o nó CapSolver possa autenticar com sua conta.
Vá para sua instância n8n e navegue até Settings -> Credentials. Você verá todas as suas credenciais configuradas aqui.

All (padrão)O n8n testará automaticamente a conexão. Você deverá ver um banner verde "Connection tested successfully" confirmando que sua chave de API é válida.

Importante: Cada nó CapSolver em seus fluxos de trabalho fará referência a esta credencial. Você só precisa criá-la uma vez — todos os seus fluxos de trabalho de resolução compartilharão a mesma credencial.
Agora você está pronto para construir seu fluxo de trabalho de resolução do GeeTest V3!
Antes de resolver um desafio do GeeTest V3, você precisa encontrar três coisas: o parâmetro gt, o endpoint da API de desafio e entender como o valor challenge é buscado dinamicamente.
F12) -> aba Redegt= na URL ou respostas que contenham os campos "gt" e "challenge"/api/geetest/register/gt/register-slide/captcha?gt=...{
"gt": "81dc9bdb52d04dc20036dbd8313ed055",
"challenge": "4a8a08f09d37b73795649038408b5f33ab",
"success": 1,
"new_captcha": true
}
Este é o conceito mais importante para a automação do GeeTest V3:
gt é estático por site — permanece o mesmo em todas as sessõeschallenge é dinâmico — muda a cada vez e expira em ~60-120 segundoschallenge imediatamente antes de enviar a solicitação de resolução para o CapSolverhttps://example.com/api/geetest/register)Isso significa que todo fluxo de trabalho do GeeTest V3 precisa de um nó de Solicitação HTTP adicional antes do nó CapSolver para buscar o novo desafio. Esta é a principal diferença estrutural dos fluxos de trabalho reCAPTCHA ou Turnstile.
Dica: Adicione
?t={{ Date.now() }}à URL da API de desafio como um parâmetro anti-cache para garantir que você sempre obtenha um novo desafio.
Para um guia detalhado sobre como identificar os parâmetros do captcha, consulte a documentação oficial do CapSolver.
Este fluxo de trabalho cria um endpoint POST que aceita parâmetros do GeeTest V3 e retorna um desafio resolvido. Ao contrário dos resolvedores de reCAPTCHA ou Turnstile, o chamador deve fornecer o valor challenge (recém-buscado) junto com gt e websiteURL.

O fluxo de trabalho consiste em quatro nós:
$json.error não está vazio){"error": "..."} em caso de falha| Configuração | Valor |
|---|---|
| Método HTTP | POST |
| Caminho | solver-geetest-v3 |
| Responder | Response Node |
Isso cria um endpoint em: https://your-n8n-instance.com/webhook/solver-geetest-v3
| Parâmetro | Valor | Descrição |
|---|---|---|
| Operação | GeeTest V3 |
Deve ser definido como GeeTest V3 |
| Tipo | GeeTestTaskProxyLess |
Única opção disponível — variante sem proxy |
| URL do Site | ={{ $json.body.websiteURL }} |
A URL da página com o desafio GeeTest |
| GT | ={{ $json.body.gt }} |
O identificador GeeTest por site |
| Desafio | ={{ $json.body.challenge }} |
O desafio dinâmico por sessão (deve ser novo) |
| Subdomínio do Servidor API GeeTest | (Opcional) | Servidor API GeeTest personalizado se o site usar um |
Também selecione suas credenciais CapSolver no nó.
| Configuração | Valor |
|---|---|
| Condição | ={{ $json.error }} não está vazio |
| Ramo Verdadeiro | Roteia para o nó Erro Responder ao Webhook |
| Ramo Falso | Roteia para o nó Sucesso Responder ao Webhook |
Isso torna o caminho de erro explícito na tela. O nó CapSolver continua em caso de erro (onError: continueRegularOutput), então as falhas chegam aqui como { "error": "..." } em vez de travar o fluxo de trabalho.
Ramo de Sucesso (saída falsa de Erro do CapSolver?):
| Configuração | Valor |
|---|---|
| Responder com | JSON |
| Corpo da Resposta | ={{ JSON.stringify($json.data) }} |
Envie uma solicitação POST para o seu endpoint de webhook:
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"
}'
Resposta esperada:
{
"taskId": "abc123...",
"solution": {
"challenge": "4a8a08f09d37b73795649038408b5f33",
"validate": "68f0c05d0c8a8b2b1e2f3a4b5c6d7e8f",
"seccode": "68f0c05d0c8a8b2b1e2f3a4b5c6d7e8f|jordan"
},
"status": "ready"
}
Importante: O
challengeno corpo da solicitação deve ser recém-buscado. Se você enviar um desafio expirado, o CapSolver não conseguirá resolvê-lo. Os desafios geralmente expiram em 60-120 segundos.
Copie o JSON abaixo e importe-o para o n8n via Menu -> Import from JSON:
{
"name": "GeeTest V3 Scraping — Price & Product Details — CapSolver + Schedule + Webhook",
"nodes": [
{
"parameters": {
"content": "## Raspagem GeeTest V3 — Monitor de Preços e Produtos — CapSolver + Agendamento + Webhook\n\n**Para quem:** Equipes que monitoram preços ou dados de produtos em sites protegidos por GeeTest V3.\n\n**O que faz:** Resolve o GeeTest V3, busca uma página de produto, extrai preço e nome via seletores CSS, compara com os valores armazenados e alerta sobre alterações.\n\n**Como funciona:**\n1. O agendador (a cada 6h) ou o Webhook acionam o fluxo\n2. O CapSolver resolve o desafio GeeTest V3\n3. A solicitação HTTP busca a página do produto com o token resolvido\n4. O nó HTML extrai o preço e o nome do produto\n5. O nó de código compara o preço atual com o armazenado → alerta sobre alterações\n\n**Configuração:**\n1. Adicione sua chave de API CapSolver em **Settings → Credentials**\n2. Substitua as URLs de placeholder e as chaves de site\n3. Atualize os seletores CSS em Extrair Dados para corresponder à sua página de destino\n4. Conecte a saída de Construir Alerta ao seu canal de notificação",
"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": "### Caminho de Agendamento\nExecuta automaticamente a cada 6 horas.\nOs resultados são armazenados nos dados estáticos do fluxo de trabalho para comparação entre as execuções.",
"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": "### Caminho do Webhook\nAcionador sob demanda — mesma lógica, retorna o resultado como resposta 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"
}
}
Este fluxo de trabalho automatiza o envio de formulários de login protegidos por GeeTest V3 do início ao fim. Ele resolve o desafio GeeTest V3 antes de enviar as credenciais.
Este fluxo de trabalho consiste em cinco nós:
challengegt, challenge e websiteURL para o CapSolver| Configuração | Valor |
|---|---|
| Método HTTP | POST |
| Caminho | login-geetest-v3 |
| Responder | Response Node |
Isso cria um endpoint em: https://your-n8n-instance.com/webhook/login-geetest-v3
| Configuração | Valor |
|---|---|
| URL | https://YOUR-TARGET-SITE.com/api/geetest/register?t={{ Date.now() }} |
| Opções | Full Response = false |
Isso retornará uma resposta JSON contendo os valores gt e challenge.
| Parâmetro | Valor |
|---|---|
| Operação | GeeTest V3 |
| URL do Site | https://YOUR-TARGET-SITE.com/login |
| GT | ={{ $json.gt }} |
| Desafio | ={{ $json.challenge }} |
Também selecione suas credenciais CapSolver.
| Configuração | Valor |
|---|---|
| Método | POST |
| URL | https://YOUR-TARGET-SITE.com/login |
| Tipo de Conteúdo | form-urlencoded |
| Parâmetros do Corpo | 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: Certifique-se de substituir
YOUR_USERNAMEeYOUR_PASSWORDpelas credenciais reais. Além disso, você pode precisar ajustar os nomes dos campos do formulário para corresponder ao HTML do site de destino.
| Configuração | Valor |
|---|---|
| Responder com | JSON |
| Corpo da Resposta | ={{ JSON.stringify($json) }} |
Envie uma solicitação POST para o seu endpoint de webhook:
curl -X POST https://your-n8n-instance.com/webhook/login-geetest-v3 \
-H "Content-Type: application/json" \
-d ''
Resposta esperada (sucesso):
{
"status": "success",
"message": "Login successful",
"solution": {
"challenge": "...",
"validate": "...",
"seccode": "..."
}
}
Resposta esperada (falha):
{
"status": "failed",
"message": "Login failed: Invalid credentials or captcha",
"error": "..."
}
Copie o JSON abaixo e importe-o para o n8n via Menu -> Import from JSON:
{
"name": "Account Login Automation — Solve GeeTest V3 & Submit Credentials",
"nodes": [
{
"parameters": {
"content": "## Automação de Login de Conta — Resolver GeeTest V3 e Enviar Credenciais\n\n**Para quem:** Equipes que precisam automatizar o login em contas protegidas por GeeTest V3.\n\n**O que faz:** Busca o desafio GeeTest V3, resolve-o com o CapSolver e, em seguida, envia o formulário de login com o token resolvido e as credenciais do usuário.\n\n**Como funciona:**\n1. O Webhook aciona o fluxo\n2. A solicitação HTTP busca um novo desafio GeeTest V3\n3. O CapSolver resolve o desafio\n4. A solicitação HTTP envia o formulário de login, que contém o token GeeTest V3 resolvido e as credenciais do usuário\n5. O Webhook responde com o resultado do login\n\n**Configuração:**\n1. Adicione sua chave de API CapSolver em **Settings → Credentials**\n2. Substitua as URLs de placeholder e as credenciais\n3. Ajuste os nomes dos campos do formulário para corresponder ao seu site de destino\n4. Ative o fluxo de trabalho",
"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"
}
}
Este erro significa que sua conta ou plano CapSolver não inclui acesso ao GeeTest V3. Verifique seu painel CapSolver para verificar se seu plano inclui este serviço.
O valor challenge do GeeTest V3 é dinâmico e expira rapidamente (geralmente em 60-120 segundos). Você deve buscar um novo challenge imediatamente antes de enviar a solicitação de resolução para o CapSolver. Certifique-se de que seu fluxo de trabalho busca o challenge mais recente antes de cada tentativa de resolução.
Esses erros indicam que os parâmetros websiteURL ou gt que você forneceu no nó CapSolver estão incorretos. Verifique novamente a aba de rede das ferramentas do desenvolvedor do site de destino para garantir que você está usando os valores corretos.
Se o GeeTest V3 foi resolvido com sucesso, mas o login ainda falha, pode haver um problema com:
Este erro indica que sua chave de API do CapSolver configurada no n8n está incorreta ou expirou. Verifique seu painel CapSolver e atualize as credenciais no n8n.
challenge mais recente. Os desafios expiram rapidamente.gt, websiteURL e challenge estão corretos. Estes são a chave para o sucesso da resolução do GeeTest V3.Pronto para começar? Cadastre-se no CapSolver e use o código de bônus n8n para obter um bônus adicional de 8% em sua primeira recarga!

Você aprendeu como construir uma API de resolução do GeeTest V3 e fluxos de trabalho de automação de login de conta usando n8n e CapSolver.
Resumo:
gt estático e um parâmetro challenge dinâmico.gt e o endpoint da API de desafio.challenge deve ser buscado antes de cada tentativa de resolução.A principal complexidade do GeeTest V3 reside em seu parâmetro challenge dinâmico e seu formato de solução de três partes. Ao adicionar um nó de solicitação HTTP antes do nó CapSolver para buscar um novo desafio, você pode automatizar efetivamente a resolução do GeeTest V3. Você pode então integrar perfeitamente esses tokens resolvidos em seus fluxos de trabalho de login ou raspagem.
Dica: Esses fluxos de trabalho usam gatilhos de Webhook, mas você pode trocar o nó de gatilho por qualquer outro gatilho n8n — manual, eventos de aplicativo, envios de formulário, etc. Uma vez que o GeeTest V3 é resolvido, use os nós embutidos do n8n para salvar os resultados em Planilhas Google, bancos de dados, armazenamento em nuvem ou enviar alertas via Telegram/Slack/Email.
O GeeTest V3 é um sistema CAPTCHA comportamental que verifica usuários por meio de quebra-cabeças interativos (como quebra-cabeças deslizantes, cliques em ícones e correspondência de palavras). Ele usa um parâmetro gt estático e um parâmetro challenge dinâmico que expira rapidamente.
O GeeTest V4 usa uma estrutura de API diferente, como captcha_id em vez de gt, e não requer uma busca de challenge separada. Este guia se concentra especificamente no GeeTest V3. Se você vir captcha_id no código-fonte da página, você está lidando com o V4.
Os preços variam de acordo com o uso. Verifique a página de preços do CapSolver para os preços atuais do GeeTest V3. As tarefas de resolução do GeeTest V3 são geralmente mais caras do que o reconhecimento simples de imagem para texto, mas mais baratas do que alguns outros tipos de captcha complexos.
As tarefas de resolução do GeeTest V3 geralmente levam de 10 a 30 segundos, dependendo da complexidade do desafio e da carga do servidor do CapSolver. Ao contrário do ImageToTextTask, a resolução do GeeTest V3 envolve a criação e o polling de tarefas, portanto, não é instantânea.
O serviço de resolução do GeeTest V3 do CapSolver geralmente não exige que você forneça um proxy. O CapSolver lida com os requisitos de proxy internamente. Você só precisa fornecer os parâmetros websiteURL, gt e challenge.
challenge sempre expira?O valor challenge do GeeTest V3 é dinâmico e expira rapidamente (geralmente em 60-120 segundos). Você deve buscar um novo challenge imediatamente antes de enviar a solicitação de resolução para o CapSolver. Certifique-se de que seu fluxo de trabalho inclui um nó de solicitação HTTP para buscar o challenge mais recente antes de cada tentativa de resolução.
Se o GeeTest V3 for resolvido com sucesso, mas o login ainda falhar, verifique o seguinte:
Sim. Este fluxo de trabalho funciona tanto com o n8n auto-hospedado quanto com o n8n Cloud. O nó CapSolver já está disponível como uma integração oficial; você só precisa adicionar suas credenciais de API.
Bangun API solver eCAPTCHA v2/v3 menggunakan CapSolver dan n8n. Pelajari cara mengotomatisasi penyelesaian token, mengirimkannya ke website, dan mengekstrak data yang dilindungi tanpa coding.

Crie uma API para resolver o Cloudflare Turnstile usando CapSolver e n8n. Aprenda como automatizar a obtenção de tokens, enviá-los para sites e extrair dados protegidos sem necessidade de programação.
