
Rajinder Singh
Deep Learning Researcher

CAPTCHAs baseados em imagem estão por toda parte — formulários de login, páginas de inscrição, sites de venda de ingressos e portais governamentais. Eles exibem uma imagem distorcida de letras, números ou uma mistura de ambos, e pedem aos usuários para digitar o que veem. Automatizá-los com ferramentas tradicionais significa construir seu próprio pipeline de OCR, lidar com filtros de ruído e tratar casos especiais para cada fonte e tipo de distorção.
E se você pudesse resolver CAPTCHAs de imagem automaticamente em seus fluxos de trabalho n8n — seja você construindo uma API de resolução reutilizável ou automatizando envios de formulários que exigem a leitura de um captcha de imagem — tudo sem treinar um único modelo?
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 captchas de Imagem para Texto sob demanda — seja como um endpoint de API autônomo ou como uma etapa em um 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:
Fluxo de Trabalho de Uso Direto — CapSolver incorporado como uma etapa em uma automação maior:
ImageToTextTask é o serviço de reconhecimento baseado em OCR do CapSolver. Você envia uma imagem de captcha codificada em base64, e o CapSolver retorna o texto reconhecido — letras, números ou ambos — instantaneamente.
Isso é fundamentalmente diferente de outras operações do CapSolver, como reCAPTCHA ou Turnstile:
| Característica | ImageToText (Reconhecimento) | reCAPTCHA / Turnstile (Token) |
|---|---|---|
| Tipo de Recurso | Reconhecimento | Token |
| Entrada | Imagem Base64 | URL do site + chave do site |
| Resultado | Texto reconhecido (instantâneo) | Token (requer sondagem) |
| Requer Proxy | Não | Depende do tipo de tarefa |
| Caso de Uso | Leitura de texto distorcido de imagens | Geração de tokens de verificação |
A principal diferença é que as operações de Reconhecimento retornam resultados instantaneamente — não há criação de tarefa e depois sondagem. Você envia a imagem, o CapSolver a lê, e o texto é retornado em um único ciclo de solicitação-resposta.
| Parâmetro | Valor | Descrição |
|---|---|---|
body |
String Base64 | A imagem do captcha, codificada em base64. Sem caracteres de nova linha, sem prefixo data:image/...;base64, — apenas a string base64 bruta |
module |
"common" |
O módulo de reconhecimento. "common" lida com OCR alfanumérico geral |
| Parâmetro | Descrição |
|---|---|
websiteURL |
O URL da página onde o captcha aparece (ajuda o CapSolver a otimizar o reconhecimento) |
images (1-9) |
Imagens adicionais para o módulo "number" ao resolver captchas numéricos de várias imagens |
| Módulo | Propósito |
|---|---|
common |
OCR geral — letras, números, caracteres mistos. Padrão para a maioria dos captchas |
number |
Captchas apenas numéricos. Suporta resolução em lote com até 9 imagens adicionais através do parâmetro images |
Antes de começar, certifique-se de ter o seguinte:
Importante: Certifique-se de ter saldo suficiente em sua conta CapSolver. As tarefas ImageToText consomem créditos com base no uso.
O CapSolver está disponível como uma integração oficial no n8n — sem necessidade de instalar 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ê verá um banner verde "Connection tested successfully" confirmando que sua chave de API é válida.

