
Nikolai Smirnov
Software Development Lead

Los CAPTCHAs basados en imágenes están por todas partes: formularios de inicio de sesión, páginas de registro, sitios de venta de entradas y portales gubernamentales. Muestran una imagen distorsionada de letras, números o una mezcla de ambos, y requieren que el usuario escriba lo que ve. Automatizar esto con herramientas tradicionales significa construir tu propia tubería de OCR, lidiar con filtros de ruido y manejar casos extremos para cada fuente y estilo de distorsión.
¿Qué pasaría si pudieras resolver CAPTCHAs de imágenes automáticamente dentro de tus flujos de trabajo de n8n, ya sea que estés construyendo una API de resolución reutilizable o automatizando el envío de un formulario que requiere leer una imagen de captcha, todo sin entrenar un solo modelo?
En esta guía, aprenderás cómo combinar n8n (una herramienta de automatización de flujos de trabajo visual) con CapSolver (un servicio de resolución de CAPTCHAs impulsado por IA) para resolver CAPTCHAs de imagen a texto bajo demanda, ya sea como un punto final de API independiente o como un paso dentro de cualquier flujo de trabajo de automatización.
Lo que construirás:
API de resolución — un punto final reutilizable que tus otras herramientas pueden llamar:
Flujo de trabajo de uso directo — CapSolver incrustado como un paso dentro de una automatización más grande:
Imagen a Texto es el servicio de reconocimiento basado en OCR de CapSolver. Envías una imagen de captcha codificada en base64, y CapSolver devuelve el texto reconocido (letras, números o ambos) inmediatamente.
Esto es fundamentalmente diferente de otras operaciones de CapSolver como reCAPTCHA o Turnstile:
| Característica | Imagen a Texto (Reconocimiento) | reCAPTCHA / Turnstile (Token) |
|---|---|---|
| Tipo de recurso | Reconocimiento | Token |
| Entrada | Imagen Base64 | URL del sitio web + clave del sitio |
| Resultado | Texto reconocido (instantáneo) | Token (requiere sondeo) |
| Necesita proxy | No | Depende del tipo de tarea |
| Caso de uso | Leer texto distorsionado de una imagen | Generar un token de verificación |
La distinción clave es que las operaciones de reconocimiento devuelven resultados instantáneamente, no hay creación de tareas seguida de sondeo. Envías la imagen, CapSolver la lee y el texto regresa en un solo ciclo de solicitud-respuesta.
| Parámetro | Valor | Descripción |
|---|---|---|
body |
Cadena Base64 | La imagen del captcha, codificada en base64. Sin saltos de línea, sin prefijo data:image/...;base64, — solo la cadena base64 sin procesar |
module |
"common" |
El módulo de reconocimiento. "common" maneja el OCR alfanumérico general |
| Parámetro | Descripción |
|---|---|
websiteURL |
La URL de la página donde aparece el captcha (ayuda a CapSolver a optimizar el reconocimiento) |
images (1-9) |
Imágenes adicionales para el módulo "number" al resolver CAPTCHAs numéricos de varias imágenes |
| Módulo | Propósito |
|---|---|
common |
OCR general — letras, números, caracteres mixtos. El predeterminado para la mayoría de los CAPTCHAs |
number |
CAPTCHAs solo numéricos. Admite la resolución por lotes con hasta 9 imágenes adicionales a través del parámetro images |
Antes de comenzar, asegúrate de tener lo siguiente:
Importante: Asegúrate de tener suficiente saldo en tu cuenta de CapSolver. Las tareas de ImageToText consumen créditos según el uso.
CapSolver está disponible como una integración oficial en n8n, no se requiere la instalación de nodos comunitarios. Puedes encontrarlo directamente en el panel de nodos al construir tus flujos de trabajo.
Dado que es una integración oficial, debes crear una credencial en n8n para que el nodo CapSolver pueda autenticarse con tu cuenta.
Ve a tu instancia de n8n y navega a Settings -> Credentials. Aquí verás todas tus credenciales configuradas.

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

