ProductosIntegracionesRecursosDocumentaciónPrecios
Empezar ahora

© 2026 CapSolver. All rights reserved.

Contáctenos

Slack: lola@capsolver.com

Productos

  • reCAPTCHA v2
  • reCAPTCHA v3
  • Cloudflare Turnstile
  • Cloudflare Challenge
  • AWS WAF
  • Extensión de navegador
  • Más tipos de CAPTCHA

Integraciones

  • Selenium
  • Playwright
  • Puppeteer
  • n8n
  • Socios
  • Ver todas las integraciones

Recursos

  • Programa de referidos
  • Documentación
  • Referencia de API
  • Blog
  • Preguntas frecuentes
  • Glosario
  • Estado

Legal

  • Términos de servicio
  • Política de privacidad
  • Política de reembolso
  • No vender mi información personal
//Cómo resolver ImageToText usando CapSolver y n8n
Mar16, 2026

Cómo resolver ImageToText usando CapSolver y n8n

Nikolai Smirnov

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:

  • Una API de resolución de imagen a texto que acepta una imagen base64 y devuelve el texto reconocido.

Flujo de trabajo de uso directo — CapSolver incrustado como un paso dentro de una automatización más grande:

  • Una automatización de formulario que obtiene una imagen de captcha de un sitio objetivo, la convierte a base64, la resuelve con CapSolver y envía el formulario con el texto reconocido.

¿Qué es Imagen a Texto (ImageToTextTask)?

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ámetros requeridos

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ámetros opcionales

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

Tipos de módulos

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

Requisitos previos

Antes de comenzar, asegúrate de tener lo siguiente:

  1. Una instancia de n8n — Ya sea autoalojada o n8n Cloud
  2. Una cuenta de CapSolver — Regístrate aquí y obtén tu clave API
  3. El nodo CapSolver de n8n — Ya disponible como nodo oficial en n8n (no se necesita instalación)

Importante: Asegúrate de tener suficiente saldo en tu cuenta de CapSolver. Las tareas de ImageToText consumen créditos según el uso.


Configuración de CapSolver en n8n

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.

Paso 1: Abrir la página de credenciales

Ve a tu instancia de n8n y navega a Settings -> Credentials. Aquí verás todas tus credenciales configuradas.

Página de credenciales de n8n que muestra la cuenta de CapSolver

Paso 2: Crear la credencial de CapSolver

  1. Haz clic en Create credential (arriba a la derecha)
  2. Busca "CapSolver" y selecciona CapSolver API
  3. Introduce tu clave API — cópiala directamente desde el Panel de CapSolver
  4. Deja Allowed HTTP Request Domains configurado en All (predeterminado)
  5. Haz clic en Save

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.

Configuración de credenciales de CapSolver con prueba de conexión exitosa

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!


Comprensión de la codificación Base64 para imágenes de Captcha

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.

Lo que espera CapSolver

El parámetro body debe contener una cadena base64 limpia, los bytes codificados sin procesar del archivo de imagen. Específicamente:

  • Sin prefijo data: — si tienes data:image/png;base64,iVBORw0KGgo..., debes eliminar la parte data:image/png;base64,
  • Sin saltos de línea — la cadena base64 debe ser una sola línea continua sin caracteres \n
  • Sin espacios en blanco — sin espacios, tabulaciones u otros caracteres de espacio en blanco

Cómo obtener una cadena Base64 limpia en n8n

Cuando 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:

javascript Copy
// 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 } }];

Errores comunes

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

Flujo de trabajo 1: API de resolución de imagen a texto

Este flujo de trabajo crea un punto final de API POST que acepta una imagen de captcha base64 y devuelve el texto reconocido.

Cómo funciona

El flujo de trabajo consta de seis nodos:

  1. Receive Solver Request — Webhook que recibe solicitudes POST con datos de imagen
  2. Validate Image Input — Nodo de código que verifica que body existe y es base64 válido
  3. Solve Image Captcha — Nodo CapSolver que usa Resource=Recognition, Operation=Image To Text
  4. Image Captcha Error? — Nodo IF que se ramifica si la resolución falló
  5. Respond to Webhook — Devuelve el texto reconocido si tiene éxito
  6. Respond to Webhook Error — Devuelve el mensaje de error si falla

Configuración del nodo

1. Receive Solver Request (Webhook)

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

2. Validate Image Input (Code)

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:

javascript Copy
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'
  }
}];

3. Solve Image Captcha (CapSolver)

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.

4. Image Captcha Error? (IF)

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.

5. Respond to Webhook (Success)

Configuración Valor
Responder con JSON
Cuerpo de la respuesta ={{ JSON.stringify($json.data) }}

6. Respond to Webhook Error

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": "..." }

Pruébalo

Envía una solicitud POST a tu punto final de webhook:

bash Copy
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:

json Copy
{
  "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.

Importar este flujo de trabajo

Copia el JSON a continuación e impórtalo en n8n a través de Menu -> Import from JSON:

Haz clic para expandir el JSON del flujo de trabajo
json Copy
{
  "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"
  }
}

