
Adélia Cruz
Neural Network Developer

Se você já tentou coletar preços, dados de produtos ou conteúdo de páginas protegidas, já sabe que o difícil não é apenas carregar a URL. O fluxo de trabalho também precisa resolver os captchas do site, enviar o token resolvido da forma que o site espera e, em seguida, extrair os dados corretos da resposta protegida.
É por isso que exemplos simples de "resolver captchas e pronto" não são suficientes para automação real. Um site pode esperar o token em um cabeçalho, corpo do formulário, payload JSON, string de consulta, cookie ou outro campo específico da aplicação. Ele pode usar reCAPTCHA, Turnstile ou outro desafio de captcha totalmente diferente. E, uma vez que a resposta protegida retorne, os seletores e a lógica de saída ainda precisam corresponder ao seu objetivo.
Neste guia, você aprenderá a construir raspadores para sites protegidos por captcha no n8n usando CapSolver. A explicação principal está baseada no fluxo de trabalho do repositório Scraping — Price & Product Details — CapSolver + Schedule + Webhook, mas o mesmo modelo pode ser adaptado para:
Este artigo trata de automação prática e autorizada em destinos que você possui, gerencia ou está autorizado a testar.
Importante: Estes fluxos de trabalho são exemplos e modelos iniciais, não receitas universais. Você deve esperar modificar as configurações de captcha, o método de envio do token, o payload da requisição, cabeçalhos, cookies, seletores de extração e a lógica de saída para corresponder a cada site específico.
O exemplo principal deste artigo é um modelo de raspador de destino fixo que agora suporta dois modos de ativação:
No modelo padrão do repositório, esse fluxo de trabalho:
x-recaptcha-tokenprice e productName$workflow.staticDataO mesmo padrão pode se tornar:
Esses modelos de repositório seguem o mesmo esqueleto reutilizável:
ativador → resolver captchas → enviar requisição protegida → extrair resultado → comparar/armazenar/saída
Essa estrutura se encaixa em vários casos de uso legítimos:
| Caso de uso | O que muda |
|---|---|
| Raspagem | Extrair campos de preço e comparar ao longo do tempo |
| Raspagem de dados de produto | Extrair campos como título, SKU, vendedor, estoque ou descrição |
| Verificação de estoque | Comparar texto de disponibilidade, quantidade ou estado do botão de compra |
| Entrar em sua própria conta | Enviar o token resolvido com sua requisição de login e verificar o sucesso do login |
| Recuperação de conteúdo protegido | Buscar conteúdo com acesso restrito e retornar os campos extraídos |
| Raspagem disparada por webhook | Permitir que outro serviço ative o destino configurado fixo sob demanda |
A estrutura permanece reutilizável, mas os detalhes da implementação real podem ser diferentes em cada site. Na prática, os usuários devem tratar cada fluxo aqui como exemplo e, em seguida, adaptar a configuração de resolução, formato da requisição, localização do token e lógica de extração para o destino que estão automatizando.
O fluxo de trabalho principal acima recupera conteúdo bruto da página e compara preços. Os fluxos a seguir estendem o mesmo padrão de resolução de captcha — Ativador → Resolver Captcha → Enviar Requisição Protegida → Avaliar Resultado — para casos de uso específicos. Cada um requer os mesmos pré-requisitos: uma instância n8n, uma credencial CapSolver e os parâmetros de captcha do destino.
| Fluxo | Propósito |
|---|---|
Scraping — Price & Product Details — CapSolver + Schedule + Webhook |
Modelo de agendamento + webhook de destino fixo que resolve reCAPTCHA v3, envia o token no cabeçalho x-recaptcha-token, extrai price e productName, compara os valores com $workflow.staticData e pode ser usado para raspagem, extração de detalhes de produto ou verificações semelhantes em páginas de produto protegidas |
Nota de ativação: Este modelo é importado como
active: false. O caminho do webhook não está ativo até que você configure os espaços reservados, escolha sua credencial CapSolver e ative o fluxo de trabalho no n8n.
Antes de começar, certifique-se de ter:
Para o exemplo principal deste artigo, o destino é assumido como usando reCAPTCHA, então os valores-chave são:
websiteURLwebsiteKeypageAction para reCAPTCHA v3Importante: A explicação de identificação de parâmetros abaixo está intencionalmente limitada a exemplos de reCAPTCHA. Destinos reais podem usar um tipo de desafio diferente — como Cloudflare Turnstile, Cloudflare Challenge, GeeTest, DataDome, AWS WAF ou MTCaptcha — e, nesse caso, a configuração do nó de resolução, campos necessários e padrão de requisição protegida serão diferentes.
Para páginas protegidas por reCAPTCHA, os valores principais geralmente são:
| Parâmetro | O que significa |
|---|---|
websiteURL |
A URL onde o captcha é exibido ou necessário |
websiteKey |
A chave pública usada pela página |
pageAction |
A string de ação esperada pela reCAPTCHA v3 |
No modelo de monitoramento de preço do repositório, o nó CapSolver é configurado com:
operation: reCAPTCHA v3websiteURL: https://SEU-ALVO-SITE.com/pagina-de-produtowebsiteKey: SUA_CHAVE_AQUIpageAction: visualizar_produtoAo inspecionar um destino de reCAPTCHA, verifique:
pageAction é necessárioImportante: Esta não é uma seção de detecção universal de captchas. Se o destino usar um tipo de desafio diferente — como Cloudflare Turnstile, Cloudflare Challenge, GeeTest, DataDome, AWS WAF ou MTCaptcha — você precisará alterar tanto as configurações do CapSolver quanto a requisição HTTP que envia o token resolvido.
O fluxo de trabalho do repositório Scraping — Price & Product Details — CapSolver + Schedule + Webhook agora suporta dois caminhos de ativação de destino fixo:
Todo 6 horas para verificações recorrentesWebhook Trigger para execuções sob demandaAmbos os caminhos usam os mesmos espaços reservados de destino e a mesma lógica de raspagem. A versão do webhook simplesmente termina em Responder ao Webhook para que o chamador receba o payload final de alerta ou sem alteração como JSON.
O caminho de agendamento usa esses nós:
Todo 6 horasResolver reCAPTCHA v3Buscar Página de ProdutoExtrair DadosComparar DadosDados Alterados?Criar AlertaSem AlteraçãoO caminho de webhook duplica a mesma lógica para o mesmo destino fixo:
Webhook TriggerResolver reCAPTCHA v3 [Webhook]Buscar Página de Produto [Webhook]Extrair Dados [Webhook]Comparar Dados [Webhook]Dados Alterados? [Webhook]Criar Alerta [Webhook]Sem Alteração [Webhook]Responder ao WebhookUse agendamento quando quiser verificações recorrentes, como raspagem ou verificação de estoque.
Use webhook quando outro fluxo, serviço ou aplicação devem ativar o mesmo destino configurado sob demanda.
O modelo usa:
| Configuração | Valor |
|---|---|
| Operação | reCAPTCHA v3 |
websiteURL |
https://SEU-ALVO-SITE.com/pagina-de-produto |
websiteKey |
SUACHAVE_AQUI |
pageAction |
visualizar_produto |
O token resolvido é enviado em um cabeçalho de requisição:
| Cabeçalho | Valor |
|---|---|
user-agent |
Usuário do navegador |
x-recaptcha-token |
{{ $json.data.solution.gRecaptchaResponse }} |
Este é um dos detalhes mais importantes do fluxo de trabalho. O modelo do repositório não assume que o token sempre pertence a g-recaptcha-response. Neste exemplo, ele vai para um cabeçalho personalizado.
price e productNameO nó HTML extrai:
| Chave | Seletor CSS |
|---|---|
price |
.product-price, [data-price], .price |
productName |
h1, .product-title |
O nó Código armazena e compara os valores usando:
$workflow.staticData.lastPrice$workflow.staticData.lastCheckedIsso permite que o fluxo de trabalho distinga entre:
O nó IF verifica {{ $json.changed }}.
Se o preço mudou, o fluxo de trabalho vai para Criar Alerta.
Se não, vai para Sem Alteração.
No caminho do webhook, qualquer ramificação então vai para Responder ao Webhook.
Embora o exemplo principal inclua lógica de comparação de preços, é mais útil pensar nele como um modelo de raspador de página de produto protegida com lógica de comparação.
As partes reutilizáveis são:
É por isso que a mesma estrutura pode impulsionar:
Esta é a parte que importa mais em um destino real.
Para a maioria dos sites reais, você deve assumir que quase tudo aqui é ajustável: o tipo de desafio, parâmetros de resolução, onde o token é enviado, o corpo da requisição, cookies, cabeçalhos, seletores e até os critérios finais de sucesso. Esses fluxos de trabalho do repositório são exemplos de padrões funcionais, não receitas fixas que se encaixam em cada site inalteradas.
Os fluxos de caso de uso do repositório agora suportam agendamento + webhook.
Use:
Os caminhos de webhook nestes modelos são ativadores de destino fixo, não APIs públicas para destinos fornecidos por usuários arbitrários.
O exemplo principal de monitoramento de preço usa reCAPTCHA v3, mas seu destino pode usar:
Se isso mudar, você precisará atualizar o passo de resolução correspondente.
Mesmo que dois sites usem reCAPTCHA, as configurações ainda podem diferir.
Você pode precisar alterar:
websiteURLwebsiteKeypageActionO modelo de raspador expõe esses como campos de configuração de espaço reservado porque eles são esperados para mudar.
Não assuma que o token sempre vai para o mesmo lugar.
Este repositório já mostra vários padrões:
| Padrão | Exemplo do repositório |
|---|---|
| Cabeçalho de requisição | Scraping — CapSolver + Schedule usa x-recaptcha-token |
| Corpo do formulário | Fluxos de login normalmente usam g-recaptcha-response no corpo codificado em formulário |
Em sites reais, o token resolvido pode pertencer a:
Este exemplo do repositório é um padrão de envio, não um universal.
A requisição protegida pode exigir mais do que apenas o token de captcha ou desafio.
Você pode precisar ajustar:
Isso é especialmente comum para:
O modelo principal de raspagem extrai:
priceproductNameMas você pode trocar por:
O código de monitoramento de preço atual compara valores numéricos, mas o mesmo padrão pode ser adaptado para:
O JSON abaixo é a versão importável atual de Scraping — Price & Product Details — CapSolver + Schedule + Webhook deste repositório, incluindo os caminhos de agendamento + webhook.
{
"nodes": [
{
"parameters": {
"content": "## Scraping \u2014 Price & Product Monitor\n\n### Como funciona\n\n1. Dispara por meio de um agendamento ou entrada de webhook para iniciar o monitoramento de preços.\n2. Resolve reCAPTCHA para acessar a página de produto alvo.\n3. Recupera e extrai dados da página de produto para análise posterior.\n4. Compara os dados recentemente obtidos com os dados anteriormente armazenados para detectar mudanças.\n5. Verifica se houve mudanças e prepara alertas, se necessário.\n6. Envia respostas com base na análise dos dados por canais designados.\n\n### Passos de configuração\n\n- [ ] Configure o intervalo do gatilho agendado no nó 'Todo 6 horas'.\n- [ ] Defina os detalhes do site alvo no nó 'Definir Configuração do Alvo [Agendamento]'.\n- [ ] Configure o solucionador de reCAPTCHA com a chave de API no nós 'Resolver reCAPTCHA v3'.\n- [ ] Defina a URL e caminho do webhook no 'Webhook Trigger'.\n- [ ] Defina os critérios e destino do alerta nos nós 'Criar Alerta'.\n\n### Personalização\n\nAjuste o padrão de extração nos nós 'Extrair Dados' para se adequar aos detalhes específicos do produto.",
"height": 896,
"width": 480
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-1328,
-304
],
"id": "52c7808e-d2bc-4779-85e6-909a51066338",
"name": "Nota Colante"
},
{
"parameters": {
"content": "## Configuração do gatilho agendado\n\nInicia o processo de monitoramento de dados a cada 6 horas usando um gatilho agendado e define a configuração do destino para raspagem.",
"height": 320,
"width": 496,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-752,
-160
],
"id": "3c5cee67-552d-48ea-8717-7c5126269e2e",
"name": "Nota Colante1"
},
{
"parameters": {
"content": "## Processo de raspagem agendado\n\nResolve o reCAPTCHA, busca a página do produto, extrai os dados e os compara com registros anteriores para identificar mudanças, seguindo um gatilho agendado.",
"height": 496,
"width": 1680,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-144,
-304
],
"id": "d0315be2-111c-4893-bf42-2f2cc2eb186f",
"name": "Nota Colante2"
},
{
"parameters": {
"content": "## Configuração do gatilho de webhook\n\nGerencia a monitoração de dados acionada manualmente por meio de um webhook de entrada e resolve o reCAPTCHA para prosseguir.",
"height": 304,
"width": 816,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-768,
336
],
"id": "a78f1606-07fb-40fd-af82-e1dc9b766206",
"name": "Nota Colante3"
},
{
"parameters": {
"content": "## Processo de raspagem por webhook\n\nProcessa solicitações acionadas por webhook buscando a página do produto, extraíndo dados e identificando mudanças.",
"height": 272,
"width": 1088,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
160,
320
],
"id": "1a677fd9-a3a8-404f-ba9a-2b087d7bfe11",
"name": "Nota Colante4"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 6
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [
-704,
0
],
"id": "sc-901",
"name": "A cada 6 horas"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "cfg-001",
"name": "websiteURL",
"value": "https://SEU-SITE-ALVO.com/pagina-do-produto",
"type": "string"
},
{
"id": "cfg-002",
"name": "websiteKey",
"value": "CHAVE_DO_SITE_AQUI",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
-400,
0
],
"id": "sc-900",
"name": "Definir Configuração de Alvo [Agendamento]"
},
{
"parameters": {
"operation": "reCAPTCHA v3",
"websiteURL": "={{ $json.websiteURL }}",
"websiteKey": "={{ $json.websiteKey }}",
"optional": {
"pageAction": "visualizar_produto"
}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
0
],
"id": "sc-902",
"name": "Resolver reCAPTCHA v3",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "Conta CapSolver"
}
}
},
{
"parameters": {
"method": "POST",
"url": "={{ $('Definir Configuração de Alvo [Agendamento]').first().json.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": "x-recaptcha-token",
"value": "={{ $json.data.solution.gRecaptchaResponse }}"
}
]
},
"options": {
"response": {
"response": {}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
208,
0
],
"id": "sc-903",
"name": "Buscar Página do Produto"
},
{
"parameters": {
"operation": "extractHtmlContent",
"extractionValues": {
"values": [
{
"key": "price",
"cssSelector": ".preco-do-produto, [data-preco], .preco"
},
{
"key": "productName",
"cssSelector": "h1, .titulo-do-produto"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.html",
"typeVersion": 1.2,
"position": [
512,
0
],
"id": "sc-904",
"name": "Extrair Dados"
},
{
"parameters": {
"jsCode": "const staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Produto';\nconst parsePrice = (str) => { if (!str) return null; const match = str.match(/[\\d,]+\\.?\\d*/); return match ? parseFloat(match[0].replace(',', '')) : null; };\nconst currentNum = parsePrice(currentPrice);\nconst previousNum = parsePrice(previousPrice);\nstaticData.lastPrice = currentPrice;\nstaticData.lastChecked = new Date().toISOString();\nconst changed = previousNum !== null && currentNum !== null && currentNum !== previousNum;\nconst direction = changed ? (currentNum < previousNum ? 'caiu' : 'aumentou') : 'sem alteração';\nconst diff = changed ? Math.abs(currentNum - previousNum).toFixed(2) : '0';\nreturn [{ json: { productName, currentPrice, previousPrice: previousPrice || 'primeira verificação', changed, direction, diff: changed ? `R$${diff}` : null, checkedAt: new Date().toISOString() } }];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
800,
0
],
"id": "sc-905",
"name": "Comparar Dados"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "if-1",
"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": "sc-906",
"name": "Dados Alterados?"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "a1",
"name": "alert",
"value": "=Preço {{ $json.direction }} para {{ $json.productName }}: {{ $json.previousPrice }} → {{ $json.currentPrice }}",
"type": "string"
},
{
"id": "a2",
"name": "severidade",
"value": "={{ $json.direction === 'caiu' ? 'oferta' : 'informação' }}",
"type": "string"
},
{
"id": "a3",
"name": "checkedAt",
"value": "={{ $json.checkedAt }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1392,
-192
],
"id": "sc-907",
"name": "Criar Alerta"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "n1",
"name": "status",
"value": "sem_alteracao",
"type": "string"
},
{
"id": "n2",
"name": "currentPrice",
"value": "={{ $json.currentPrice }}",
"type": "string"
},
{
"id": "n3",
"name": "checkedAt",
"value": "={{ $json.checkedAt }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1392,
32
],
"id": "sc-908",
"name": "Sem Alteração"
},
{
"parameters": {
"httpMethod": "POST",
"path": "monitoramento-de-precos",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-720,
464
],
"id": "sc-909",
"name": "Gatilho de Webhook",
"webhookId": "sc-909-webhook",
"onError": "continueRegularOutput"
},
{
"parameters": {
"operation": "reCAPTCHA v3",
"websiteURL": "={{ $json.body.websiteURL }}",
"websiteKey": "={{ $json.body.websiteKey }}",
"optional": {
"pageAction": "={{ $json.body.pageAction || 'visualizar_produto' }}"
}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
464
],
"id": "sc-910",
"name": "Resolver reCAPTCHA v3 [Webhook]",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "Conta CapSolver"
}
}
},
{
"parameters": {
"method": "POST",
"url": "={{ $('Gatilho de Webhook').item.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": "x-recaptcha-token",
"value": "={{ $json.data.solution.gRecaptchaResponse }}"
}
]
},
"options": {
"response": {
"response": {}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
208,
432
],
"id": "sc-911",
"name": "Buscar Página do Produto [Webhook]"
},
{
"parameters": {
"operation": "extractHtmlContent",
"extractionValues": {
"values": [
{
"key": "price",
"cssSelector": ".preco-do-produto, [data-preco], .preco"
},
{
"key": "productName",
"cssSelector": "h1, .titulo-do-produto"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.html",
"typeVersion": 1.2,
"position": [
512,
432
],
"id": "sc-912",
"name": "Extrair Dados [Webhook]"
},
{
"parameters": {
"jsCode": "const staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Produto';\nconst parsePrice = (str) => { if (!str) return null; const match = str.match(/[\\d,]+\\.?\\d*/); return match ? parseFloat(match[0].replace(',', '')) : null; };\nconst currentNum = parsePrice(currentPrice);\nconst previousNum = parsePrice(previousPrice);\nstaticData.lastPrice = currentPrice;\nstaticData.lastChecked = new Date().toISOString();\nconst changed = previousNum !== null && currentNum !== null && currentNum !== previousNum;\nconst direction = changed ? (currentNum < previousNum ? 'caiu' : 'aumentou') : 'sem alteração';\nconst diff = changed ? Math.abs(currentNum - previousNum).toFixed(2) : '0';\nreturn [{ json: { productName, currentPrice, previousPrice: previousPrice || 'primeira verificação', changed, direction, diff: changed ? `R$${diff}` : null, checkedAt: new Date().toISOString() } }];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
800,
432
],
"id": "sc-913",
"name": "Comparar Dados [Webhook]"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "if-2",
"leftValue": "={{ $json.changed }}",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
1104,
432
],
"id": "sc-914",
"name": "Dados Alterados? [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "a4",
"name": "alert",
"value": "=Preço {{ $json.direction }} para {{ $json.productName }}: {{ $json.previousPrice }} → {{ $json.currentPrice }}",
"type": "string"
},
{
"id": "a5",
"name": "severidade",
"value": "={{ $json.direction === 'caiu' ? 'oferta' : 'informação' }}",
"type": "string"
},
{
"id": "a6",
"name": "checkedAt",
"value": "={{ $json.checkedAt }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1424,
384
],
"id": "sc-915",
"name": "Criar Alerta [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "n4",
"name": "status",
"value": "sem_alteracao",
"type": "string"
},
{
"id": "n5",
"name": "currentPrice",
"value": "={{ $json.currentPrice }}",
"type": "string"
},
{
"id": "n6",
"name": "checkedAt",
"value": "={{ $json.checkedAt }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1440,
592
],
"id": "sc-916",
"name": "Sem Alteração [Webhook]"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
1712,
512
],
"id": "sc-917",
"name": "Responder ao Webhook"
}
],
"connections": {
"A cada 6 horas": {
"main": [
[
{
"node": "Configurar Alvo [Agendamento]",
"type": "main",
"index": 0
}
]
]
},
"Configurar Alvo [Agendamento]": {
"main": [
[
{
"node": "Resolver reCAPTCHA v3",
"type": "main",
"index": 0
}
]
]
},
"Resolver reCAPTCHA v3": {
"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": "Criar Alerta",
"type": "main",
"index": 0
}
],
[
{
"node": "Nenhuma Alteração",
"type": "main",
"index": 0
}
]
]
},
"Gatilho Webhook": {
"main": [
[
{
"node": "Resolver reCAPTCHA v3 [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Resolver reCAPTCHA v3 [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": "Criar Alerta [Webhook]",
"type": "main",
"index": 0
}
],
[
{
"node": "Nenhuma Alteração [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Criar Alerta [Webhook]": {
"main": [
[
{
"node": "Responder ao Webhook",
"type": "main",
"index": 0
}
]
]
},
"Nenhuma Alteração [Webhook]": {
"main": [
[
{
"node": "Responder ao Webhook",
"type": "main",
"index": 0
}
]
]
}
},
"pinData": {},
"meta": {
"instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
}
}
Após configurar os marcadores de posição e ativar o fluxo de trabalho, dispare o caminho do webhook:
curl -X POST https://sua-instância-n8n.com/webhook/monitoramento-de-preços \
-H "Content-Type: application/json" \
-d '{}'
Resposta esperada (primeira verificação):
{
"status": "sem_alteração",
"preço_atual": "$29.99",
"verificado_em": "2026-03-11T08:00:00.000Z"
}
Resposta esperada (preço alterado):
{
"alerta": "O preço caiu para Widget Pro: $39.99 → $29.99 (-$10.00)",
"gravidade": "oferta",
"verificado_em": "2026-03-11T14:00:00.000Z"
}
Uma resposta com dados de preço reais confirma que o pipeline completo funcionou — captcha resolvido, página protegida obtida, dados extraídos e lógica de comparação executada.
Se o CapSolver retornar um token, mas o site ainda bloquear a solicitação, o problema geralmente não está na resolução em si. Causas comuns:
pageAction incorretoSe o alvo usar um desafio não reCAPTCHA — como Cloudflare Turnstile, Cloudflare Challenge, GeeTest, DataDome, AWS WAF ou MTCaptcha — o exemplo principal não funcionará sem alterações. Você precisará atualizar:
Se o nó HTML não extrair os campos que você espera:
Os modelos do repositório são importados como inativos. Até que você:
o caminho do webhook não estará ativo.
Criar Alerta ou os nós de sucesso/falha de autenticação.Pronto para começar? Registre-se no CapSolver e use o código de bônus OPENCLAW para obter um bônus adicional de 6% na primeira recarga!

A principal lição é simples: resolver captchas é apenas um passo no fluxo de trabalho. O verdadeiro raspador ainda precisa enviar o token corretamente, enviar a forma de requisição correta e extrair os campos que importam para o seu caso de uso.
Também é por isso que esses modelos devem ser tratados como exemplos. Um site diferente pode usar um tipo de captcha diferente, esperar o token em outro lugar, precisar de cookies ou campos adicionais, retornar uma forma de resposta diferente e exigir lógica de extração ou validação diferente.
Este modelo fornece um ponto de partida para:
Ele usa o padrão geral:
gatilho -> resolver captchas -> enviar requisição protegida -> extrair ou verificar resultado -> saída
Configure os marcadores de posição, mantenha os fluxos de trabalho inativos até que correspondam ao seu alvo e, em seguida, ative o caminho de agendamento ou webhook que se adequa ao seu caso de uso.
O modelo de raspagem pode ser adaptado para fluxos de login alterando o nó HTTP Request para enviar credenciais junto com o token resolvido. Consulte os guias dedicados para tipos de captcha (reCAPTCHA, Turnstile, etc.) para modelos prontos de fluxo de login.
Nesse caso, você deve modificar o fluxo de trabalho. As configurações de reCAPTCHA e o padrão de requisição do exemplo principal não são universais. O CapSolver suporta Cloudflare Turnstile, Cloudflare Challenge, GeeTest V3/V4, DataDome, AWS WAF, MTCaptcha e outros. Atualize o passo de resolução do CapSolver e a requisição protegida para corresponder ao tipo de desafio e padrão de envio de token reais usados pelo alvo.
Onde o site alvo espera. Isso pode ser:
O modelo de monitoramento de preço usa um cabeçalho. Outros sites variam.
Normalmente, sim. Mesmo sites que usam a mesma família de captcha podem exigir websiteURL, websiteKey, pageAction, configurações invisíveis ou outras opções de tarefa diferentes.
Sim. Substitua os seletores e a lógica de saída pelo que precisar, como estoque, título, SKU, descrição, conteúdo protegido, status de login ou sinais de saúde do site.
Comece verificando a resposta protegida retornada pelo nó HTTP Request.
Debugue o fluxo na ordem: resolver -> enviar -> inspecionar resposta -> extrair.
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.

Descubra a melhor IA para resolver quebra-cabeças de imagens. Aprenda como os APIs ImageToText e o Vision Engine da CapSolver automatizam desafios visuais complexos com alta precisão.
