
Lucas Mitchell
Automation Engineer

O GeeTest V4 é a mais recente geração do sistema CAPTCHA comportamental da GeeTest, usado por um número crescente de sites para proteger formulários de login, páginas de registro e pontos de extremidade de dados. Ao contrário dos sistemas CAPTCHA mais antigos que dependem de quebra-cabeças de imagem, o GeeTest V4 usa desafios adaptativos e análise comportamental — tornando-o uma das proteções mais sofisticadas que você encontrará em fluxos de trabalho de automação.
E se você pudesse resolver o GeeTest V4 automaticamente dentro do seu fluxo de trabalho n8n — seja você construindo uma API de solução reutilizável, raspando 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 visual de automação de fluxo de trabalho) com CapSolver (um serviço de resolução de captcha alimentado por IA) para resolver desafios do GeeTest V4 sob demanda — seja como um endpoint de API autônomo ou como uma etapa em qualquer fluxo de trabalho de automação.
O que você construirá:
APIs de Solução — endpoints reutilizáveis que suas outras ferramentas podem chamar:
Fluxos de Trabalho de Uso Direto — CapSolver incorporado como uma etapa em uma automação maior:
O GeeTest V4 é a versão mais recente da plataforma CAPTCHA da GeeTest. Ele substitui o sistema V3 mais antigo por um modelo de integração simplificado e detecção comportamental aprimorada. Do ponto de vista da resolução, o V4 é estruturalmente mais simples que o V3 — ele requer apenas um parâmetro estático (captchaId) em vez do fluxo de desafio dinâmico que o V3 exigia.

Principais Diferenças do GeeTest V3:
| Recurso | GeeTest V3 | GeeTest V4 |
|---|---|---|
| Parâmetros Principais | gt + challenge dinâmico |
captchaId (estático) |
| Busca de Desafio | Necessário — deve chamar a API GeeTest primeiro | Não é necessário — captchaId é estático |
| Campos de Solução | 3 (challenge, validate, seccode) |
5 (captcha_id, lot_number, pass_token, gen_time, captcha_output) |
| Script do Widget | gt.js |
gcaptcha4.js |
| Tipo de Tarefa | GeeTestTask / GeeTestTaskProxyLess |
Apenas GeeTestTaskProxyLess |
Principal Vantagem do V4: O
captchaIdestá incorporado no código-fonte da página e nunca muda — encontre-o uma vez, use-o para sempre. Nenhuma busca dinâmica de desafio significa menos nós em seu fluxo de trabalho.
Antes de começarmos, certifique-se de ter o seguinte:
Importante: Certifique-se de ter saldo suficiente em sua conta CapSolver. As tarefas de resolução do GeeTest V4 consomem créditos com base no uso.
O CapSolver está disponível como uma integração oficial no n8n — nenhuma instalação de nó da comunidade é necessária. 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 se autenticar com sua conta.
Navegue até sua instância n8n e vá para Settings > Credentials. Você verá todas as credenciais que configurou aqui.

All (padrão)O n8n testará automaticamente a conexão. Você 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 solução compartilharão a mesma credencial.
Agora você está pronto para construir seus fluxos de trabalho de solução GeeTest V4!
Antes de poder resolver um CAPTCHA GeeTest V4, você precisa encontrar seu captchaId — o único parâmetro necessário. Ao contrário do GeeTest V3 (que exigia a busca de um challenge dinâmico), o captchaId do V4 é estático e incorporado diretamente no código-fonte da página.
captcha_id ou captchaId no código-fonte da páginagcaptcha4.js — o script do widget GeeTest V4captchaId geralmente é passado como um parâmetro de configuração ao inicializar o widget<!-- Exemplo: Inicialização do GeeTest V4 no código-fonte da página -->
<script>
initGeetest4({
captchaId: 'e392e1d7fd421dc63325744d5a2b9c73',
product: 'bind'
});
</script>
gcaptcha4 ou geetestgcaptcha4.geetest.com — o parâmetro captcha_id estará na string de consultaPrincipal Vantagem do V4: O
captchaIdé estático — uma vez que você o encontra, você pode usá-lo indefinidamente sem a necessidade de buscar um novo desafio a cada vez. Isso torna os fluxos de trabalho do V4 estruturalmente idênticos aos fluxos de trabalho do Turnstile.
Este fluxo de trabalho cria um endpoint de API POST que aceita parâmetros do GeeTest V4 e retorna um conjunto de tokens resolvidos.