Flujo de trabajo 2: Automatización de formularios — Resolver Captcha de imagen y enviar

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:

  • Programación: se ejecuta automáticamente cada 6 horas
  • Webhook: se activa bajo demanda y devuelve el resultado como JSON

Cómo funciona

Ruta de programación:

Copy
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:

Copy
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

Configuración del nodo

1. Nodos disparadores

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

2. Establecer configuración de destino

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

3. Obtener imagen de Captcha (Solicitud HTTP)

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.

4. Convertir a Base64 (Código)

javascript Copy
// 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
  }
}];

5. Resolver Captcha de imagen (Reconocimiento de CapSolver)

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.

6. Enviar formulario con solución (Solicitud HTTP)

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 }}

7. Verificar resultado de envío (IF)

Configuración Valor
Condición {{ $json.statusCode < 400 }} — verifica que la respuesta HTTP indique éxito
Rama verdadera Marcar éxito
Rama falsa Marcar fallo

Pruébalo

Envía una solicitud POST para activar la automatización del formulario:

bash Copy
curl -X POST https://tu-instancia-n8n.com/webhook/image-captcha-form \
  -H "Content-Type: application/json" \
  -d '{}'

Respuesta esperada (éxito):

json Copy
{
  "action": "form_submission",
  "status": "success",
  "captchaText": "xK7mQ",
  "message": "Form submitted successfully with solved captcha",
  "submittedAt": "2026-03-16T12:00:00.000Z"
}

Respuesta esperada (fallo):

json Copy
{
  "action": "form_submission",
  "status": "failed",
  "statusCode": 403,
  "message": "Form submission was rejected by the target site",
  "submittedAt": "2026-03-16T12:00:00.000Z"
}

Importar este flujo de trabajo

Copia el JSON a continuación e impórtalo en n8n a través de Menu -> Import from JSON:

Haz clic para expandir el JSON del flujo de trabajo
json Copy
{
  "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"
  }
}

Reconocimiento vs. Token: Por qué Imagen a Texto es diferente

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:

Operaciones de Token (reCAPTCHA, Turnstile, etc.)

  1. CapSolver crea una tarea en sus servidores.
  2. La tarea se ejecuta de forma asíncrona: el nodo sondea el resultado.
  3. La resolución puede tardar desde varios segundos hasta más de un minuto.
  4. El resultado es un token que envías al sitio de destino para su verificación.
  5. Necesitas una websiteURL y una websiteKey.

Operaciones de Reconocimiento (Imagen a Texto)

  1. CapSolver procesa la imagen inmediatamente en una sola solicitud.
  2. Sin sondeo: el resultado se devuelve en la misma respuesta.
  3. La resolución es casi instantánea (normalmente menos de 1 segundo).
  4. El resultado es el texto reconocido que escribes en un campo de entrada de captcha.
  5. Necesitas una imagen base64, no una URL o una clave de sitio.

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.


Lo que probablemente necesitarás cambiar

Estos flujos de trabajo son plantillas. En un objetivo real, deberías esperar personalizar:

1. La fuente de la imagen del Captcha

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:

  • servida desde una URL dinámica que cambia con cada solicitud
  • incrustada en el HTML de la página como una etiqueta <img> base64
  • vinculada a una cookie de sesión (por lo que necesitas la cookie para obtener la imagen correspondiente)
  • servida con parámetros de consulta para evitar el almacenamiento en caché

2. Manejo de sesiones y cookies

Muchos 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:

  • capturar la cookie de sesión de la solicitud de imagen
  • pasar esa misma cookie al enviar el formulario
  • posiblemente extraer un token CSRF de la página

3. El nombre del campo del Captcha

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.

4. El módulo de reconocimiento

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.

5. Campos de formulario adicionales

La plantilla incluye campos de marcador de posición username y password. Tu objetivo puede requerir:

  • diferentes nombres de campos
  • campos ocultos adicionales
  • tokens CSRF
  • encabezados de referencia
  • cookies específicas

Solución de problemas

"No se encontró acceso a ImageToTextTask"

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.

CapSolver devuelve texto incorrecto

El reconocimiento de captcha de imagen no es 100% preciso. Si obtienes resultados incorrectos:

  • Prueba un module diferente — "common" vs "number" vs IDs de módulos específicos
  • Verifica que tu codificación base64 sea correcta — una codificación inválida puede producir una entrada ilegible
  • Verifica que la imagen no esté dañada o en blanco
  • Algunos captchas muy distorsionados tienen tasas de éxito más bajas

"Codificación base64 inválida" o respuesta vacía

Causas comunes:

  • No se eliminó el prefijo data:image/...;base64,
  • Hay saltos de línea en la cadena base64
  • La URL de la imagen devolvió HTML en lugar de una imagen (verifica el Content-Type)
  • El nodo de solicitud HTTP devolvió una página de error, no la imagen

Desajuste de sesión

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.

El envío del formulario devuelve 403 o error de Captcha