Importante: Todos os nós do CapSolver em seus fluxos de trabalho farão 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 seus fluxos de trabalho de resolução de Imagem para Texto!
Antes de mergulhar nos fluxos de trabalho, é crucial entender os requisitos de base64 para ImageToTextTask. Esta é a fonte mais comum de erros.
O parâmetro body deve conter uma string base64 limpa — os bytes codificados brutos do arquivo de imagem. Especificamente:
data: — se você tiver data:image/png;base64,iVBORw0KGgo..., você deve remover a parte data:image/png;base64,\nQuando você busca uma imagem usando o nó HTTP Request no n8n, a resposta vem como dados binários. Para convertê-la para base64 para o CapSolver, use um nó Code:
// Converte dados de imagem binários para base64 limpo
const binaryData = $input.first().binary.data;
const base64String = binaryData.data; // Já é base64 no formato binário do n8n
// Remove o prefixo data: se presente (verificação de segurança)
const cleanBase64 = base64String.replace(/^data:image\/\w+;base64,/, "");
// Remove quaisquer caracteres de nova linha
const finalBase64 = cleanBase64.replace(/\n/g, "");
return [{ json: { body: finalBase64 } }];
| Erro | Resultado |
|---|---|
Envio de data:image/png;base64,... |
CapSolver rejeita o conteúdo como inválido |
| String Base64 contém caracteres de nova linha | CapSolver não consegue decodificar a imagem |
| Envio de URL de imagem em vez de base64 | Parâmetro incorreto — body espera base64, não um URL |
| Envio de uma string vazia | CapSolver retorna um erro |
Este fluxo de trabalho cria um endpoint de API POST que aceita uma imagem de captcha base64 e retorna o texto reconhecido.
O fluxo de trabalho consiste em seis nós:
body existe e é um base64 válido| Configuração | Valor |
|---|---|
| Método HTTP | POST |
| Caminho | solver-image-to-text |
| Resposta | Response Node |
Isso cria um endpoint em: https://your-n8n-instance.com/webhook/solver-image-to-text
Este nó garante que o corpo da solicitação contenha um parâmetro body válido e remove quaisquer prefixos data: ou caracteres de nova linha acidentais:
const body = $input.first().json.body;
if (!body || !body.body) {
return [{ json: { error: 'Missing required field: body (base64 encoded image)' } }];
}
let imageBase64 = String(body.body);
// Remove o prefixo data: se incluído acidentalmente
imageBase64 = imageBase64.replace(/^data:image\/\w+;base64,/, '');
// Remove caracteres de nova linha e espaços em branco
imageBase64 = imageBase64.replace(/[\n\r\s]/g, '');
// Validação básica de base64
if (!/^[A-Za-z0-9+\/]+=*$/.test(imageBase64)) {
return [{ json: { error: 'Invalid base64 encoding in body field' } }];
}
return [{
json: {
body: imageBase64,
module: body.module || 'common'
}
}];
| Parâmetro | Valor | Descrição |
|---|---|---|
| Recurso | Recognition |
Selecione o recurso de Reconhecimento (não Token) |
| Operação | Image To Text |
Operação ImageToTextTask |
| Corpo | {{ $json.body }} |
String de imagem base64 limpa |
| Módulo | {{ $json.module }} |
Módulo de reconhecimento (padrão: common) |
Importante: No nó CapSolver, você deve selecionar Resource = Recognition primeiro, e depois Operation = Image To Text. Isso é diferente das operações de Token, como reCAPTCHA ou Turnstile. Selecione também sua credencial CapSolver neste nó.
| Configuração | Valor |
|---|---|
| Condição | ={{ $json.error }} não está vazio |
| Ramo Verdadeiro | Vai para o nó Error Respond to Webhook |
| Ramo Falso | Vai para o nó Success Respond to Webhook |
O nó CapSolver continua em caso de erro (onError: continueRegularOutput), então os erros virão aqui como { "error": "..." } em vez de travar o fluxo de trabalho.
| Configuração | Valor |
|---|---|
| Responder com | JSON |
| Corpo da Resposta | ={{ JSON.stringify($json.data) }} |
| Configuração | Valor |
|---|---|
| Responder com | JSON |
| Corpo da Resposta | ={{ JSON.stringify({ error: $json.error }) }} |
As mensagens de erro seguem um dos dois formatos:
| Ponto de Falha | Formato |
|---|---|
| Falha na criação da tarefa | { "error": "..." } |
| Falha no reconhecimento | { "status": "failed", "error": "..." } |
Envie uma solicitação POST para o endpoint do seu webhook:
curl -X POST https://your-n8n-instance.com/webhook/solver-image-to-text \
-H "Content-Type: application/json" \
-d '{
"body": "iVBORw0KGgoAAAANSUhEUgAA...",
"module": "common"
}'
Resposta esperada:
{
"solution": {
"text": "xK7mQ"
},
"status": "ready"
}
O campo solution.text contém o texto do captcha reconhecido. Este é o valor que você inserirá no campo de entrada do captcha.
Copie o JSON abaixo e importe-o para o n8n via Menu -> Import from JSON:
{
"name": "Image To Text — Solver API",
"nodes": [
{
"parameters": {
"content": "## Image To Text — Solver API\n\n**Para quem:** Desenvolvedores que precisam de um endpoint de resolução de captcha baseado em OCR para suas aplicações.\n\n**O que faz:** Aceita uma imagem de captcha codificada em base64 via webhook, valida a entrada, a resolve usando o reconhecimento ImageToTextTask do CapSolver e retorna o texto reconhecido.\n\n**Como funciona:**\n1. O Webhook recebe um POST com `body` (imagem base64) e `module` opcional\n2. O nó Code valida a entrada base64 e remove quaisquer prefixos data:\n3. O nó de Reconhecimento do CapSolver resolve o captcha de imagem instantaneamente\n4. O nó IF verifica erros\n5. A resposta retorna o texto reconhecido ou detalhes do erro\n\n**Configuração:**\n1. Adicione sua chave de API do CapSolver em **Settings → Credentials**\n2. Ative o fluxo de trabalho para habilitar o endpoint do webhook\n3. Envie imagens base64 para `/webhook/solver-image-to-text`",
"height": 480,
"width": 460,
"color": 1
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [-620, -280],
"id": "sticky-itt-main-001",
"name": "Sticky Note"
},
{
"parameters": {
"content": "### Receber e Validar\nO Webhook aceita POSTs com imagens base64. O nó Code valida e limpa a entrada.",
"height": 480,
"width": 700,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [-140, -280],
"id": "sticky-itt-section-002",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "### Resolver Captcha de Imagem\nNó de Reconhecimento do CapSolver — retorna o texto reconhecido instantaneamente (sem sondagem).",
"height": 480,
"width": 400,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [580, -280],
"id": "sticky-itt-section-003",
"name": "Sticky Note2"
},
{
"parameters": {
"content": "### Verificar Erro e Responder\nO nó IF ramifica em caso de erro. O sucesso retorna o texto reconhecido, a falha retorna os detalhes do erro.",
"height": 480,
"width": 900,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [1000, -280],
"id": "sticky-itt-section-004",
"name": "Sticky Note3"
},
{
"parameters": {
"content": "### Lógica de Validação\nRemover prefixo data:, remover caracteres de nova linha, verificar formato base64.",
"height": 480,
"width": 400,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [160, -280],
"id": "sticky-itt-section-005",
"name": "Sticky Note4"
},
{
"parameters": {
"content": "### Tratamento de Resposta\nSucesso: retorna a solução com o texto reconhecido. Falha: retorna a mensagem de erro.",
"height": 480,
"width": 500,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [1420, -280],
"id": "sticky-itt-section-006",
"name": "Sticky Note5"
},
{
"parameters": {
"httpMethod": "POST",
"path": "solver-image-to-text",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [-100, 0],
"id": "itt-11111111-1111-1111-1111-111111111101",
"name": "Receive Solver Request",
"webhookId": "itt-aaaa-bbbb-cccc-dddd-111111111101"
},
{
"parameters": {
"jsCode": "const body = $input.first().json.body;\n\nif (!body || !body.body) {\n return [{ json: { error: 'Missing required field: body (base64 encoded image)' } }];\n}\n\nlet imageBase64 = String(body.body);\n\n// Remove o prefixo data: se incluído acidentalmente\nimageBase64 = imageBase64.replace(/^data:image\\/\\w+;base64,/, '');\n\n// Remove caracteres de nova linha e espaços em branco\nimageBase64 = imageBase64.replace(/[\\n\\r\\s]/g, '');\n\n// Validação básica de base64\nif (!/^[A-Za-z0-9+\\/]+=*$/.test(imageBase64)) {\n return [{ json: { error: 'Invalid base64 encoding in body field' } }];\n}\n\nreturn [{\n json: {\n body: imageBase64,\n module: body.module || 'common'\n }\n}];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [200, 0],
"id": "itt-11111111-1111-1111-1111-111111111102",
"name": "Validate Image Input"
},
{
"parameters": {
"resource": "recognition",
"operation": "Image To Text",
"body": "={{ $json.body }}",
"module": "={{ $json.module }}"
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [620, 0],
"id": "itt-11111111-1111-1111-1111-111111111103",
"name": "Solve Image Captcha",
"onError": "continueRegularOutput",
"credentials": {
"capSolverApi": {
"id": "YOUR_CREDENTIAL_ID",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose",
"version": 2
},
"conditions": [
{
"id": "itt-err-001",
"leftValue": "={{ $json.error }}",
"operator": {
"type": "string",
"operation": "isNotEmpty",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [1040, 0],
"id": "itt-11111111-1111-1111-1111-111111111104",
"name": "Image Captcha Error?"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify({ error: $json.error }) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"position": [1460, -100],
"id": "itt-11111111-1111-1111-1111-111111111105",
"name": "Respond to Webhook Error"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json.data) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"position": [1460, 100],
"id": "itt-11111111-1111-1111-1111-111111111106",
"name": "Respond to Webhook"
}
],
"connections": {
"Receive Solver Request": {
"main": [
[
{
"node": "Validate Image Input",
"type": "main",
"index": 0
}
]
]
},
"Validate Image Input": {
"main": [
[
{
"node": "Solve Image Captcha",
"type": "main",
"index": 0
}
]
]
},
"Solve Image Captcha": {
"main": [
[
{
"node": "Image Captcha Error?",
"type": "main",
"index": 0
}
]
]
},
"Image Captcha Error?": {
"main": [
[
{
"node": "Respond to Webhook Error",
"type": "main",
"index": 0
}
],
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
}
],
"active": false,
"settings": {
"executionOrder": "v1"
}
}
Este fluxo de trabalho automatiza o envio de formulários de ponta a ponta em um site protegido por captcha de imagem. Ele busca a imagem do captcha do site de destino, a converte para base64, a resolve com CapSolver e envia o formulário com o texto reconhecido.
Ele suporta dois modos de gatilho:
Caminho do Agendamento:
A cada 6 horas → Definir Configuração de Destino → Obter Imagem do Captcha → Converter para Base64
→ Resolver Captcha de Imagem → Enviar Formulário com Solução → Verificar Resultado do Envio
→ Marcar Sucesso / Marcar Falha
Caminho do Webhook:
Gatilho Webhook → Definir Configuração de Destino [Webhook] → Obter Imagem do Captcha [Webhook]
→ Converter para Base64 [Webhook] → Resolver Captcha de Imagem [Webhook]
→ Enviar Formulário com Solução [Webhook] → Verificar Resultado do Envio [Webhook]
→ Marcar Sucesso [Webhook] / Marcar Falha [Webhook] → Responder Webhook
Gatilho de Agendamento:
| Configuração | Valor |
|---|---|
| Intervalo | A cada 6 horas |
Gatilho Webhook:
| Configuração | Valor |
|---|---|
| Método HTTP | POST |
| Caminho | image-captcha-form |
| Resposta | Response Node |
Este nó armazena todas as configurações para o site de destino em um só lugar:
| Campo de Configuração | Propósito |
|---|---|
captchaImageURL |
O URL que serve a imagem do captcha (por exemplo, https://example.com/captcha.png) |
formActionURL |
O endpoint que aceita o POST do formulário |
captchaFieldName |
O nome do campo do formulário para a resposta do captcha (por exemplo, captcha, captcha_code, verification) |
module |
O módulo de reconhecimento do CapSolver (common para OCR geral, number para apenas números) |
userAgent |
A string do agente do usuário para enviar com as solicitações |
| Configuração | Valor |
|---|---|
| Método | GET |
| URL | ={{ $json.captchaImageURL }} |
| Formato da Resposta | File (binário) |
Isso baixa a imagem do captcha como dados binários. A resposta estará disponível em $binary.data.
Nota: Alguns sites exigem cookies ou cabeçalhos de sessão para servir a imagem do captcha. Se o captcha for vinculado à sessão, você pode precisar adicionar uma solicitação anterior para obter o cookie de sessão e passá-lo.
// Converte a imagem binária do captcha para uma string base64 limpa
const binaryData = $input.first().binary.data;
const base64String = binaryData.data;
// Remove o prefixo data: se presente
const cleanBase64 = base64String.replace(/^data:image\/\w+;base64,/, '');
// Remove quaisquer caracteres de nova linha
const finalBase64 = cleanBase64.replace(/\n/g, '');
// Passa a configuração de destino do nó Set Target Config
const config = $('Set Target Config').first().json;
return [{
json: {
body: finalBase64,
module: config.module || 'common',
captchaFieldName: config.captchaFieldName,
formActionURL: config.formActionURL,
userAgent: config.userAgent
}
}];
| Parâmetro | Valor |
|---|---|
| Recurso | Recognition |
| Operação | Image To Text |
| Corpo | ={{ $json.body }} |
| Módulo | ={{ $json.module }} |
Isso retorna o texto reconhecido instantaneamente em $json.data.solution.text.
| Configuração | Valor |
|---|---|
| Método | POST |
| URL | ={{ $('Set Target Config').first().json.formActionURL }} |
| Tipo de Conteúdo | form-urlencoded |
| Campos de Conteúdo | Campos do formulário + resposta do captcha |
A resposta do captcha vai para o campo especificado por captchaFieldName:
| Campo | Valor |
|---|---|
username |
seu-nome-de-usuario |
password |
sua-senha |
{{ captchaFieldName }} |
={{ $json.data.solution.text }} |
| Configuração | Valor |
|---|---|
| Condição | {{ $json.statusCode < 400 }} — verifica se a resposta HTTP indica sucesso |
| Ramo Verdadeiro | Marcar Sucesso |
| Ramo Falso | Marcar Falha |
Envie uma solicitação POST para acionar a automação do formulário:
curl -X POST https://your-n8n-instance.com/webhook/image-captcha-form \
-H "Content-Type: application/json" \
-d '{}'
Resposta esperada (sucesso):
{
"action": "form_submission",
"status": "success",
"captchaText": "xK7mQ",
"message": "Form submitted successfully with solved captcha",
"submittedAt": "2026-03-16T12:00:00.000Z"
}
Resposta esperada (falha):
{
"action": "form_submission",
"status": "failed",
"statusCode": 403,
"message": "Form submission was rejected by the target site",
"submittedAt": "2026-03-16T12:00:00.000Z"
}
Copie o JSON abaixo e importe-o para o n8n via Menu -> Import from JSON:
{
"name": "Form Automation — Solve Image Captcha & Submit",
"nodes": [
{
"parameters": {
"content": "## Automação de Formulários — Resolver Captcha de Imagem e Enviar\n\n**Para quem:** Equipes que automatizam o envio de formulários em sites protegidos por CAPTCHAs baseados em imagem.\n\n**O que faz:** Busca a imagem do captcha de um site de destino, a converte para base64, a resolve com o OCR do CapSolver e envia o formulário com o texto reconhecido.\n\n**Como funciona:**\n1. Agendamento (a cada 6h) ou Webhook aciona o fluxo\n2. A configuração de destino define o URL de destino, nome do campo e módulo\n3. A solicitação HTTP busca a imagem do captcha como binário\n4. O nó Code converte o binário para base64 limpo\n5. O Reconhecimento do CapSolver resolve a imagem instantaneamente\n6. A solicitação HTTP envia o formulário com o texto reconhecido\n7. O nó IF verifica o sucesso do envio\n\n**Configuração:**\n1. Adicione sua chave de API do CapSolver em **Settings → Credentials**\n2. Atualize a Configuração de destino com os detalhes do seu site de destino\n3. Atualize os campos do formulário em Enviar Formulário para corresponder ao destino\n4. Ative o fluxo de trabalho",
"height": 480,
"width": 460,
"color": 1
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [-920, -380],
"id": "sticky-fa-main-001",
"name": "Sticky Note"
},
{
"parameters": {
"content": "### Caminho do Agendamento\nExecuta automaticamente a cada 6 horas. Busca o captcha, o resolve e envia o formulário.",
"height": 480,
"width": 2800,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [-440, -280],
"id": "sticky-fa-section-002",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "### Caminho do Webhook\nGatilho sob demanda — mesma lógica, retorna os resultados como uma resposta JSON.",
"height": 480,
"width": 2800,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [-440, 240],
"id": "sticky-fa-section-003",
"name": "Sticky Note2"
},
{
"parameters": {
"content": "### Obter e Converter\nBaixa a imagem do captcha, converte o binário para base64.",
"height": 480,
"width": 700,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [170, -280],
"id": "sticky-fa-section-004",
"name": "Sticky Note3"
},
{
"parameters": {
"content": "### Resolver e Enviar\nO CapSolver lê a imagem, o formulário é enviado com a resposta.",
"height": 480,
"width": 700,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [890, -280],
"id": "sticky-fa-section-005",
"name": "Sticky Note4"
},
{
"parameters": {
"content": "### Lidar com Resultados\nVerifica o status HTTP, marca sucesso ou falha.",
"height": 480,
"width": 700,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [1610, -280],
"id": "sticky-fa-section-006",
"name": "Sticky Note5"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 6
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [-400, 0],
"id": "fa-22222222-2222-2222-2222-222222222201",
"name": "Every 6 Hours"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "fa-cfg-001",
"name": "captchaImageURL",
"value": "https://YOUR-TARGET-SITE.com/captcha.png",
"type": "string"
},
{
"id": "fa-cfg-002",
"name": "formActionURL",
"value": "https://YOUR-TARGET-SITE.com/submit",
"type": "string"
},
{
"id": "fa-cfg-003",
"name": "captchaFieldName",
"value": "captcha",
"type": "string"
},
{
"id": "fa-cfg-004",
"name": "module",
"value": "common",
"type": "string"
},
{
"id": "fa-cfg-005",
"name": "userAgent",
"value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [-96, 0],
"id": "fa-22222222-2222-2222-2222-222222222202",
"name": "Set Target Config"
},
{
"parameters": {
"url": "={{ $json.captchaImageURL }}",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "user-agent",
"value": "={{ $json.userAgent }}"
}
]
},
"options": {
"response": {
"response": {
"responseFormat": "file"
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [208, 0],
"id": "fa-22222222-2222-2222-2222-222222222203",
"name": "Obter Imagem do Captcha"
},
{
"parameters": {
"jsCode": "// Converte a imagem binária do captcha para uma string base64 limpa\nconst binaryData = $input.first().binary.data;\nconst base64String = binaryData.data;\n\n// Remove o prefixo data: se presente\nconst cleanBase64 = base64String.replace(/^data:image\\/\\w+;base64,/, '');\n\n// Remove quaisquer caracteres de nova linha\nconst finalBase64 = cleanBase64.replace(/\\n/g, '');\n\n// Passa a configuração de destino\nconst config = $('Set Target Config').first().json;\n\nreturn [{\n json: {\n body: finalBase64,\n module: config.module || 'common',\n captchaFieldName: config.captchaFieldName,\n formActionURL: config.formActionURL,\n userAgent: config.userAgent\n }\n}];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [512, 0],
"id": "fa-22222222-2222-2222-2222-222222222204",
"name": "Converter para Base64"
},
{
"parameters": {
"resource": "recognition",
"operation": "Image To Text",
"body": "={{ $json.body }}",
"module": "={{ $json.module }}"
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [930, 0],
"id": "fa-22222222-2222-2222-2222-222222222205",
"name": "Resolver Captcha de Imagem",
"onError": "continueRegularOutput",
"credentials": {
"capSolverApi": {
"id": "YOUR_CREDENTIAL_ID",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"method": "POST",
"url": "={{ $('Set Target Config').first().json.formActionURL }}",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "content-type",
"value": "application/x-www-form-urlencoded"
},
{
"name": "user-agent",
"value": "={{ $('Set Target Config').first().json.userAgent }}"
}
]
},
"sendBody": true,
"contentType": "form-urlencoded",
"bodyParameters": {
"parameters": [
{
"name": "username",
"value": "YOUR_USERNAME"
},
{
"name": "password",
"value": "YOUR_PASSWORD"
},
{
"name": "={{ $('Set Target Config').first().json.captchaFieldName }}",
"value": "={{ $json.data.solution.text }}"
}
]
},
"options": {
"response": {
"response": {
"fullResponse": true,
"neverError": true
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [1234, 0],
"id": "fa-22222222-2222-2222-2222-222222222206",
"name": "Enviar Formulário com Solução"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": false,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "fa-if-001",
"leftValue": "={{ $json.statusCode }}",
"rightValue": 400,
"operator": {
"type": "number",
"operation": "lt"
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [1538, 0],
"id": "fa-22222222-2222-2222-2222-222222222207",
"name": "Verificar Resultado do Envio"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "fa-ms-001",
"name": "action",
"value": "form_submission",
"type": "string"
},
{
"id": "fa-ms-002",
"name": "status",
"value": "success",
"type": "string"
},
{
"id": "fa-ms-003",
"name": "captchaText",
"value": "={{ $('Resolver Captcha de Imagem').first().json.data.solution.text }}",
"type": "string"
},
{
"id": "fa-ms-004",
"name": "message",
"value": "Form submitted successfully with solved captcha",
"type": "string"
},
{
"id": "fa-ms-005",
"name": "submittedAt",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [1842, -80],
"id": "fa-22222222-2222-2222-2222-222222222208",
"name": "Marcar Sucesso"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "fa-mf-001",
"name": "action",
"value": "form_submission",
"type": "string"
},
{
"id": "fa-mf-002",
"name": "status",
"value": "failed",
"type": "string"
},
{
"id": "fa-mf-003",
"name": "statusCode",
"value": "={{ $json.statusCode }}",
"type": "number"
},
{
"id": "fa-mf-004",
"name": "message",
"value": "Form submission was rejected by the target site",
"type": "string"
},
{
"id": "fa-mf-005",
"name": "submittedAt",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [1842, 120],
"id": "fa-22222222-2222-2222-2222-222222222209",
"name": "Marcar Falha"
},
{
"parameters": {
"httpMethod": "POST",
"path": "image-captcha-form",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [-400, 520],
"id": "fa-22222222-2222-2222-2222-222222222210",
"name": "Gatilho Webhook",
"webhookId": "fa-aaaa-bbbb-cccc-dddd-222222222210",
"onError": "continueRegularOutput"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "fa-cfg-011",
"name": "captchaImageURL",
"value": "https://YOUR-TARGET-SITE.com/captcha.png",
"type": "string"
},
{
"id": "fa-cfg-012",
"name": "formActionURL",
"value": "https://YOUR-TARGET-SITE.com/submit",
"type": "string"
},
{
"id": "fa-cfg-013",
"name": "captchaFieldName",
"value": "captcha",
"type": "string"
},
{
"id": "fa-cfg-014",
"name": "module",
"value": "common",
"type": "string"
},
{
"id": "fa-cfg-015",
"name": "userAgent",
"value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [-96, 520],
"id": "fa-22222222-2222-2222-2222-222222222211",
"name": "Definir Configuração de Destino [Webhook]"
},
{
"parameters": {
"url": "={{ $json.captchaImageURL }}",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "user-agent",
"value": "={{ $json.userAgent }}"
}
]
},
"options": {
"response": {
"response": {
"fullResponse": true,
"neverError": true
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [208, 520],
"id": "fa-22222222-2222-2222-2222-222222222212",
"name": "Obter Imagem do Captcha [Webhook]"
},
{
"parameters": {
"jsCode": "// Converte a imagem binária do captcha para uma string base64 limpa\nconst binaryData = $input.first().binary.data;\nconst base64String = binaryData.data;\n\n// Remove o prefixo data: se presente\nconst cleanBase64 = base64String.replace(/^data:image\\/\\w+;base64,/, '');\n\n// Remove quaisquer caracteres de nova linha\nconst finalBase64 = cleanBase64.replace(/\\n/g, '');\n\n// Passa a configuração de destino\nconst config = $('Definir Configuração de Destino [Webhook]').first().json;\n\nreturn [{\n json: {\n body: finalBase64,\n module: config.module || 'common',\n captchaFieldName: config.captchaFieldName,\n formActionURL: config.formActionURL,\n userAgent: config.userAgent\n }\n}];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [512, 520],
"id": "fa-22222222-2222-2222-2222-222222222213",
"name": "Converter para Base64 [Webhook]"
},
{
"parameters": {
"resource": "recognition",
"operation": "Image To Text",
"body": "={{ $json.body }}",
"module": "={{ $json.module }}"
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [930, 520],
"id": "fa-22222222-2222-2222-2222-222222222214",
"name": "Resolver Captcha de Imagem [Webhook]",
"onError": "continueRegularOutput",
"credentials": {
"capSolverApi": {
"id": "YOUR_CREDENTIAL_ID",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"method": "POST",
"url": "={{ $('Definir Configuração de Destino [Webhook]').first().json.formActionURL }}",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "content-type",
"value": "application/x-www-form-urlencoded"
},
{
"name": "user-agent",
"value": "={{ $('Definir Configuração de Destino [Webhook]').first().json.userAgent }}"
}
]
},
"sendBody": true,
"contentType": "form-urlencoded",
"bodyParameters": {
"parameters": [
{
"name": "username",
"value": "YOUR_USERNAME"
},
{
"name": "password",
"value": "YOUR_PASSWORD"
},
{
"name": "={{ $('Definir Configuração de Destino [Webhook]').first().json.captchaFieldName }}",
"value": "={{ $json.data.solution.text }}"
}
]
},
"options": {
"response": {
"response": {
"fullResponse": true,
"neverError": true
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [1234, 520],
"id": "fa-22222222-2222-2222-2222-222222222215",
"name": "Enviar Formulário com Solução [Webhook]"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": false,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "fa-if-002",
"leftValue": "={{ $json.statusCode }}",
"rightValue": 400,
"operator": {
"type": "number",
"operation": "lt"
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [1538, 520],
"id": "fa-22222222-2222-2222-2222-222222222216",
"name": "Verificar Resultado do Envio [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "fa-ms-011",
"name": "action",
"value": "form_submission",
"type": "string"
},
{
"id": "fa-ms-012",
"name": "status",
"value": "success",
"type": "string"
},
{
"id": "fa-ms-013",
"name": "captchaText",
"value": "={{ $('Resolver Captcha de Imagem [Webhook]').first().json.data.solution.text }}",
"type": "string"
},
{
"id": "fa-ms-014",
"name": "message",
"value": "Form submitted successfully with solved captcha",
"type": "string"
},
{
"id": "fa-ms-015",
"name": "submittedAt",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [1842, 440],
"id": "fa-22222222-2222-2222-2222-222222222217",
"name": "Marcar Sucesso [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "fa-mf-011",
"name": "action",
"value": "form_submission",
"type": "string"
},
{
"id": "fa-mf-012",
"name": "status",
"value": "failed",
"type": "string"
},
{
"id": "fa-mf-013",
"name": "statusCode",
"value": "={{ $json.statusCode }}",
"type": "number"
},
{
"id": "fa-mf-014",
"name": "message",
"value": "Form submission was rejected by the target site",
"type": "string"
},
{
"id": "fa-mf-015",
"name": "submittedAt",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [1842, 600],
"id": "fa-22222222-2222-2222-2222-222222222218",
"name": "Marcar Falha [Webhook]"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [2146, 520],
"id": "fa-22222222-2222-2222-2222-222222222219",
"name": "Responder Webhook"
}
],
"connections": {
"Every 6 Hours": {
"main": [
[
{
"node": "Set Target Config",
"type": "main",
"index": 0
}
]
]
},
"Set Target Config": {
"main": [
[
{
"node": "Obter Imagem do Captcha",
"type": "main",
"index": 0
}
]
]
},
"Obter Imagem do Captcha": {
"main": [
[
{
"node": "Converter para Base64",
"type": "main",
"index": 0
}
]
]
},
"Converter para Base64": {
"main": [
[
{
"node": "Resolver Captcha de Imagem",
"type": "main",
"index": 0
}
]
]
},
"Resolver Captcha de Imagem": {
"main": [
[
{
"node": "Enviar Formulário com Solução",
"type": "main",
"index": 0
}
]
]
},
"Enviar Formulário com Solução": {
"main": [
[
{
"node": "Verificar Resultado do Envio",
"type": "main",
"index": 0
}
]
]
},
"Verificar Resultado do Envio": {
"main": [
[
{
"node": "Marcar Sucesso",
"type": "main",
"index": 0
}
],
[
{
"node": "Marcar Falha",
"type": "main",
"index": 0
}
]
]
},
"Gatilho Webhook": {
"main": [
[
{
"node": "Definir Configuração de Destino [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Definir Configuração de Destino [Webhook]": {
"main": [
[
{
"node": "Obter Imagem do Captcha [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Obter Imagem do Captcha [Webhook]": {
"main": [
[
{
"node": "Converter para Base64 [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Converter para Base64 [Webhook]": {
"main": [
[
{
"node": "Resolver Captcha de Imagem [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Resolver Captcha de Imagem [Webhook]": {
"main": [
[
{
"node": "Enviar Formulário com Solução [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Enviar Formulário com Solução [Webhook]": {
"main": [
[
{
"node": "Verificar Resultado do Envio [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Verificar Resultado do Envio [Webhook]": {
"main": [
[
{
"node": "Marcar Sucesso [Webhook]",
"type": "main",
"index": 0
}
],
[
{
"node": "Marcar Falha [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Marcar Sucesso [Webhook]": {
"main": [
[
{
"node": "Responder Webhook",
"type": "main",
"index": 0
}
]
]
},
"Marcar Falha [Webhook]": {
"main": [
[
{
"node": "Responder Webhook",
"type": "main",
"index": 0
}
]
]
}
],
"active": false,
"settings": {
"executionOrder": "v1"
}
}
Se você já usou o nó CapSolver n8n para reCAPTCHA, Turnstile ou outros tipos de desafios, você usou o recurso Token. Imagem para Texto usa o recurso Reconhecimento, e a diferença é importante:
websiteURL e websiteKey.É por isso que o nó CapSolver n8n tem dois recursos separados:
| Recurso | Operações |
|---|---|
| Token | reCAPTCHA v2, reCAPTCHA v3, Cloudflare Turnstile, Cloudflare Challenge, GeeTest V3, GeeTest V4, DataDome, AWS WAF, MTCaptcha |
| Reconhecimento | Imagem para Texto |
Ao configurar o nó CapSolver para Imagem para Texto, certifique-se de selecionar Resource = Recognition primeiro — isso mudará as operações e parâmetros disponíveis.
Esses fluxos de trabalho são modelos. Em um alvo do mundo real, você deve esperar personalização:
O modelo de automação de formulários busca a imagem de um único URL (captchaImageURL). Na prática, a imagem do captcha pode ser:
<img> base64Muitos sistemas de captcha de imagem são vinculados à sessão — a imagem do captcha está ligada a uma sessão do lado do servidor. Se você busca a imagem em uma solicitação e envia a resposta em outra, você precisará:
Diferentes sites usam diferentes nomes de campos de formulário para a resposta do captcha:
| Nomes de Campos Comuns |
|---|
captcha |
captcha_code |
verification |
captcha_text |
answer |
security_code |
Verifique o HTML do formulário para o nome exato do campo.
A maioria dos captchas de imagem funciona com module: "common". Mas se o captcha contiver apenas números, tente module: "number" — ele é otimizado para reconhecimento numérico e pode dar melhores resultados.
O modelo inclui campos de espaço reservado username e password. Seu alvo pode exigir:
Este erro significa que sua conta ou plano CapSolver não inclui acesso ao ImageToText. Verifique seu painel CapSolver para verificar se seu plano inclui este serviço.
O reconhecimento de captcha de imagem não é 100% preciso. Se você obtiver resultados incorretos:
module diferente — "common" vs. "number" vs. IDs de módulo específicosCausas comuns:
data:image/...;base64, não foi removidoSe o envio do formulário sempre falhar mesmo com o texto reconhecido corretamente, a causa mais provável é uma incompatibilidade de sessão entre a busca da imagem e o envio do formulário. Certifique-se de passar o mesmo cookie de sessão entre as duas solicitações.
Isso geralmente significa que:
data: — sempre limpe seu base64 antes de enviar para o CapSolver."common" para alfanumérico misto, "number" para apenas numérico.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!

Você aprendeu como construir uma API de resolução de Imagem para Texto e fluxos de trabalho de automação de formulários usando n8n e CapSolver.
Resumo:
O resultado final: Imagem para Texto é a operação CapSolver mais simples de integrar — você envia a imagem base64 e recebe o texto de volta instantaneamente. O desafio geralmente reside no fluxo de trabalho circundante: buscar a imagem corretamente, manter o estado da sessão e enviar a resposta para o campo correto do formulário.
Dica: Esses fluxos de trabalho usam gatilhos de Agendamento + 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 captcha é resolvido, use os nós integrados do n8n para salvar os resultados no Google Sheets, bancos de dados, armazenamento em nuvem ou enviar alertas via Telegram/Slack/Email.
ImageToTextTask é o serviço de reconhecimento de captcha baseado em OCR do CapSolver. Você envia uma imagem de captcha codificada em base64, e o CapSolver retorna o texto reconhecido — letras, números ou ambos. Ele usa o recurso Reconhecimento no nó CapSolver n8n, que é diferente do recurso Token usado para reCAPTCHA, Turnstile e outros tipos de desafios.
Os preços variam de acordo com o uso. Verifique a página de preços do CapSolver para os preços atuais do ImageToText. As tarefas de reconhecimento de imagem são geralmente uma das operações mais acessíveis do CapSolver.
Imagem para Texto é uma operação de Reconhecimento, o que significa que os resultados são retornados instantaneamente — geralmente em menos de 1 segundo. Não há criação de tarefa ou atraso de sondagem como nas operações de Token.
Não. Ao contrário das operações de Token (reCAPTCHA, Turnstile, Cloudflare Challenge), Imagem para Texto não requer um proxy. Você está enviando os dados da imagem diretamente para o CapSolver — não há interação do navegador ou acesso ao site envolvido.
O CapSolver aceita formatos de imagem comuns (PNG, JPEG, GIF, BMP) como dados codificados em base64. A imagem deve conter um captcha visível — sem imagens vazias, corrompidas ou muito grandes.
module faz?O parâmetro module informa ao CapSolver qual mecanismo de reconhecimento usar:
"common" — OCR geral para letras, números e caracteres mistos. Este é o padrão e funciona para a maioria dos captchas."number" — Otimizado para captchas apenas numéricos. Também suporta resolução em lote com até 9 imagens adicionais."module_001" a "module_032" — Mecanismos especializados para tipos específicos de captcha. Verifique a documentação do CapSolver para detalhes sobre cada módulo.Não. O reconhecimento de Imagem para Texto do CapSolver não suporta diferenciação de maiúsculas de minúsculas. Se o site de destino exigir uma resposta de captcha que diferencia maiúsculas de minúsculas, o resultado do reconhecimento pode não corresponder. Esta é uma limitação conhecida.
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 — basta adicionar suas credenciais de API.
Muitos sites vinculam a imagem do captcha a uma sessão do servidor. Para lidar com isso:
No n8n, você pode extrair cookies dos cabeçalhos de resposta da solicitação HTTP e passá-los para solicitações subsequentes.
O reconhecimento de captcha de imagem não é 100% preciso — especialmente para imagens fortemente distorcidas ou ruidosas. Se você obtiver resultados incorretos:
"common", "number" ou um ID de módulo específico).Para Imagem para Texto, o CapSolver retorna o texto reconhecido, não um token. Se o envio do formulário for rejeitado:
solution.text.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.
