
Aloísio Vítor
Image Processing Expert

Los acertijos visuales están en todas partes: CAPTCHAs de deslizador que requieren arrastrar una pieza a la posición correcta, desafíos de rotación donde alineas una imagen, cuadrículas de selección de objetos y reconocimiento de texto en GIF animados. Estos no son CAPTCHAs tradicionales basados en texto ni desafíos basados en tokens (como reCAPTCHA o Turnstile) que devuelven una cadena que envías con un formulario. Son desafíos visuales basados en imágenes donde la entrada es una imagen y la salida es una medición: una distancia en píxeles, un ángulo en grados, un conjunto de coordenadas o texto reconocido.
Eso es lo que CapSolver's Vision Engine resuelve. Utiliza inteligencia artificial para analizar la imagen del acertijo visual y devolver la respuesta precisa que necesita tu automatización para continuar.
En esta guía, aprenderás a usar el Vision Engine en n8n a través del nodo de la comunidad de CapSolver. El recorrido cubre el flujo de trabajo básico de la API del Solver y un solucionador de rompecabezas de deslizador práctico que obtiene imágenes de rompecabezas, las convierte en base64, resuelve el deslizador y devuelve la distancia en píxeles.
Importante: Vision Engine es una operación de reconocimiento, no una operación de token. Eso significa que el resultado vuelve instantáneamente en una sola llamada a la API: no hay sondeo, no hay bucle
getTaskResulty no hay espera por timeout. Envías la imagen y obtienes la respuesta.
La mayoría de las operaciones de CapSolver en n8n son tareas de token. Envías parámetros del sitio (URL, clave del sitio, proxy), CapSolver resuelve el desafío en segundo plano y tu flujo de trabajo sondea el resultado. La salida es una cadena de token que luego envías al sitio objetivo.
Vision Engine funciona de manera diferente:
| Aspecto | Operaciones de Token (reCAPTCHA, Turnstile, etc.) | Vision Engine (Reconocimiento) |
|---|---|---|
| Recurso | Token | Reconocimiento |
| Entrada | URL del sitio, clave del sitio, proxy | Imagen(es) en base64, nombre del módulo |
| Procesamiento | Asíncrono — sondea el resultado | Instantáneo — llamada única a la API |
| Salida | Cadena de token | Píxeles, grados, coordenadas o texto |
| Proxy | A menudo necesario | No es necesario |
| Caso de uso | Enviar token para evitar la barrera de desafío | Interpretar el acertijo visual para automatizar la interacción |
Vision Engine es más cercano al reconocimiento de imagen a texto (OCR) que a la resolución de reCAPTCHA, pero va más allá del reconocimiento simple de texto. Mientras que el OCR lee caracteres de una imagen estática, Vision Engine entiende las relaciones espaciales: puede calcular cuántos píxeles se deben arrastrar una pieza de deslizador, qué ángulo se debe rotar una imagen, qué áreas de una imagen coinciden con una pregunta o qué texto está oculto en un GIF animado.
Vision Engine soporta múltiples modelos de IA, cada uno diseñado para un tipo específico de acertijo visual:
| Módulo | Propósito | Entrada | Devuelve |
|---|---|---|---|
slider_1 |
Resolución de rompecabezas de deslizador | image (pieza del rompecabezas) + imageBackground (fondo con ranura) |
Distancia en píxeles |
rotate_1 |
Rotación de imagen única | image + imageBackground |
Ángulo en grados |
rotate_2 |
Rotación de múltiples imágenes (interna + externa) | image (imagen interna) |
Ángulo en grados |
shein |
Selección de objeto/área | image + question (qué seleccionar) |
Matriz de rectángulos [{x1, y1, x2, y2}] |
ocr_gif |
Reconocimiento de texto en GIF animado | image (base64 del GIF) |
Cadena de texto reconocido |
slider_1 — El tipo más común de CAPTCHA visual. El usuario ve una imagen de fondo con una pieza faltante y una pieza de rompecabezas separada. El objetivo es determinar cuántos píxeles a la derecha debe arrastrarse la pieza. Se requieren tanto image (la pieza del rompecabezas) como imageBackground (el fondo completo con la ranura).
rotate_1 — Una imagen única que debe rotarse a la orientación correcta. Se requieren tanto image como imageBackground. El motor devuelve el ángulo en grados.
rotate_2 — Dos imágenes concéntricas (una imagen interna y un anillo externo). La imagen interna debe rotarse para alinearse con la externa. Solo se necesita image. El motor devuelve el ángulo.
shein — Usado para desafíos que piden "seleccionar los elementos que coinciden" o "tocar el área correcta". Requiere image más un parámetro question que describa qué encontrar. Devuelve coordenadas de cajas delimitadoras para cada área que coincide.
ocr_gif — GIFs animados donde el texto aparece en frames, haciendo imposible su lectura para OCR estándar. El motor analiza la animación y extrae el texto.
Antes de comenzar, asegúrate de tener:
n8n-nodes-capsolver)No se requiere proxy para tareas de Vision Engine.
En el nodo de CapSolver de n8n, configura estos ajustes:
| Configuración | Valor |
|---|---|
| Recurso | Reconocimiento |
| Operación | Vision Engine |
| módulo | Nombre del modelo (ejemplo: slider_1, rotate_1, ocr_gif) |
| imagen | Cadena codificada en base64 (sin prefijo data:image/...;base64,) |
| imageBackground | Imagen de fondo codificada en base64 (opcional — requerida para slider_1 y rotate_1) |
| pregunta | Pregunta de texto (opcional — requerida solo para el módulo shein) |
| websiteURL | URL de la página de origen (opcional — puede mejorar la precisión) |
El campo type se establece automáticamente en VisionEngine cuando seleccionas la operación Vision Engine.
Los campos image y imageBackground deben ser cadenas base64 sin formato — sin prefijo URI de datos, sin saltos de línea:
/9j/4AAQSkZJRgABA... (base64 sin formato)data:image/jpeg;base64,/9j/4AAQSkZJRgABA... (tiene prefijo)Si tu imagen de origen es una URL, debes obtenerla primero y convertirla a base64. Si ya tiene el prefijo data:image/...;base64,, elimínalo antes de pasarlo al nodo de CapSolver.
Este flujo expone Vision Engine como un endpoint de API REST simple. Envía una solicitud POST con el nombre del módulo y la imagen en base64, y obtén la solución como JSON.
Recibir solicitud del solucionador (Webhook POST)
→ Validar entrada (Código)
→ Resolver acertijo visual (CapSolver — Reconocimiento — Vision Engine)
→ ¿Error de Vision Engine? (IF)
→ true: Responder al Webhook con error
→ false: Responder al Webhook (Éxito)
Un endpoint de webhook acepta solicitudes POST con un cuerpo JSON que contiene:
{
"module": "slider_1",
"image": "/9j/4AAQSkZJRgABA...",
"imageBackground": "/9j/4AAQSkZJRgABA...",
"question": "",
"websiteURL": ""
}
El nodo de código verifica que image exista y que module sea uno de los valores admitidos (slider_1, rotate_1, rotate_2, shein, ocr_gif). Si la validación falla, establece un campo error.
El nodo de CapSolver se configura con:
ReconocimientoVision EngineComo es una tarea de Reconocimiento, el resultado vuelve instantáneamente.
El nodo IF verifica errores. Si el nodo de CapSolver devolvió un error (módulo incorrecto, imagen inválida, etc.), se activa el webhook de error. De lo contrario, se devuelve la respuesta de éxito con la solución.
Solicitud de rompecabezas de deslizador:
curl -X POST https://your-n8n-instance.com/webhook/vision-engine-solver \
-H "Content-Type: application/json" \
-d '{
"module": "slider_1",
"image": "BASE64_PUZZLE_PIECE",
"imageBackground": "BASE64_BACKGROUND"
}'
Respuesta exitosa:
{
"solution": {
"distance": 142,
"module": "slider_1"
}
}
Solicitud de OCR de GIF:
curl -X POST https://your-n8n-instance.com/webhook/vision-engine-solver \
-H "Content-Type: application/json" \
-d '{
"module": "ocr_gif",
"image": "BASE64_GIF_DATA"
}'
Respuesta exitosa:
{
"solution": {
"text": "x7Km9",
"module": "ocr_gif"
}
}
{
"name": "Vision Engine — Solver API",
"nodes": [
{
"parameters": {
"content": "## Vision Engine — Solver API\n\n**¿Para quién es?** Desarrolladores y equipos de automatización que necesitan resolver acertijos visuales (deslizadores, rotaciones, selección de objetos, OCR de GIF) a través de un endpoint REST simple.\n\n**¿Qué hace?** Acepta una imagen codificada en base64 y un nombre de módulo, la envía al Vision Engine de CapSolver y devuelve la solución instantáneamente.\n\n**¿Cómo funciona?**\n1. El webhook recibe POST con `module`, `image` y `imageBackground`/`question` opcionales\n2. El nodo de código valida la entrada (la imagen existe, el módulo es válido)\n3. El nodo de CapSolver de Reconocimiento resuelve el acertijo visual\n4. Devuelve la solución o error como JSON\n\n**Configuración:**\n1. Agrega tu clave de API de CapSolver bajo **Configuración → Credenciales**\n2. Activa el flujo\n3. Envía POST a `/webhook/vision-engine-solver` con tus datos de imagen",
"height": 560,
"width": 460,
"color": 1
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [-920, -380],
"id": "sticky-ve-main-001",
"name": "Nota adhesiva"
},
{
"parameters": {
"content": "### Validación de entrada\nVerifica que `image` esté presente y `module` sea uno de: slider_1, rotate_1, rotate_2, shein, ocr_gif",
"height": 480,
"width": 440,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [-100, -280],
"id": "sticky-ve-section-002",
"name": "Nota adhesiva1"
},
{
"parameters": {
"content": "### Vision Engine de CapSolver\nRecurso de Reconocimiento — resultado instantáneo, sin sondeo. Devuelve distancia, ángulo, coordenadas o texto según el módulo.",
"height": 480,
"width": 440,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [380, -280],
"id": "sticky-ve-section-003",
"name": "Nota adhesiva2"
},
{
"parameters": {
"content": "### Manejo de errores\nVerifica errores de CapSolver (imagen inválida, módulo no admitido, etc.) y devuelve una respuesta de error estructurada.",
"height": 480,
"width": 440,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [860, -280],
"id": "sticky-ve-section-004",
"name": "Nota adhesiva3"
},
{
"parameters": {
"content": "### Desencadenador de Webhook\nPOST /webhook/vision-engine-solver con cuerpo JSON que contiene módulo, imagen y opciones imageBackground / question.",
"height": 480,
"width": 440,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [-580, -280],
"id": "sticky-ve-section-005",
"name": "Nota adhesiva4"
},
{
"parameters": {
"content": "### Respuesta de éxito\nDevuelve el objeto de solución completo de CapSolver — el contenido varía según el tipo de módulo.",
"height": 480,
"width": 440,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [1340, -280],
"id": "sticky-ve-section-006",
"name": "Nota adhesiva5"
},
{
"parameters": {
"content": "### Respuesta de error\nDevuelve el mensaje de error de CapSolver o de la validación de entrada.",
"height": 480,
"width": 440,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [1340, 240],
"id": "sticky-ve-section-007",
"name": "Nota adhesiva6"
},
{
"parameters": {
"httpMethod": "POST",
"path": "vision-engine-solver",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [-540, 0],
"id": "ve-api-11111111-1111-1111-1111-111111111101",
"name": "Recibir solicitud del solucionador",
"webhookId": "ve-api-11111111-aaaa-bbbb-cccc-111111111101"
},
{
"parameters": {
"jsCode": "const body = $input.first().json.body || {};\nconst validModules = ['slider_1', 'rotate_1', 'rotate_2', 'shein', 'ocr_gif'];\n\nconst module = (body.module || '').trim();\nconst image = (body.image || '').trim();\nconst imageBackground = (body.imageBackground || '').trim();\nconst question = (body.question || '').trim();\nconst websiteURL = (body.websiteURL || '').trim();\n\n// Validar campos requeridos\nif (!image) {\n return [{ json: { error: 'Campo requerido faltante: image (codificado en base64)' } }];\n}\n\nif (!module) {\n return [{ json: { error: 'Campo requerido faltante: module' } }];\n}\n\nif (!validModules.includes(module)) {\n return [{ json: { error: `Módulo inválido: ${module}. Debe ser uno de: ${validModules.join(', ')}` } }];\n}\n\n// Validación específica del módulo\nif ((module === 'slider_1' || module === 'rotate_2') && !imageBackground) {\n return [{ json: { error: `El módulo ${module} requiere imageBackground` } }];\n}\n\nif (module === 'shein' && !question) {\n return [{ json: { error: 'El módulo shein requiere un parámetro question' } }];\n}\n\nreturn [{ json: {\n module,\n image,\n imageBackground,\n question,\n websiteURL,\n validated: true\n} }];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [-60, 0],
"id": "ve-api-11111111-1111-1111-1111-111111111102",
"name": "Validar entrada"
},
{
"parameters": {
"resource": "Reconocimiento",
"operation": "Vision Engine",
"module": "={{ $json.module }}",
"image": "={{ $json.image }}",
"imageBackground": "={{ $json.imageBackground || '' }}",
"question": "={{ $json.question || '' }}",
"websiteURL": "={{ $json.websiteURL || '' }}"
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [420, 0],
"id": "ve-api-11111111-1111-1111-1111-111111111103",
"name": "Resolver acertijo visual",
"onError": "continueRegularOutput",
"credentials": {
"capSolverApi": {
"id": "YOUR_CREDENTIAL_ID",
"name": "Cuenta de CapSolver"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose",
"version": 2
},
"conditions": [
{
"id": "ve-err-001",
"leftValue": "={{ $json.error }}",
"operator": {
"type": "string",
"operation": "isNotEmpty",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [900, 0],
"id": "ve-api-11111111-1111-1111-1111-111111111104",
"name": "¿Error del Motor de Visión?"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json.data) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"position": [1380, -80],
"id": "ve-api-11111111-1111-1111-1111-111111111105",
"name": "Responder al Webhook"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify({ error: $json.error }) }}",
"options": {
"responseCode": 400
}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"position": [1380, 120],
"id": "ve-api-11111111-1111-1111-1111-111111111106",
"name": "Responder al Webhook de Error"
}
],
"connections": {
"Receive Solver Request": {
"main": [
[
{
"node": "Validate Input",
"type": "main",
"index": 0
}
]
]
},
"Validate Input": {
"main": [
[
{
"node": "Solve Visual Puzzle",
"type": "main",
"index": 0
}
]
]
},
"Solve Visual Puzzle": {
"main": [
[
{
"node": "¿Error del Motor de Visión?",
"type": "main",
"index": 0
}
]
]
},
"¿Error del Motor de Visión?": {
"main": [
[
{
"node": "Responder al Webhook de Error",
"type": "main",
"index": 0
}
],
[
{
"node": "Responder al Webhook",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
}
}
Este flujo de trabajo demuestra un solucionador práctico de rompecabezas de deslizamiento de extremo a extremo. Recupera las imágenes de la pieza del rompecabezas y el fondo desde URLs, las convierte a base64, las envía al Motor de Visión con el módulo slider_1 y devuelve la distancia en píxeles necesaria para completar el deslizador.
Este es el patrón que utilizarías al integrar la resolución de CAPTCHA de deslizamiento en una automatización más grande: la distancia devuelta le dice a tu automatización de navegadores (Puppeteer, Playwright, Selenium) exactamente cuánto desplazar la palanca del deslizador.
Disparador de Programación (cada 1 hora) ─┐
├→ Configuración del Rompecabezas → Recuperar Imagen del Rompecabezas → Recuperar Imagen de Fondo
Disparador de Webhook (POST) ──────────┘ → Convertir Imágenes a Base64 → Resolver Rompecabezas de Deslizamiento
→ ¿Error de Deslizamiento? → Formatear Solución → Devolver Resultado
→ Formatear Error → Devolver Error
Define las URLs para las imágenes de la pieza del rompecabezas y el fondo, más cualquier websiteURL opcional para mayor precisión. En una integración real, estas URLs provendrían de la respuesta del desafío de CAPTCHA del sitio objetivo.
Dos nodos de Solicitud HTTP descargan las imágenes de la pieza del rompecabezas y el fondo como datos binarios.
Un nodo de Código convierte ambas imágenes binarias en cadenas base64 sin el prefijo data:image/...;base64,.
El nodo CapSolver con:
ReconocimientoMotor de Visiónslider_1Devuelve la distancia en píxeles de forma inmediata.
El nodo IF comprueba los errores. En caso de éxito, se formatea y devuelve la solución. En caso de error, se devuelve el mensaje de error.
Éxito:
{
"éxito": true,
"módulo": "slider_1",
"distancia": 142,
"unidad": "píxeles",
"resueltoEn": "2026-03-16T10:00:00.000Z"
}
Error:
{
"éxito": false,
"error": "ERROR_IMAGEN_NO_VÁLIDA",
"resueltoEn": "2026-03-16T10:00:00.000Z"
}
{
"name": "Solucionador de Rompecabezas de Deslizamiento — Recuperar y Resolver — Motor de Visión",
"nodes": [
{
"parameters": {
"content": "## Solucionador de Rompecabezas de Deslizamiento — Recuperar y Resolver\n\n**¿Para quién es?** Equipos de automatización que resuelven CAPTCHAS de deslizamiento como parte de automatizaciones de navegadores o pipelines de raspado.\n\n**¿Qué hace?** Recupera una imagen de rompecabezas de deslizamiento y su fondo desde URLs, las convierte a base64, las envía al Motor de Visión de CapSolver (módulo slider_1) y devuelve la distancia exacta en píxeles para deslizar el control deslizante.\n\n**¿Cómo funciona?**\n1. Un disparador de Programación (cada 1h) o Webhook activa el flujo\n2. El nodo de configuración establece las URLs de las imágenes del rompecabezas\n3. Dos nodos de Solicitud HTTP recuperan las imágenes\n4. Un nodo de Código convierte las imágenes a base64\n5. El Motor de Visión de CapSolver resuelve el rompecabezas de deslizamiento\n6. Devuelve la distancia en píxeles para la automatización\n\n**Configuración:**\n1. Agregue su clave de API de CapSolver bajo **Configuración → Credenciales**\n2. Reemplace las URLs de imagen de ejemplo en Configuración del Rompecabezas\n3. Active y pruebe",
"height": 560,
"width": 460,
"color": 1
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [-1200, -380],
"id": "sticky-slider-main-001",
"name": "Nota Adhesiva"
},
{
"parameters": {
"content": "### Disparadores\nProgramación (cada hora) o Webhook — ambos alimentan la misma pipeline de resolución de rompecabezas.",
"height": 480,
"width": 440,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [-860, -280],
"id": "sticky-slider-section-002",
"name": "Nota Adhesiva1"
},
{
"parameters": {
"content": "### Configuración del Rompecabezas\nEstablezca las URLs para las imágenes de la pieza del rompecabezas y el fondo. En producción, extraiga estas URLs de la respuesta del desafío del sitio objetivo.",
"height": 480,
"width": 440,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [-380, -280],
"id": "sticky-slider-section-003",
"name": "Nota Adhesiva2"
},
{
"parameters": {
"content": "### Recuperación de Imágenes\nDescargue ambas imágenes como datos binarios. La pieza del rompecabezas va en image, el fondo (con el espacio) va en imageBackground.",
"height": 480,
"width": 920,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [100, -280],
"id": "sticky-slider-section-004",
"name": "Nota Adhesiva3"
},
{
"parameters": {
"content": "### Conversión a Base64\nConvierte datos binarios de imagen a cadenas base64 sin el prefijo URI de datos. Ambas imágenes deben ser base64 sin formato para la API de CapSolver.",
"height": 480,
"width": 440,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [1060, -280],
"id": "sticky-slider-section-005",
"name": "Nota Adhesiva4"
},
{
"parameters": {
"content": "### Resolución con Motor de Visión + Manejo de Resultados\nCapSolver devuelve la distancia del deslizador de forma inmediata. El resultado se formatea y se devuelve mediante webhook o se almacena para su uso posterior.",
"height": 480,
"width": 1400,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [1540, -280],
"id": "sticky-slider-section-006",
"name": "Nota Adhesiva5"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 1
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [-820, -60],
"id": "ve-slider-22222222-2222-2222-2222-222222222201",
"name": "Cada 1 hora"
},
{
"parameters": {
"httpMethod": "POST",
"path": "slider-puzzle-solver",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [-820, 140],
"id": "ve-slider-22222222-2222-2222-2222-222222222202",
"name": "Disparador de Webhook",
"webhookId": "ve-slider-22222222-aaaa-bbbb-cccc-222222222202",
"onError": "continueRegularOutput"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "cfg-001",
"name": "puzzleImageURL",
"value": "={{ $json.body?.puzzleImageURL || 'https://example.com/captcha/puzzle-piece.png' }}",
"type": "string"
},
{
"id": "cfg-002",
"name": "backgroundImageURL",
"value": "={{ $json.body?.backgroundImageURL || 'https://example.com/captcha/background.png' }}",
"type": "string"
},
{
"id": "cfg-003",
"name": "websiteURL",
"value": "={{ $json.body?.websiteURL || '' }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [-340, 0],
"id": "ve-slider-22222222-2222-2222-2222-222222222203",
"name": "Configuración del Rompecabezas"
},
{
"parameters": {
"url": "={{ $json.puzzleImageURL }}",
"options": {
"response": {
"response": {
"responseFormat": "file"
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [140, -60],
"id": "ve-slider-22222222-2222-2222-2222-222222222204",
"name": "Recuperar Imagen del Rompecabezas"
},
{
"parameters": {
"url": "={{ $('Configuración del Rompecabezas').first().json.backgroundImageURL }}",
"options": {
"response": {
"response": {
"responseFormat": "file"
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [540, -60],
"id": "ve-slider-22222222-2222-2222-2222-222222222205",
"name": "Recuperar Imagen de Fondo"
},
{
"parameters": {
"jsCode": "// Obtener datos binarios de ambas recuperaciones de imagen\nconst puzzleBinary = $input.first().binary;\nconst config = $('Configuración del Rompecabezas').first().json;\n\nif (!puzzleBinary || !puzzleBinary.data) {\n return [{ json: { error: 'Fallo al recuperar imagen del rompecabezas — no se devolvió datos binarios' } }];\n}\n\n// Convertir pieza del rompecabezas a base64\nconst puzzleBuffer = await this.helpers.getBinaryDataBuffer(0, 'data');\nconst puzzleBase64 = puzzleBuffer.toString('base64');\n\n// Obtener datos binarios de imagen de fondo desde la entrada del nodo actual\n// La imagen de fondo fue recuperada en el nodo anterior\nlet backgroundBase64 = '';\ntry {\n const bgBinary = $input.first().binary;\n if (bgBinary && bgBinary.data) {\n const bgBuffer = await this.helpers.getBinaryDataBuffer(0, 'data');\n backgroundBase64 = bgBuffer.toString('base64');\n }\n} catch (e) {\n // La imagen de fondo puede no estar disponible si la recuperación falló\n}\n\nreturn [{ json: {\n image: puzzleBase64,\n imageBackground: backgroundBase64,\n websiteURL: config.websiteURL || '',\n module: 'slider_1'\n} }];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [1100, 0],
"id": "ve-slider-22222222-2222-2222-2222-222222222206",
"name": "Convertir Imágenes a Base64"
},
{
"parameters": {
"resource": "Reconocimiento",
"operation": "Motor de Visión",
"module": "={{ $json.module }}",
"image": "={{ $json.image }}",
"imageBackground": "={{ $json.imageBackground }}",
"websiteURL": "={{ $json.websiteURL || '' }}"
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [1580, 0],
"id": "ve-slider-22222222-2222-2222-2222-222222222207",
"name": "Resolver Rompecabezas de Deslizamiento",
"onError": "continueRegularOutput",
"credentials": {
"capSolverApi": {
"id": "YOUR_CREDENTIAL_ID",
"name": "Cuenta de CapSolver"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose",
"version": 2
},
"conditions": [
{
"id": "slider-err-001",
"leftValue": "={{ $json.error }}",
"operator": {
"type": "string",
"operation": "isNotEmpty",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [1900, 0],
"id": "ve-slider-22222222-2222-2222-2222-222222222208",
"name": "¿Error de Deslizamiento?"
},
{
"parameters": {
"jsCode": "const solution = $input.first().json.data?.solution || $input.first().json.data || {};\nconst distance = solution.distance || solution.slide_distance || null;\n\nreturn [{ json: {\n éxito: true,\n módulo: 'slider_1',\n distancia: distance,\n unidad: 'píxeles',\n soluciónBruta: solution,\n resueltoEn: new Date().toISOString()\n} }];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [2200, -80],
"id": "ve-slider-22222222-2222-2222-2222-222222222209",
"name": "Formatear Solución"
},
{
"parameters": {
"jsCode": "return [{ json: {\n éxito: false,\n error: $input.first().json.error || 'Error desconocido del Motor de Visión',\n resueltoEn: new Date().toISOString()\n} }];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [2200, 120],
"id": "ve-slider-22222222-2222-2222-2222-222222222210",
{
"name": "Error de formato"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [2500, -80],
"id": "ve-slider-22222222-2222-2222-2222-222222222211",
"name": "Devolver Resultado"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json) }}",
"options": {
"responseCode": 400
}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [2500, 120],
"id": "ve-slider-22222222-2222-2222-2222-222222222212",
"name": "Devolver Error"
}
],
"connections": {
"Every 1 Hour": {
"main": [
[
{
"node": "Set Puzzle Config",
"type": "main",
"index": 0
}
]
]
},
"Webhook Trigger": {
"main": [
[
{
"node": "Set Puzzle Config",
"type": "main",
"index": 0
}
]
]
},
"Set Puzzle Config": {
"main": [
[
{
"node": "Fetch Puzzle Image",
"type": "main",
"index": 0
}
]
]
},
"Fetch Puzzle Image": {
"main": [
[
{
"node": "Fetch Background Image",
"type": "main",
"index": 0
}
]
]
},
"Fetch Background Image": {
"main": [
[
{
"node": "Convert Images to Base64",
"type": "main",
"index": 0
}
]
]
},
"Convert Images to Base64": {
"main": [
[
{
"node": "Solve Slider Puzzle",
"type": "main",
"index": 0
}
]
]
},
"Solve Slider Puzzle": {
"main": [
[
{
"node": "Slider Error?",
"type": "main",
"index": 0
}
]
]
},
"Slider Error?": {
"main": [
[
{
"node": "Format Error",
"type": "main",
"index": 0
}
],
[
{
"node": "Format Solution",
"type": "main",
"index": 0
}
]
]
},
"Format Solution": {
"main": [
[
{
"node": "Return Result",
"type": "main",
"index": 0
}
]
]
},
"Format Error": {
"main": [
[
{
"node": "Return Error",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
}
}
``
---
## Prueba
### Prueba de la API del Solucionador
Una vez que haya configurado las credenciales de CapSolver y activado el flujo de trabajo, pruebe la API del Solucionador:
**Puzzle de deslizamiento:**
```bash
curl -X POST https://your-n8n-instance.com/webhook/vision-engine-solver \
-H "Content-Type: application/json" \
-d '{
"module": "slider_1",
"image": "BASE64_PUZZLE_PIECE_HERE",
"imageBackground": "BASE64_BACKGROUND_HERE"
}'
Puzzle de rotación:
curl -X POST https://your-n8n-instance.com/webhook/vision-engine-solver \
-H "Content-Type: application/json" \
-d '{
"module": "rotate_1",
"image": "BASE64_IMAGE_TO_ROTATE"
}'
Selección de objetos (shein):
curl -X POST https://your-n8n-instance.com/webhook/vision-engine-solver \
-H "Content-Type: application/json" \
-d '{
"module": "shein",
"image": "BASE64_IMAGE",
"question": "Seleccionar todos los zapatos"
}'
OCR de GIF:
curl -X POST https://your-n8n-instance.com/webhook/vision-engine-solver \
-H "Content-Type: application/json" \
-d '{
"module": "ocr_gif",
"image": "BASE64_GIF_DATA"
}'
curl -X POST https://your-n8n-instance.com/webhook/slider-puzzle-solver \
-H "Content-Type: application/json" \
-d '{
"puzzleImageURL": "https://example.com/captcha/puzzle-piece.png",
"backgroundImageURL": "https://example.com/captcha/background.png",
"websiteURL": "https://example.com"
}'
Una respuesta con un valor numérico distance confirma que todo el pipeline funcionó correctamente: las imágenes se descargaron, se convirtieron a base64, el Engine de Visión resolvió el deslizamiento y se devolvió la distancia en píxeles.
El Engine de Visión devuelve formas de solución diferentes según el módulo:
{
"solution": {
"distance": 142
}
}
La distance está en píxeles: es la distancia que debe arrastrarse la palanca del deslizador hacia la derecha para completar el puzzle.
{
"solution": {
"angle": 73
}
}
El angle está en grados: es la cantidad en que debe rotarse la imagen (en sentido horario) para alcanzar la orientación correcta.
{
"solution": {
"rects": [
{ "x1": 45, "y1": 120, "x2": 180, "y2": 250 },
{ "x1": 300, "y1": 90, "x2": 420, "y2": 210 }
]
}
}
Cada rect en la matriz es un rectángulo de contorno (coordenadas de esquina superior izquierda y esquina inferior derecha) para un área coincidente en la imagen.
{
"solution": {
"text": "x7Km9"
}
}
El text es la cadena reconocida del GIF animado.
El flujo de trabajo de la API del Solucionador ya admite los cinco módulos a través del cuerpo de la solicitud. Para construir un flujo de trabajo dedicado para un módulo diferente, por ejemplo, rotate_1 para puzzles de rotación, los cambios son mínimos:
puzzleImageURL / backgroundImageURL con solo la URL de la imagen de rotaciónrotate_1)module a rotate_1angle en lugar de distancePara shein, también se agregaría el parámetro question al nodo de configuración y se pasaría al nodo de CapSolver.
La cadena base64 está mal formada o vacía. Verifique que:
data:image/...;base64,El valor de module no coincide con ningún modelo compatible. Use exactamente uno de: slider_1, rotate_1, rotate_2, shein, ocr_gif.
Las imágenes podrían no ser un par válido de puzzle de deslizamiento. Verifique que:
image sea la pieza del puzzle (el fragmento pequeño que se arrastra)imageBackground sea el fondo completo con la ranura visibleAsegúrese de tener la versión 1.x o posterior de n8n-nodes-capsolver. La operación Engine de Visión se agregó en versiones recientes. Actualice el nodo de la comunidad si es necesario:
n8n-nodes-capsolverEl flujo de trabajo debe estar activo para que el webhook esté en línea. Importe el flujo de trabajo, configure las credenciales y active el flujo de trabajo en n8n.
Use cadenas base64 sin procesar — siempre elimine el prefijo data:image/...;base64, antes de pasar las imágenes al nodo CapSolver.
Asegúrese de que las imágenes coincidan con los módulos — slider_1 necesita tanto image como imageBackground. rotate_1 necesita solo image. shein necesita image más question. Usar combinaciones incorrectas fallará o devolverá resultados incorrectos.
Obtenga imágenes frescas — las imágenes de puzzles visuales suelen ser de uso único y expiran rápidamente. Úselas lo más cercano posible al momento de resolver.
El Engine de Visión es instantáneo — a diferencia de las operaciones de Token que realizan búsquedas por resultados, las operaciones de Reconocimiento devuelven resultados de inmediato. Su flujo de trabajo no necesita lógica de reintentos o retrasos.
No se necesita proxy — el Engine de Visión analiza las imágenes en el servidor. No hay interacción con un sitio de destino, por lo que no se necesita proxy.
Valide antes de resolver — verifique que los datos de imagen estén presentes y que el nombre del módulo sea válido antes de llamar al nodo CapSolver. Esto evita gastar créditos de API en solicitudes que fallarán.
Use websiteURL cuando esté disponible — aunque es opcional, proporcionar la URL de la página de origen puede mejorar la precisión para algunos tipos de puzzles.
Maneje respuestas específicas del módulo — diferentes módulos devuelven campos diferentes (distance, angle, rects, text). Su lógica posterior debe verificar qué módulo se usó y extraer el campo correcto.
¿Listo para comenzar? Regístrese en CapSolver y use el código de bonificación n8n para obtener un 8% adicional en su primer recarga!

El Engine de Visión cubre un espacio diferente que las operaciones de Token de CapSolver. Mientras que la resolución de reCAPTCHA, Turnstile y Cloudflare Challenge devuelve tokens que usted envía para pasar una barrera, el Engine de Visión devuelve mediciones que su automatización usa para interactuar con puzzles visuales — arrastrar deslizadores, rotar imágenes, seleccionar objetos o leer texto animado.
Las diferencias clave a recordar son:
Los dos flujos de trabajo en este artículo cubren los dos patrones de integración más comunes:
Ambos se importan como inactivos. Configure su credencial de CapSolver, reemplace los valores de marcador de posición, active el flujo de trabajo y pruebe.
OCR reconoce caracteres en una imagen estática: reconocimiento óptico estándar. El Engine de Visión va más allá: entiende relaciones espaciales en puzzles visuales. Puede calcular distancias de deslizadores, ángulos de rotación, cuadros de contorno de objetos y hasta leer texto de GIFs animados. Ambos son operaciones de Reconocimiento (resultado instantáneo, sin búsquedas), pero resuelven problemas diferentes.
No. El Engine de Visión analiza las imágenes que usted le proporciona en el servidor. No hay sesión de navegador, no hay cookies y no hay interacción con un sitio de destino. Los proxies no se necesitan y el nodo CapSolver no acepta un parámetro de proxy para tareas del Engine de Visión.
Sí. El nodo CapSolver procesa un elemento a la vez, pero la ejecución basada en elementos de n8n le permite pasar múltiples elementos al nodo. Cada elemento obtiene una llamada de Reconocimiento y devuelve su propia solución. Use un nodo de Dividir en Lotes o alimente múltiples elementos desde un nodo de Código.
Los campos image y imageBackground aceptan cadenas base64 codificadas en JPEG, PNG, GIF y WebP. La cadena base64 debe ser cruda — sin prefijo data:image/...;base64, ni saltos de línea.
En una integración real de puzzle de deslizamiento, el sitio objetivo sirve las imágenes de puzzle como parte de la respuesta del desafío. Normalmente usted:
El flujo de trabajo del Solucionador de Puzzles de Deslizamiento muestra los pasos 3-5. Los pasos 1-2 dependen del sitio específico.
question?El parámetro question solo se usa con el módulo shein. Le dice a la IA qué buscar en la imagen — por ejemplo, "Seleccionar todos los zapatos" o "Tocar los elementos coincidentes". Para todos los demás módulos, deje este campo vacío.
Los módulos del Engine de Visión (slider_1, rotate_1, rotate_2, shein, ocr_gif) están diseñados para tipos específicos de puzzles visuales. Los desafíos de clasificación de imagen de hCaptcha usan un enfoque diferente. Consulte la documentación de CapSolver para soluciones específicas de hCaptcha.
El Engine de Visión es una operación de Reconocimiento, lo que significa que el resultado llega en una sola llamada de API — típicamente en menos de 2 segundos. No hay bucles de búsqueda, no hay llamadas a getTaskResult y no hay tiempos de espera. Esto lo hace significativamente más rápido que las operaciones de Token, que pueden tomar 10-30 segundos para completarse.
Imágenes muy pequeñas pueden no contener suficiente detalle para un análisis preciso. Imágenes muy grandes aumentarán el tamaño del payload base64 y podrían ralentizar la solicitud. Para mejores resultados, use la resolución original proporcionada por el desafío de CAPTCHA — no redimensione las imágenes.
Sí, y ese es el caso de uso previsto para la mayoría de las aplicaciones reales. El flujo típico es:
El flujo de trabajo del Engine de Visión maneja los pasos 3-4. Los pasos 1-2 y 5 se manejan por sus nodos de automatización de navegador.
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.