Esto suele significar:

  • La respuesta del captcha se envió demasiado tarde (algunos captchas caducan)
  • Faltaba la cookie de sesión
  • El nombre del campo del captcha es incorrecto
  • Falta un token CSRF
  • Se requieren campos ocultos adicionales

Mejores prácticas

  1. Envía el texto reconocido inmediatamente — los captchas de imagen a menudo caducan en 60-120 segundos.
  2. Conserva las cookies de sesión entre la obtención de la imagen y el envío del formulario.
  3. Elimina el prefijo data: — siempre limpia tu base64 antes de enviarlo a CapSolver.
  4. Usa el módulo correcto — "common" para alfanumérico mixto, "number" solo para dígitos.
  5. Valida el base64 en un nodo de código antes de enviarlo a CapSolver para detectar errores de codificación a tiempo.
  6. Verifica la imagen — si el reconocimiento falla, registra la cadena base64 y decodifícala manualmente para verificar que es una imagen de captcha válida.
  7. Maneja los reintentos — si el texto reconocido es rechazado, es posible que desees agregar un bucle de reintentos que obtenga una nueva imagen de captcha y lo intente de nuevo.
  8. No se necesita proxy — a diferencia de las operaciones de Token, Imagen a Texto no requiere un proxy. Los datos de la imagen se envían directamente a los servidores de CapSolver.

¿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.

Banner de código de bonificación de CapSolver

Conclusión

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:

  • Cómo Imagen a Texto difiere de las operaciones de Token — El reconocimiento es instantáneo, sin sondeo, sin necesidad de proxy.
  • Requisitos de codificación Base64 — solo cadenas limpias, sin prefijo data:, sin saltos de línea.
  • Un punto final de API de resolución que acepta imágenes base64 y devuelve texto reconocido.
  • Un flujo de trabajo de automatización de formularios que obtiene una imagen de captcha, la convierte, la resuelve y envía el formulario.
  • Cómo convertir imágenes a base64 en n8n usando nodos de código.
  • Mejores prácticas para el manejo de sesiones, la selección de módulos y la gestión de errores.

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.


Preguntas frecuentes

¿Qué es ImageToTextTask?

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.

¿Cuánto cuesta resolver un captcha de imagen?

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.

¿Cuánto tiempo se tarda en resolver un captcha de imagen?

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.

¿Necesito un proxy para Imagen a Texto?

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.

¿Qué formatos de imagen son compatibles?

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.

¿Qué hace el parámetro 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.

¿CapSolver admite el reconocimiento sensible a mayúsculas y minúsculas?

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.

¿Puedo usar este flujo de trabajo con n8n Cloud?

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.

¿Cómo manejo los captchas vinculados a la sesión?

Muchos sitios vinculan la imagen del captcha a una sesión del servidor. Para manejar esto:

  1. Realiza una solicitud inicial a la página del captcha para obtener la cookie de sesión.
  2. Usa esa cookie al obtener la imagen del captcha.
  3. Pasa la misma cookie al enviar el formulario con el texto reconocido.

En n8n, puedes extraer cookies de los encabezados de respuesta de la solicitud HTTP y pasarlas a solicitudes posteriores.

¿Qué pasa si CapSolver devuelve texto incorrecto?

El reconocimiento de captcha de imagen no es 100% preciso, especialmente para imágenes muy distorsionadas o ruidosas. Si obtienes resultados incorrectos:

  • Prueba un módulo diferente ("common", "number" o un ID de módulo específico).
  • Verifica que tu codificación base64 sea correcta.
  • Agrega un bucle de reintentos que obtenga una nueva imagen de captcha si falla.
  • Consulta la documentación de CapSolver para obtener recomendaciones de módulos para estilos de captcha específicos.

CapSolver devolvió un token pero el sitio web aún lo rechazó, ¿por qué?

Para Imagen a Texto, CapSolver devuelve texto reconocido, no un token. Si el envío del formulario es rechazado:

  • Verifica que la respuesta del captcha sea correcta comprobando el valor de solution.text.
  • Verifica el manejo de la sesión — el captcha puede haber caducado o la cookie de sesión puede faltar.
  • Verifica el nombre del campo del formulario — la respuesta del captcha podría necesitar ir en un campo diferente.
  • Busca campos adicionales requeridos — tokens CSRF, entradas ocultas o marcas de tiempo.
  • Verifica el tiempo — algunos captchas caducan rápidamente, así que envía la respuesta inmediatamente después del reconocimiento.

Contenido

Ver más

n8nMar 09, 2026

Cómo Resolver reCAPTCHA v2/v3 Usando CapSolver y n8n

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.

Aloísio Vítor
Aloísio Vítor
n8nMar 12, 2026

Cómo resolver GeeTest V3 en n8n con CapSolver: Guía completa de integración

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

Ethan Collins
Ethan Collins
n8nMar 17, 2026

Cómo usar CapSolver en n8n: La guía completa para resolver CAPTCHA en tus flujos de trabajo

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

Adélia Cruz
Adélia Cruz
n8nMar 16, 2026

Cómo resolver puzzles visuales en n8n con CapSolver

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.

Aloísio Vítor
Aloísio Vítor
Blog
n8n