O fluxo de trabalho consiste em quatro nós:
$json.error não está vazio){"error": "..."} se falhar| Configuração | Valor |
|---|---|
| Método HTTP | POST |
| Caminho | solver-geetest-v4 |
| Responder | Response Node |
Isso cria um endpoint em: https://sua-instancia-n8n.com/webhook/solver-geetest-v4
| Parâmetro | Valor | Descrição |
|---|---|---|
| Operação | GeeTest V4 |
Deve ser definido como GeeTest V4 |
| Tipo | GeeTestTaskProxyLess |
Este é o único tipo de tarefa disponível (sem variantes de proxy) |
| URL do Site | {{ $json.body.websiteURL }} |
O URL da página com o widget GeeTest V4 |
| ID do Captcha | {{ $json.body.captchaId }} |
O ID estático do captcha GeeTest V4 |
| Subdomínio do Servidor API GeeTest | (Opcional) | Servidor API GeeTest personalizado se o site o usar |
Selecione sua credencial CapSolver neste nó. O parâmetro opcional
geetestApiServerSubdomainraramente é necessário — adicione-o apenas se o servidor GeeTest padrão não estiver funcionando para o seu site de destino.
| Configuração | Valor |
|---|---|
| Condição | ={{ $json.error }} não está vazio |
| Ramificação Verdadeira | Roteia para o nó Webhook de Resposta de Erro |
| Ramificação Falsa | Roteia para o nó Webhook de Resposta de Sucesso |
Ramificação 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 Webhook:
curl -X POST https://sua-instancia-n8n.com/webhook/solver-geetest-v4 \
-H "Content-Type: application/json" \
-d '{
"websiteURL": "https://example.com/login",
"captchaId": "e392e1d7fd421dc63325744d5a2b9c73"
}'
Resposta Esperada:
{
"taskId": "abc123...",
"solution": {
"captcha_id": "e392e1d7fd421dc63325744d5a2b9c73",
"lot_number": "7c18c041a6ed4e...",
"pass_token": "d88ce40c0a5c5a18...",
"gen_time": "1709123456",
"captcha_output": "dGVzdF9jYXB0Y2hh..."
},
"status": "ready"
}
Copie o JSON abaixo e importe-o para o n8n via Menu > Import from JSON:
{
"name": "GeeTest V4 — Solver API",
"nodes": [
{
"parameters": {
"content": "## GeeTest V4 — API de Solução\n\n**Para quem é:** Desenvolvedores que precisam resolver desafios do GeeTest V4 através de um endpoint POST simples.\n\n**O que faz:** Expõe um webhook que aceita parâmetros de captcha, resolve o desafio com o CapSolver e retorna tokens ou erros como JSON.\n\n**Como funciona:**\n1. O Webhook recebe um POST com URL de destino, chave do site e parâmetros opcionais\n2. O nó CapSolver resolve o desafio do GeeTest V4\n3. O nó IF verifica erros → retorna tokens de sucesso ou JSON de erro\n\n**Configuração:**\n1. Adicione sua chave de API do CapSolver em **Settings → Credentials → CapSolver API**\n2. Ative o fluxo de trabalho\n3. POST para o URL do webhook com seus 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 fluxo de trabalho raspa uma página de produto a cada 6 horas (agendamento) ou sob demanda (webhook), extrai o preço usando um nó HTML e o compara com um valor armazenado anteriormente.
Caminho Agendado:
A cada 6 Horas -> Resolver GeeTest V4 -> Buscar Página do Produto -> Extrair Dados
-> Comparar Dados -> Dados Alterados? -> Construir Alerta / Nenhuma Alteração
Comportamento Chave:
.product-price, h1)$workflow.staticData.lastPrice persiste o preço anterior entre as execuçõesdeal) e aumentos (gravidade: info){
"name": "GeeTest V4 Scraping — Price & Product Details — CapSolver + Schedule + Webhook",
"nodes": [
{
"parameters": {
"content": "## Raspagem do GeeTest V4 — Monitor de Preços e Produtos\n\n**Para quem é:** Equipes que precisam monitorar preços ou dados de produtos em sites protegidos pelo GeeTest V4.\n\n**O que faz:** Resolve o GeeTest V4, busca a página do produto, extrai o preço e o nome via seletores CSS, compara com valores armazenados e alerta sobre alterações, se houver.\n\n**Como funciona:**\n1. Um Agendamento (a cada 6 horas) ou Webhook aciona o fluxo.\n2. O CapSolver resolve o desafio do GeeTest V4.\n3. Uma solicitação HTTP busca a página do produto com os tokens resolvidos.\n4. O nó HTML extrai o preço e o nome do produto.\n5. Um nó de código compara o preço atual com o preço armazenado → alerta sobre alterações, se houver.\n\n**Configuração:**\n1. Adicione sua chave de API do CapSolver em **Settings → Credentials**.\n2. Substitua o URL do placeholder e a chave do 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": [
-920,
-380
],
"id": "sticky-blog-main-1773678228112-1",
"name": "Sticky Note"
},
{
"parameters": {
"content": "### Caminho Agendado\nExecuta automaticamente a cada 6 horas.\nOs resultados são persistidos nos dados estáticos do fluxo de trabalho para comparação entre execuções.",
"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": "### Caminho do Webhook\nAcionador sob demanda — mesma lógica, retorna resultados como uma resposta 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": "A cada 6 Horas"
},
{
"parameters": {
"operation": "GeeTest V4",
"websiteURL": "https://SEU-SITE-ALVO.com/pagina-do-produto",
"captchaId": "SEU_CAPTCHA_ID_AQUI",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
0
],
"id": "99999999-9999-9999-9999-999999999902",
"name": "Resolver GeeTest V4",
"credentials": {
"capSolverApi": {
"id": "YOUR_CREDENTIAL_ID",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"method": "POST",
"url": "https://SEU-SITE-ALVO.com/pagina-do-produto",
"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": "Buscar Página do Produto"
},
{
"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": "Extrair Dados"
},
{
"parameters": {
"jsCode": "// Obter preço atual e anterior dos dados estáticos do fluxo de trabalho\nconst staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Produto';\n\n// Analisar valores numéricos para comparação\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// Atualizar preço armazenado\nstaticData.lastPrice = currentPrice;\nstaticData.lastChecked = new Date().toISOString();\n\nconst changed = previousNum !== null && currentNum !== null && currentNum !== previousNum;\nconst direction = changed ? (currentNum < previousNum ? 'caiu' : 'aumentou') : 'inalterado';\nconst diff = changed ? Math.abs(currentNum - previousNum).toFixed(2) : '0';\n\nreturn [{\n json: {\n productName,\n currentPrice,\n previousPrice: previousPrice || 'primeira verificação',\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": "Comparar Dados"
},
{
"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": "Dados Alterados?"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "alert-001",
"name": "alert",
"value": "=Preço {{ $json.direction }} para {{ $json.productName }}: {{ $json.previousPrice }} → {{ $json.currentPrice }} ({{ $json.direction === 'caiu' ? '-' : '+' }}{{ $json.diff }})",
"type": "string"
},
{
"id": "alert-002",
"name": "severity",
"value": "={{ $json.direction === 'caiu' ? '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": "Construir Alerta"
},
{
"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": "Nenhuma Alteração"
},
{
"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://SEU-SITE-ALVO.com/pagina-do-produto",
"captchaId": "SEU_CAPTCHA_ID_AQUI",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
420
],
"id": "99999999-9999-9999-9999-999999999910",
"name": "Resolver GeeTest V4 [Webhook]",
"credentials": {
"capSolverApi": {
"id": "YOUR_CREDENTIAL_ID",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"method": "POST",
"url": "https://SEU-SITE-ALVO.com/pagina-do-produto",
"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": "Buscar Página do Produto [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": "Extrair Dados [Webhook]"
},
{
"parameters": {
"jsCode": "// Obter preço atual e anterior dos dados estáticos do fluxo de trabalho\nconst staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Produto';\n\n// Analisar valores numéricos para comparação\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// Atualizar preço armazenado\nstaticData.lastPrice = currentPrice;\nstaticData.lastChecked = new Date().toISOString();\n\nconst changed = previousNum !== null && currentNum !== null && currentNum !== previousNum;\nconst direction = changed ? (currentNum < previousNum ? 'caiu' : 'aumentou') : 'inalterado';\nconst diff = changed ? Math.abs(currentNum - previousNum).toFixed(2) : '0';\n\nreturn [{\n json: {\n productName,\n currentPrice,\n previousPrice: previousPrice || 'primeira verificação',\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": "Comparar Dados [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": "Dados Alterados? [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "alert-004",
"name": "alert",
"value": "=Preço {{ $json.direction }} para {{ $json.productName }}: {{ $json.previousPrice }} → {{ $json.currentPrice }} ({{ $json.direction === 'caiu' ? '-' : '+' }}{{ $json.diff }})",
"type": "string"
},
{
"id": "alert-005",
"name": "severity",
"value": "={{ $json.direction === 'caiu' ? '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": "Construir Alerta [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": "Nenhuma Alteração [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": "Responder ao Webhook [Webhook]"
}
],
"connections": {
"A cada 6 Horas": {
"main": [
[
{
"node": "Resolver GeeTest V4",
"type": "main",
"index": 0
}
]
]
},
"Resolver GeeTest V4": {
"main": [
[
{
"node": "Buscar Página do Produto",
"type": "main",
"index": 0
}
]
]
},
"Buscar Página do Produto": {
"main": [
[
{
"node": "Extrair Dados",
"type": "main",
"index": 0
}
]
]
},
"Extrair Dados": {
"main": [
[
{
"node": "Comparar Dados",
"type": "main",
"index": 0
}
]
]
},
"Comparar Dados": {
"main": [
[
{
"node": "Dados Alterados?",
"type": "main",
"index": 0
}
]
]
},
"Dados Alterados?": {
"main": [
[
{
"node": "Construir Alerta",
"type": "main",
"index": 0
}
],
[
{
"node": "Nenhuma Alteração",
"type": "main",
"index": 0
}
]
]
},
"Webhook Trigger": {
"main": [
[
{
"node": "Resolver GeeTest V4 [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Resolver GeeTest V4 [Webhook]": {
"main": [
[
{
"node": "Buscar Página do Produto [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Buscar Página do Produto [Webhook]": {
"main": [
[
{
"node": "Extrair Dados [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Extrair Dados [Webhook]": {
"main": [
[
{
"node": "Comparar Dados [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Comparar Dados [Webhook]": {
"main": [
[
{
"node": "Dados Alterados? [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Dados Alterados? [Webhook]": {
"main": [
[
{
"node": "Construir Alerta [Webhook]",
"type": "main",
"index": 0
}
],
[
{
"node": "Nenhuma Alteração [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Construir Alerta [Webhook]": {
"main": [
[
{
"node": "Responder ao Webhook [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Nenhuma Alteração [Webhook]": {
"main": [
[
{
"node": "Responder ao Webhook [Webhook]",
"type": "main",
"index": 0
}
]
]
}
],
"active": false,
"settings": {
"executionOrder": "v1"
}
}
Este fluxo de trabalho automatiza o envio de formulários de login protegidos pelo GeeTest V4 de ponta a ponta. Ele resolve o desafio do GeeTest V4 antes de enviar as credenciais.
Este fluxo de trabalho consiste em cinco nós:
| Configuração | Valor |
|---|---|
| Método HTTP | POST |
| Caminho | login-geetest-v4 |
| Responder | Response Node |
Isso cria um endpoint em: https://sua-instancia-n8n.com/webhook/login-geetest-v4
| Parâmetro | Valor |
|---|---|
| Operação | GeeTest V4 |
| URL do Site | https://SEU-SITE-ALVO.com/login |
| ID do Captcha | SEU_CAPTCHA_ID_AQUI |
Certifique-se também de selecionar sua credencial CapSolver.
| Configuração | Valor |
|---|---|
| Método | POST |
| URL | https://SEU-SITE-ALVO.com/login |
| Tipo de Conteúdo | form-urlencoded |
| Parâmetros do Corpo | username=SEU_USUARIO, password=SUA_SENHA, captcha_id={{ $('Resolver GeeTest V4').item.json.data.solution.captcha_id }}, lot_number={{ $('Resolver GeeTest V4').item.json.data.solution.lot_number }}, pass_token={{ $('Resolver GeeTest V4').item.json.data.solution.pass_token }}, gen_time={{ $('Resolver GeeTest V4').item.json.data.solution.gen_time }}, captcha_output={{ $('Resolver GeeTest V4').item.json.data.solution.captcha_output }} |
Importante: Substitua
SEU_USUARIOeSUA_SENHApelas suas credenciais reais. Além disso, você pode precisar ajustar os nomes dos campos do formulário para corresponder ao HTML do seu site de destino.
| Configuração | Valor |
|---|---|
| Responder Com | JSON |
| Corpo da Resposta | ={{ JSON.stringify($json) }} |
Envie uma solicitação POST para o seu endpoint Webhook:
curl -X POST https://sua-instancia-n8n.com/webhook/login-geetest-v4 \
-H "Content-Type: application/json" \
-d '{
"websiteURL": "https://example.com/login",
"captchaId": "e392e1d7fd421dc63325744d5a2b9c73",
"username": "testuser",
"password": "testpass"
}'
Resposta Esperada (Sucesso):
{
"status": "success",
"message": "Login successful",
"solution": {
"captcha_id": "e392e1d7fd421dc63325744d5a2b9c73",
"lot_number": "7c18c041a6ed4e...",
"pass_token": "d88ce40c0a5c5a18...",
"gen_time": "1709123456",
"captcha_output": "dGVzdF9jYXB0Y2hh..."
}
}
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": "GeeTest V4 Account Login — CapSolver + Schedule + Webhook",
"nodes": [
{
"parameters": {
"content": "## Automação de Login de Conta GeeTest V4 — CapSolver + Agendamento + Webhook\n\n**Para quem é:** Equipes que precisam automatizar o login em contas protegidas pelo GeeTest V4.\n\n**O que faz:** Resolve o desafio do GeeTest V4 e envia o formulário de login com os tokens resolvidos e as credenciais do usuário.\n\n**Como funciona:**\n1. O Webhook aciona o fluxo.\n2. O CapSolver resolve o desafio do GeeTest V4.\n3. Uma solicitação HTTP envia o formulário de login com os tokens resolvidos e as credenciais do usuário.\n4. O Webhook retorna o resultado do login.\n\n**Configuração:**\n1. Adicione sua chave de API do CapSolver em **Settings → Credentials**.\n2. Substitua o URL do 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": [
-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": "Resolver 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": "={{ $('Resolver GeeTest V4').item.json.data.solution.captcha_id }}"
},
{
"name": "lot_number",
"value": "={{ $('Resolver GeeTest V4').item.json.data.solution.lot_number }}"
},
{
"name": "pass_token",
"value": "={{ $('Resolver GeeTest V4').item.json.data.solution.pass_token }}"
},
{
"name": "gen_time",
"value": "={{ $('Resolver GeeTest V4').item.json.data.solution.gen_time }}"
},
{
"name": "captcha_output",
"value": "={{ $('Resolver 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": "Enviar Formulário de Login"
},
{
"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": "Responder ao Webhook"
}
],
"connections": {
"Webhook Trigger": {
"main": [
[
{
"node": "Resolver GeeTest V4",
"type": "main",
"index": 0
}
]
]
},
"Resolver GeeTest V4": {
"main": [
[
{
"node": "Enviar Formulário de Login",
"type": "main",
"index": 0
}
]
]
},
"Enviar Formulário de Login": {
"main": [
[
{
"node": "Responder ao Webhook",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
}
}
Este erro indica que sua conta ou plano CapSolver não inclui acesso ao GeeTest V4. Verifique seu Painel CapSolver para confirmar se este serviço está incluído em seu plano.
Este erro indica que o parâmetro websiteURL que você forneceu no nó CapSolver está incorreto. Verifique novamente a guia de rede das ferramentas de desenvolvedor do seu site de destino para garantir que você está usando o valor correto.
Se o login falhar mesmo com o GeeTest V4 resolvido com sucesso, o problema pode estar nos seguintes pontos:
Este erro indica que a chave de API do CapSolver que você configurou no n8n está incorreta ou expirou. Verifique seu Painel CapSolver e atualize a credencial no n8n.
websiteURL e quaisquer parâmetros opcionais como captchaId e geetestApiServerSubdomain estão corretos. Isso é crucial para o sucesso da resolução do GeeTest V4.Pronto para começar? Inscreva-se no CapSolver e use o código de bônus n8n para obter um bônus adicional de 8% em sua primeira recarga!

O GeeTest V4 é a mais recente geração do sistema CAPTCHA comportamental da GeeTest, que usa desafios adaptativos e análise comportamental para proteger sites.
O GeeTest V4 é estruturalmente mais simples que o V3, exigindo apenas um parâmetro captchaId estático em vez do fluxo de desafio dinâmico que o V3 exigia. Ele também usa o script gcaptcha4.js e retorna 5 campos de solução.
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 V4. As tarefas de resolução do GeeTest V4 são mais caras do que o reconhecimento simples de imagem para texto, mas mais baratas do que outros tipos complexos de CAPTCHA.
As tarefas de resolução do GeeTest V4 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 V4 envolve a criação e o polling de tarefas, portanto, não é instantânea.
O serviço de resolução do GeeTest V4 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 o websiteURL e o captchaId.
Se o seu token do GeeTest V4 não estiver sendo aceito, verifique o seguinte:
websiteURL e captchaId estão corretos.Se o login falhar mesmo com o GeeTest V4 resolvido com sucesso, verifique o seguinte:
Sim. Este fluxo de trabalho funciona com n8n auto-hospedado e 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.