Importante: Cada nodo de CapSolver en tus flujos de trabajo hará referencia a esta credencial. Solo necesitas crearla una vez; todos tus flujos de trabajo de resolución compartirán la misma credencial.
¡Ahora estás listo para construir tu flujo de trabajo de resolución de Imagen a Texto!
Antes de sumergirnos en los flujos de trabajo, es importante comprender los requisitos de base64 para ImageToTextTask. Esta es la fuente más común de errores.
El parámetro body debe contener una cadena base64 limpia, los bytes codificados sin procesar del archivo de imagen. Específicamente:
data: — si tienes data:image/png;base64,iVBORw0KGgo..., debes eliminar la parte data:image/png;base64,\nCuando obtienes una imagen con un nodo de solicitud HTTP en n8n, la respuesta llega como datos binarios. Para convertirla a base64 para CapSolver, usa un nodo de código:
// Convertir datos de imagen binarios a base64 limpio
const binaryData = $input.first().binary.data;
const base64String = binaryData.data; // Ya es base64 en el formato binario de n8n
// Eliminar el prefijo data: si está presente (verificación de seguridad)
const cleanBase64 = base64String.replace(/^data:image\/\w+;base64,/, "");
// Eliminar cualquier salto de línea
const finalBase64 = cleanBase64.replace(/\n/g, "");
return [{ json: { body: finalBase64 } }];
| Error | Resultado |
|---|---|
Enviar data:image/png;base64,... |
CapSolver rechaza el cuerpo como inválido |
| La cadena Base64 contiene saltos de línea | CapSolver no puede decodificar la imagen |
| Enviar la URL de la imagen en lugar de base64 | Parámetro incorrecto — body espera base64, no una URL |
| Enviar una cadena vacía | CapSolver devuelve un error |
Este flujo de trabajo crea un punto final de API POST que acepta una imagen de captcha base64 y devuelve el texto reconocido.
El flujo de trabajo consta de seis nodos:
body existe y es base64 válido| Configuración | Valor |
|---|---|
| Método HTTP | POST |
| Ruta | solver-image-to-text |
| Responder | Response Node |
Esto crea un punto final en: https://tu-instancia-n8n.com/webhook/solver-image-to-text
Este nodo verifica que el cuerpo de la solicitud contenga un parámetro body válido y elimina cualquier prefijo data: o saltos de línea accidentales:
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);
// Eliminar el prefijo data: si se incluyó accidentalmente
imageBase64 = imageBase64.replace(/^data:image\/\w+;base64,/, '');
// Eliminar saltos de línea y espacios en blanco
imageBase64 = imageBase64.replace(/[\n\r\s]/g, '');
// Validación 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 | Descripción |
|---|---|---|
| Recurso | Recognition |
Selecciona el recurso de reconocimiento (no Token) |
| Operación | Image To Text |
La operación ImageToTextTask |
| Cuerpo | {{ $json.body }} |
La cadena de imagen base64 limpia |
| Módulo | {{ $json.module }} |
El módulo de reconocimiento (predeterminado: common) |
Importante: En el nodo CapSolver, primero debes seleccionar Resource = Recognition y luego Operation = Image To Text. Esto es diferente de las operaciones de Token como reCAPTCHA o Turnstile. También selecciona tus credenciales de CapSolver en este nodo.
| Configuración | Valor |
|---|---|
| Condición | ={{ $json.error }} no está vacío |
| Rama verdadera | Dirige al nodo Error Respond to Webhook |
| Rama falsa | Dirige al nodo Success Respond to Webhook |
El nodo CapSolver continúa en caso de error (onError: continueRegularOutput), por lo que los fallos llegan aquí como { "error": "..." } en lugar de bloquear el flujo de trabajo.
| Configuración | Valor |
|---|---|
| Responder con | JSON |
| Cuerpo de la respuesta | ={{ JSON.stringify($json.data) }} |
| Configuración | Valor |
|---|---|
| Responder con | JSON |
| Cuerpo de la respuesta | ={{ JSON.stringify({ error: $json.error }) }} |
Los mensajes de error siguen uno de dos formatos:
| Punto de fallo | Formato |
|---|---|
| Creación de tarea fallida | { "error": "..." } |
| Fallo en el proceso de reconocimiento | { "status": "failed", "error": "..." } |
Envía una solicitud POST a tu punto final de webhook:
curl -X POST https://tu-instancia-n8n.com/webhook/solver-image-to-text \
-H "Content-Type: application/json" \
-d '{
"body": "iVBORw0KGgoAAAANSUhEUgAA...",
"module": "common"
}'
Respuesta esperada:
{
"solution": {
"text": "xK7mQ"
},
"status": "ready"
}
El campo solution.text contiene el texto de captcha reconocido. Este es el valor que escribirías en un campo de entrada de captcha.
Copia el JSON a continuación e impórtalo en n8n a través de Menu -> Import from JSON:
{
"name": "Image To Text — Solver API",
"nodes": [
{
"parameters": {
"content": "## Image To Text — Solver API\n\n**Para quién es:** Desarrolladores que necesitan un punto final de resolución de CAPTCHAs basado en OCR para sus aplicaciones.\n\n**Qué hace:** Acepta una imagen de captcha codificada en base64 a través de un webhook, valida la entrada, la resuelve utilizando el reconocimiento ImageToTextTask de CapSolver y devuelve el texto reconocido.\n\n**Cómo funciona:**\n1. El webhook recibe un POST con `body` (imagen base64) y `module` opcional\n2. El nodo de código valida la entrada base64 y elimina cualquier prefijo data:\n3. El nodo de reconocimiento de CapSolver resuelve el captcha de imagen instantáneamente\n4. El nodo IF verifica si hay errores\n5. La respuesta devuelve el texto reconocido o los detalles del error\n\n**Configuración:**\n1. Agrega tu clave API de CapSolver en **Settings → Credentials**\n2. Activa el flujo de trabajo para habilitar el punto final del webhook\n3. Envía imágenes base64 a `/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": "### Recibir y Validar\nWebhook acepta POST con imagen base64. El nodo de código valida y limpia la 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 Imagen\nNodo de reconocimiento de CapSolver — devuelve el texto reconocido instantáneamente (sin sondeo).",
"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": "### Verificación de Errores y Respuesta\nEl nodo IF se ramifica en caso de error. El éxito devuelve el texto reconocido, el fallo devuelve los detalles del error.",
"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 Validación\nElimina el prefijo data:, elimina los saltos de línea, verifica el 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": "### Manejo de Respuestas\nÉxito: devuelve la solución con el texto reconocido. Error: devuelve el mensaje de error.",
"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// Strip data: prefix if accidentally included\nimageBase64 = imageBase64.replace(/^data:image\\/\\w+;base64,/, '');\n\n// Remove newlines and whitespace\nimageBase64 = imageBase64.replace(/[\\n\\r\\s]/g, '');\n\n// Basic base64 validation\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 flujo de trabajo automatiza el envío de formularios de principio a fin en un sitio protegido por un captcha de imagen. Obtiene la imagen del captcha del sitio objetivo, la convierte a base64, la resuelve con CapSolver y envía el formulario con el texto reconocido.
Admite dos modos de activación:
Ruta de programación:
Cada 6 horas → Establecer configuración de destino → Obtener imagen de Captcha → Convertir a Base64
→ Resolver Captcha de imagen → Enviar formulario con solución → Verificar resultado de envío
→ Marcar éxito / Marcar fallo
Ruta de Webhook:
Disparador de Webhook → Establecer configuración de destino [Webhook] → Obtener imagen de Captcha [Webhook]
→ Convertir a Base64 [Webhook] → Resolver Captcha de imagen [Webhook]
→ Enviar formulario con solución [Webhook] → Verificar resultado de envío [Webhook]
→ Marcar éxito [Webhook] / Marcar fallo [Webhook] → Responder a Webhook
Disparador de programación:
| Configuración | Valor |
|---|---|
| Intervalo | Cada 6 horas |
Disparador de Webhook:
| Configuración | Valor |
|---|---|
| Método HTTP | POST |
| Ruta | image-captcha-form |
| Responder | Response Node |
Este nodo almacena toda la configuración del sitio de destino en un solo lugar:
| Campo de configuración | Propósito |
|---|---|
captchaImageURL |
La URL que sirve la imagen del captcha (por ejemplo, https://example.com/captcha.png) |
formActionURL |
El punto final que recibe el POST del formulario |
captchaFieldName |
El nombre del campo del formulario para la respuesta del captcha (por ejemplo, captcha, captcha_code, verification) |
module |
El módulo de reconocimiento de CapSolver (common para OCR general, number solo para numérico) |
userAgent |
La cadena de agente de usuario para enviar con las solicitudes |
| Configuración | Valor |
|---|---|
| Método | GET |
| URL | ={{ $json.captchaImageURL }} |
| Formato de respuesta | File (binario) |
Esto descarga la imagen del captcha como datos binarios. La respuesta estará disponible en $binary.data.
Nota: Algunos sitios requieren cookies o encabezados de sesión para servir la imagen del captcha. Si el captcha está vinculado a la sesión, es posible que debas agregar una solicitud previa para obtener la cookie de sesión y pasarla.
// Convertir la imagen binaria del captcha a una cadena base64 limpia
const binaryData = $input.first().binary.data;
const base64String = binaryData.data;
// Eliminar el prefijo data: si está presente
const cleanBase64 = base64String.replace(/^data:image\/\w+;base64,/, '');
// Eliminar cualquier salto de línea
const finalBase64 = cleanBase64.replace(/\n/g, '');
// Pasar la configuración de destino del nodo 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 |
| Operación | Image To Text |
| Cuerpo | {{ $json.body }} |
| Módulo | {{ $json.module }} |
Esto devuelve el texto reconocido inmediatamente en $json.data.solution.text.
| Configuración | Valor |
|---|---|
| Método | POST |
| URL | ={{ $('Set Target Config').first().json.formActionURL }} |
| Tipo de contenido | form-urlencoded |
| Campos del cuerpo | Campos del formulario + respuesta del captcha |
La respuesta del captcha va al campo especificado por captchaFieldName:
| Campo | Valor |
|---|---|
username |
tu-nombre-de-usuario |
password |
tu-contraseña |
{{ captchaFieldName }} |
={{ $json.data.solution.text }} |
| Configuración | Valor |
|---|---|
| Condición | {{ $json.statusCode < 400 }} — verifica que la respuesta HTTP indique éxito |
| Rama verdadera | Marcar éxito |
| Rama falsa | Marcar fallo |
Envía una solicitud POST para activar la automatización del formulario:
curl -X POST https://tu-instancia-n8n.com/webhook/image-captcha-form \
-H "Content-Type: application/json" \
-d '{}'
Respuesta esperada (éxito):
{
"action": "form_submission",
"status": "success",
"captchaText": "xK7mQ",
"message": "Form submitted successfully with solved captcha",
"submittedAt": "2026-03-16T12:00:00.000Z"
}
Respuesta esperada (fallo):
{
"action": "form_submission",
"status": "failed",
"statusCode": 403,
"message": "Form submission was rejected by the target site",
"submittedAt": "2026-03-16T12:00:00.000Z"
}
Copia el JSON a continuación e impórtalo en n8n a través de Menu -> Import from JSON:
{
"name": "Form Automation — Solve Image Captcha & Submit",
"nodes": [
{
"parameters": {
"content": "## Automatización de formularios — Resolver Captcha de imagen y enviar\n\n**Para quién es:** Equipos que automatizan el envío de formularios en sitios protegidos por CAPTCHAs basados en imágenes.\n\n**Qué hace:** Obtiene una imagen de captcha del sitio de destino, la convierte a base64, la resuelve utilizando el OCR de CapSolver y envía el formulario con el texto reconocido.\n\n**Cómo funciona:**\n1. La programación (cada 6h) o el Webhook activan el flujo\n2. La configuración de destino define las URL de destino, los nombres de campo y el módulo\n3. La solicitud HTTP obtiene la imagen del captcha como binario\n4. El nodo de código convierte el binario a base64 limpio\n5. El reconocimiento de CapSolver resuelve la imagen instantáneamente\n6. La solicitud HTTP envía el formulario con el texto reconocido\n7. El nodo IF verifica el éxito del envío\n\n**Configuración:**\n1. Agrega tu clave API de CapSolver en **Settings → Credentials**\n2. Actualiza la configuración de destino con los detalles de tu sitio de destino\n3. Actualiza los campos del formulario en Enviar formulario para que coincidan con el destino\n4. Activa el flujo de trabajo",
"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": "### Ruta de programación\nSe ejecuta automáticamente cada 6 horas. Obtiene el captcha, lo resuelve y envía el formulario.",
"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": "### Ruta de Webhook\nDisparador bajo demanda — misma lógica, devuelve el resultado como respuesta 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": "### Obtener y Convertir\nDescargar imagen de captcha, convertir binario a 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 y Enviar\nCapSolver lee la imagen, el formulario se envía con la respuesta.",
"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": "### Manejo de Resultados\nVerificar estado HTTP, marcar éxito o fallo.",
"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": "Fetch Captcha Image"
},
{
"parameters": {
"jsCode": "// Convertir la imagen binaria del captcha a una cadena base64 limpia\nconst binaryData = $input.first().binary.data;\nconst base64String = binaryData.data;\n\n// Eliminar el prefijo data: si está presente\nconst cleanBase64 = base64String.replace(/^data:image\\/\\w+;base64,/, '');\n\n// Eliminar cualquier salto de línea\nconst finalBase64 = cleanBase64.replace(/\\n/g, '');\n\n// Pasar la configuración 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": "Convert to 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": "Solve Image Captcha",
"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": "Submit Form with Solution"
},
{
"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": "Check Submission Result"
},
{
"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": "={{ $('Solve Image Captcha').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": "Mark Success"
},
{
"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": "Mark Failed"
},
{
"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": "Webhook Trigger",
"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": "Set Target Config [Webhook]"
},
{
"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, 520],
"id": "fa-22222222-2222-2222-2222-222222222212",
"name": "Fetch Captcha Image [Webhook]"
},
{
"parameters": {
"jsCode": "// Convertir la imagen binaria del captcha a una cadena base64 limpia\nconst binaryData = $input.first().binary.data;\nconst base64String = binaryData.data;\n\n// Eliminar el prefijo data: si está presente\nconst cleanBase64 = base64String.replace(/^data:image\\/\\w+;base64,/, '');\n\n// Eliminar cualquier salto de línea\nconst finalBase64 = cleanBase64.replace(/\\n/g, '');\n\n// Pasar la configuración de destino\nconst config = $('Set Target Config [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": "Convert to 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": "Solve Image Captcha [Webhook]",
"onError": "continueRegularOutput",
"credentials": {
"capSolverApi": {
"id": "YOUR_CREDENTIAL_ID",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"method": "POST",
"url": "={{ $('Set Target Config [Webhook]').first().json.formActionURL }}",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "content-type",
"value": "application/x-www-form-urlencoded"
},
{
"name": "user-agent",
"value": "={{ $('Set Target Config [Webhook]').first().json.userAgent }}"
}
]
},
"sendBody": true,
"contentType": "form-urlencoded",
"bodyParameters": {
"parameters": [
{
"name": "username",
"value": "YOUR_USERNAME"
},
{
"name": "password",
"value": "YOUR_PASSWORD"
},
{
"name": "={{ $('Set Target Config [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": "Submit Form with Solution [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": "Check Submission Result [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": "={{ $('Solve Image Captcha [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": "Mark Success [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": "Mark Failed [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": "Respond to Webhook"
}
],
"connections": {
"Every 6 Hours": {
"main": [
[
{
"node": "Set Target Config",
"type": "main",
"index": 0
}
]
]
},
"Set Target Config": {
"main": [
[
{
"node": "Fetch Captcha Image",
"type": "main",
"index": 0
}
]
]
},
"Fetch Captcha Image": {
"main": [
[
{
"node": "Convert to Base64",
"type": "main",
"index": 0
}
]
]
},
"Convert to Base64": {
"main": [
[
{
"node": "Solve Image Captcha",
"type": "main",
"index": 0
}
]
]
},
"Solve Image Captcha": {
"main": [
[
{
"node": "Submit Form with Solution",
"type": "main",
"index": 0
}
]
]
},
"Submit Form with Solution": {
"main": [
[
{
"node": "Check Submission Result",
"type": "main",
"index": 0
}
]
]
},
"Check Submission Result": {
"main": [
[
{
"node": "Mark Success",
"type": "main",
"index": 0
}
],
[
{
"node": "Mark Failed",
"type": "main",
"index": 0
}
]
]
},
"Webhook Trigger": {
"main": [
[
{
"node": "Set Target Config [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Set Target Config [Webhook]": {
"main": [
[
{
"node": "Fetch Captcha Image [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Fetch Captcha Image [Webhook]": {
"main": [
[
{
"node": "Convert to Base64 [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Convert to Base64 [Webhook]": {
"main": [
[
{
"node": "Solve Image Captcha [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Solve Image Captcha [Webhook]": {
"main": [
[
{
"node": "Submit Form with Solution [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Submit Form with Solution [Webhook]": {
"main": [
[
{
"node": "Check Submission Result [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Check Submission Result [Webhook]": {
"main": [
[
{
"node": "Mark Success [Webhook]",
"type": "main",
"index": 0
}
],
[
{
"node": "Mark Failed [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Mark Success [Webhook]": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
},
"Mark Failed [Webhook]": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
}
],
"active": false,
"settings": {
"executionOrder": "v1"
}
}
Si has utilizado el nodo CapSolver n8n para reCAPTCHA, Turnstile u otros tipos de desafíos, has estado utilizando el recurso Token. Imagen a Texto utiliza el recurso Reconocimiento, y la diferencia es importante:
websiteURL y una websiteKey.Por eso el nodo CapSolver n8n tiene dos recursos separados:
| Recurso | Operaciones |
|---|---|
| Token | reCAPTCHA v2, reCAPTCHA v3, Cloudflare Turnstile, Cloudflare Challenge, GeeTest V3, GeeTest V4, DataDome, AWS WAF, MTCaptcha |
| Reconocimiento | Imagen a Texto |
Al configurar el nodo CapSolver para Imagen a Texto, asegúrate de seleccionar primero Resource = Recognition; esto cambia las operaciones y los parámetros disponibles.
Estos flujos de trabajo son plantillas. En un objetivo real, deberías esperar personalizar:
La plantilla de automatización de formularios obtiene la imagen de una sola URL (captchaImageURL). En la práctica, la imagen del captcha puede ser:
<img> base64Muchos sistemas de captcha de imagen están vinculados a la sesión: la imagen del captcha está vinculada a una sesión del lado del servidor. Si obtienes la imagen en una solicitud y envías la respuesta en otra, debes:
Los diferentes sitios utilizan diferentes nombres de campos de formulario para la respuesta del captcha:
| Nombres de campos comunes |
|---|
captcha |
captcha_code |
verification |
captcha_text |
answer |
security_code |
Inspecciona el HTML del formulario para encontrar el nombre exacto del campo.
La mayoría de los captchas de imagen funcionan con module: "common". Pero si el captcha contiene solo números, prueba module: "number": está optimizado para el reconocimiento numérico y puede dar mejores resultados.
La plantilla incluye campos de marcador de posición username y password. Tu objetivo puede requerir:
Este error significa que tu cuenta o paquete de CapSolver no incluye acceso a ImageToText. Verifica tu panel de CapSolver para confirmar que tu paquete incluye este servicio.
El reconocimiento de captcha de imagen no es 100% preciso. Si obtienes resultados incorrectos:
module diferente — "common" vs "number" vs IDs de módulos específicosCausas comunes:
data:image/...;base64,Si el envío del formulario siempre falla incluso con el texto reconocido correcto, la causa más probable es un desajuste de sesión entre la obtención de la imagen y el envío del formulario. Asegúrate de pasar las mismas cookies de sesión en ambas solicitudes.
Esto suele significar:
data: — siempre limpia tu base64 antes de enviarlo a CapSolver."common" para alfanumérico mixto, "number" solo para dígitos.¿Listo para empezar? Regístrate en CapSolver y usa el código de bonificación n8n para obtener un 8% de bonificación adicional en tu primera recarga.

Has aprendido a construir una API de resolución de imagen a texto y un flujo de trabajo de automatización de formularios utilizando n8n y CapSolver.
Resumen:
La clave: Imagen a Texto es la operación de CapSolver más sencilla de integrar: envías una imagen base64 y obtienes texto de vuelta inmediatamente. El desafío suele estar en el flujo de trabajo circundante: obtener la imagen correctamente, preservar el estado de la sesión y enviar la respuesta al campo de formulario correcto.
Consejo: Estos flujos de trabajo utilizan disparadores de programación + Webhook, pero puedes cambiar el nodo disparador a cualquier disparador de n8n — manual, evento de aplicación, envío de formulario, etc. Después de resolver el captcha, usa los nodos integrados de n8n para guardar los resultados en Google Sheets, bases de datos, almacenamiento en la nube o enviar alertas a través de Telegram/Slack/Email.
ImageToTextTask es el servicio de reconocimiento de captcha basado en OCR de CapSolver. Envías una imagen de captcha codificada en base64, y CapSolver devuelve el texto reconocido (letras, números o ambos). Utiliza el recurso Reconocimiento en el nodo CapSolver n8n, que es diferente del recurso Token utilizado para reCAPTCHA, Turnstile y otros tipos de desafíos.
El precio varía según el uso. Consulta la página de precios de CapSolver para conocer las tarifas actuales de ImageToText. Las tareas de reconocimiento de imágenes suelen ser una de las operaciones más asequibles de CapSolver.
Imagen a Texto es una operación de Reconocimiento, lo que significa que los resultados se devuelven instantáneamente, normalmente en menos de 1 segundo. No hay creación de tareas ni retraso de sondeo como en las operaciones de Token.
No. A diferencia de las operaciones de Token (reCAPTCHA, Turnstile, Cloudflare Challenge), Imagen a Texto no requiere un proxy. Estás enviando los datos de la imagen directamente a CapSolver, no hay interacción con el navegador ni visita al sitio.
CapSolver acepta formatos de imagen comunes (PNG, JPEG, GIF, BMP) como datos codificados en base64. La imagen debe contener un captcha visible, no imágenes en blanco, dañadas o excesivamente grandes.
module?El parámetro module le dice a CapSolver qué motor de reconocimiento usar:
"common" — OCR general para letras, números y caracteres mixtos. Este es el predeterminado y funciona para la mayoría de los captchas."number" — Optimizado para captchas solo numéricos. También admite la resolución por lotes con hasta 9 imágenes adicionales."module_001" a "module_032" — Motores especializados para estilos de captcha específicos. Consulta la documentación de CapSolver para obtener detalles sobre cada módulo.No. El reconocimiento de imagen a texto de CapSolver no admite la distinción entre mayúsculas y minúsculas. Si el sitio de destino requiere una respuesta de captcha sensible a mayúsculas y minúsculas, el resultado del reconocimiento puede no coincidir. Esta es una limitación conocida.
Sí. Este flujo de trabajo funciona tanto con n8n autoalojado como con n8n Cloud. El nodo CapSolver ya está disponible como una integración oficial; solo agrega tus credenciales de API.
Muchos sitios vinculan la imagen del captcha a una sesión del servidor. Para manejar esto:
En n8n, puedes extraer cookies de los encabezados de respuesta de la solicitud HTTP y pasarlas a solicitudes posteriores.
El reconocimiento de captcha de imagen no es 100% preciso, especialmente para imágenes muy distorsionadas o ruidosas. Si obtienes resultados incorrectos:
"common", "number" o un ID de módulo específico).Para Imagen a Texto, CapSolver devuelve texto reconocido, no un token. Si el envío del formulario es rechazado:
solution.text.Crea una API para resolver reCAPTCHA v2/v3 utilizando CapSolver y n8n. Aprende a automatizar la obtención de tokens, enviarlos a los sitios web y extraer datos protegidos sin necesidad de programar.

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

Aprende cómo integrar CapSolver con n8n para resolver CAPTCHAs y crear flujos de trabajo de automatización confiables con facilidad.

Resuelve CAPTCHAs visuales con el motor de visión de CapSolver en n8n. Maneja deslizadores, rotación, selección de objetos y OCR de GIF de forma inmediata.
