logo
bars

CAPTCHA con Imágenes (ComplexImage)
y CapMonster Cloud

Resolución de CAPTCHA, instalación en el sitio web y pruebas.
¿Heredaste un sitio con una captcha u otra capa de protección pero sin acceso al código fuente? Entonces es normal preguntarse: ¿qué solución está instalada, está configurada correctamente y cómo se puede probar?

En este artículo hemos intentado responder a todas las preguntas clave. Para empezar a resolver la tarea, primero hay que determinar qué sistema de protección se está utilizando. Para ello, puedes consultar la lista de captchas y sistemas de protección antibot más populares, donde se muestran ejemplos visuales y señales clave que te ayudarán a identificar rápidamente con qué estás tratando.

Si descubres que tu sitio web utiliza ComplexImage, el siguiente paso será analizar con más detalle sus propiedades y su funcionamiento. En este mismo artículo también puedes consultar la guía de integración de ComplexImage para comprender por completo cómo funciona en tu sitio. Esto te permitirá no solo entender la protección actual, sino también planificar correctamente su mantenimiento.

Qué es un CAPTCHA de imágenes
Qué es un CAPTCHA de imágenes
Un CAPTCHA de imágenes es un tipo de CAPTCHA visual en el que el usuario debe realizar una tarea relacionada con el análisis de imágenes. Normalmente, el sistema solicita seleccionar imágenes que cumplan una condición, contar objetos, identificar la posición correcta de un elemento u realizar otra acción visual. A diferencia de los CAPTCHAs de texto, donde solo se deben ingresar caracteres de una imagen, los CAPTCHAs de imágenes verifican la capacidad del usuario para interpretar información visual y realizar acciones lógicas. Esto los hace más difíciles de reconocer automáticamente y más efectivos para proteger formularios de registro, inicio de sesión y otros puntos críticos del sitio de los bots.

Cómo resolver un CAPTCHA de imágenes usando CapMonster Cloud

Al probar formularios con Tencent CAPTCHA, a menudo es necesario verificar que el CAPTCHA funcione correctamente y esté integrado correctamente.
Puede probar manualmente el CAPTCHA en su sitio web:
  • Abra la página con el formulario y asegúrese de que el CAPTCHA se muestre.
  • Intente enviar el formulario sin resolver el CAPTCHA: el servidor debería devolver un error.
  • Después de resolver correctamente el CAPTCHA, el formulario debería enviarse sin errores.
Para resolver automáticamente el CAPTCHA, puede usar servicios especializados como CapMonster Cloud, una herramienta que recibe los parámetros del CAPTCHA, los procesa en sus servidores y devuelve la solución lista, por ejemplo, números o coordenadas de clics que se pueden usar para pasar la verificación sin la participación del usuario.

Trabajar con CapMonster Cloud mediante la API suele implicar los siguientes pasos:

Creación de la tareaCreación de la tarea
arrow
Enviar una solicitud APIEnviar una solicitud API
arrow
Recepción del resultadoRecepción del resultado
arrow
Colocar el token en la páginaColocar el token en la página
arrow
Reconocimiento de CAPTCHA de imágenes usando bibliotecas listas para usar
El servicio CapMonster Cloud proporciona bibliotecas listas para usar en Python, JavaScript (Node.js) y C#.
Python
JavaScript
C#
Insertar solución y enviar formulario
Ejemplo en Node.js para un ciclo completo de reconocimiento de CAPTCHA en su página web. Enfoques posibles: usar solicitudes HTTP para obtener HTML y parámetros del sistema de protección, enviar la respuesta y procesar el resultado. O, como en el ejemplo, usar herramientas de automatización (como Playwright): abrir la página, esperar la verificación, enviar parámetros a través del cliente de CapMonster Cloud, recibir el resultado, insertarlo en el campo correspondiente (para pruebas se pueden usar datos correctos o incorrectos) y observar el resultado.

// npm install playwright @zennolab_com/capmonstercloud-client
// npx playwright install chromium

import { chromium } from 'playwright';
import { CapMonsterCloudClientFactory, ClientOptions, ComplexImageTaskRecognitionRequest } from '@zennolab_com/capmonstercloud-client';

const API_KEY = "YOUR_API_KEY";
const TARGET_URL = "https://example.com/captcha-page";

async function solveComplexImageTaskPlaywright() {
    const browser = await chromium.launch({ headless: false });
    const context = await browser.newContext();
    const page = await context.newPage();
    await page.goto(TARGET_URL);

    // Localizar la imagen del CAPTCHA
    const captchaHandle = await page.$('#captcha'); // reemplace con el selector real
    const captchaBase64 = await captchaHandle.evaluate(img => {
        const canvas = document.createElement('canvas');
        canvas.width = img.width;
        canvas.height = img.height;
        const ctx = canvas.getContext('2d');
        ctx.drawImage(img, 0, 0);
        return canvas.toDataURL('image/png').split(',')[1];
    });

    console.log("Captcha base64:", captchaBase64.substring(0, 50) + "...");

    const cmcClient = CapMonsterCloudClientFactory.Create(
        new ClientOptions({ clientKey: API_KEY })
    );

    // Enviar CAPTCHA para reconocimiento
    const citRecognitionRequest = new ComplexImageTaskRecognitionRequest({
        imagesBase64: [captchaBase64],
        metaData: { Task: 'oocl_rotate' } // reemplace con su tipo de CAPTCHA
    });

    const result = await cmcClient.Solve(citRecognitionRequest);
    console.log("Solution received:", result);

    // Procesar la solución
    const solution = result.solution;

    if (!solution) {
        console.error("No solution received");
        return;
    }

    if (solution.metadata?.AnswerType === "Coordinate") {
        // CAPTCHA con coordenadas
        const box = await captchaHandle.boundingBox();
        for (const point of solution.answer) {
            const clickX = box.x + point.X;
            const clickY = box.y + point.Y;
            console.log(`Clicking at: (${clickX}, ${clickY})`);
            await page.mouse.click(clickX, clickY);
        }
    } else if (solution.metadata?.AnswerType === "Grid") {
        // CAPTCHA de cuadrícula (array true/false)
        const box = await captchaHandle.boundingBox();
        const gridItems = await page.$$('#captcha_grid div'); // reemplace con los selectores de los elementos de la cuadrícula
        const answers = solution.answer;

        for (let i = 0; i < answers.length; i++) {
            if (answers[i] && gridItems[i]) {
                const itemBox = await gridItems[i].boundingBox();
                const clickX = itemBox.x + itemBox.width / 2;
                const clickY = itemBox.y + itemBox.height / 2;
                console.log(`Clicking grid item ${i} at: (${clickX}, ${clickY})`);
                await page.mouse.click(clickX, clickY);
            }
        }
    } else {
        console.warn("Unknown captcha solution type:", solution.metadata?.AnswerType);
    }

    // Hacer clic en el botón de confirmación (si lo hay)
    await page.click('#submit_button'); // reemplace con el selector real del botón

    console.log("Captcha solved.");
}

solveComplexImageTaskPlaywright().catch(console.error);
  
Cómo integrar un CAPTCHA de imágenes en su sitio web
Para comprender cómo funciona el CAPTCHA en su sitio, verificar la lógica o reconfigurarlo, recomendamos esta sección. Describe el proceso general de integración de la protección, lo que ayuda a entender rápidamente todos los detalles.

1. Generación de CAPTCHA en el servidor.

  • Se crea una imagen CAPTCHA: una imagen o cuadrícula de imágenes.
  • Se añaden ruido, distorsiones y elementos aleatorios para proteger contra bots.
  • Se genera un captchaId único y se almacena la solución correcta (en memoria, base de datos o caché).

2. Enviar CAPTCHA al cliente

  • El servidor envía al cliente captchaId y la imagen (Base64 o URL).
  • El cliente muestra el CAPTCHA, por ejemplo con <img> o cuadrícula <div> con instrucciones.
Ejemplo de parte cliente (HTML + JS)Ejemplo de parte cliente (HTML + JS)
arrow

3. Ingreso de la respuesta por el usuario

  • El usuario ingresa texto, hace clic en imágenes o rota objetos.
  • El cliente forma la respuesta en la estructura adecuada:
    • CAPTCHA de texto → cadena
    • Cuadrícula → array true/false
    • Coordenadas → array de {X, Y}

4. Enviar respuesta al servidor:

  • El cliente envía POST con captchaId y respuesta (answer).
  • Opcionalmente, se puede enviar token de sesión para evitar repetición.

5. Verificación en el servidor

  • El servidor busca la sesión de CAPTCHA por captchaId.
  • Compara la respuesta del usuario con la solución correcta.
  • Devuelve success: true/false.
  • Si falla, se puede actualizar el CAPTCHA.
Ejemplo de servidorEjemplo de servidor
arrow

6. Pasos siguientes

  • CAPTCHA exitosa → se permite el proceso protegido (formulario, registro, etc.).
  • CAPTCHA fallida → se emite una nueva, opcionalmente limitando los intentos.

Adicionalmente

  • Use TTL (tiempo de vida) para las sesiones de CAPTCHA, para que expiren automáticamente.
  • Cache imágenes y use URLs temporales para ahorrar recursos.
  • Asegure el correcto funcionamiento de clics y toques en dispositivos móviles.
  • Lleve registros y análisis para mejorar la experiencia del usuario y la protección contra bots.
Background
Posibles errores y depuración
Bug Icon
CAPTCHA de imágenes no se carga
(Cuadrícula vacía, imágenes rotas, errores 404/500, problemas con base64) — verifica que el servidor genere correctamente las imágenes, que los datos base64 no estén dañados, que el formato de imagen sea compatible con el navegador y que el cliente reciba un captchaId válido.
Bug Icon
Los clics del usuario no se procesan
(Las celdas no se seleccionan o la respuesta está vacía) — asegúrate de que las coordenadas o índices de los clics se envíen al servidor, que los datos se serialicen correctamente y que se admitan eventos táctiles en dispositivos móviles.
Bug Icon
El captcha no se valida con clics correctos
Comprueba que el captcha no se regenere antes de la validación, que la respuesta correcta se almacene por separado para cada sesión, que el formato de la respuesta sea el esperado y que el TTL del captcha no haya expirado.
Bug Icon
CAPTCHA expirada
Si el usuario tarda mucho, aumente la TTL, actualice el CAPTCHA en reintento e informe al usuario de recargar imágenes.
Pruebas de resistencia de la protección
Después de la integración, asegúrate de que el sistema realmente proteja el sitio contra acciones automatizadas.
Consejos de seguridad y optimización
Almacene la respuesta correcta <b>solo en el servidor</b> (memoria, Redis o base de datos), nunca en el cliente.
Use identificadores de CAPTCHA de un solo uso (<b>captchaId</b>).
Limite la cantidad de intentos por CAPTCHA.
Siempre use <b>HTTPS</b> para transmitir imágenes y clics.
Cache imágenes y use <b>URLs temporales</b> si es posible.
Registre errores de generación y verificación (hora, IP/fingerprint, razón de rechazo).
Actualice regularmente la mecánica del CAPTCHA (conjuntos de imágenes, tamaño/estructura de cuadrícula, tipos de tareas).
Conclusión

Si encuentra un sitio con CAPTCHA ya instalado u otro sistema de protección y no tiene acceso al código — ¡no hay problema! Es fácil identificar la tecnología utilizada. Para verificar el funcionamiento, puede usar CapMonster Cloud en un entorno de prueba aislado y asegurarse de que el procesamiento de tokens y la lógica funcionen correctamente.

Con CAPTCHA de imágenes basta con identificar el sistema, estudiar su comportamiento y asegurarse de que la protección funcione. En este artículo mostramos cómo reconocer CAPTCHA de imágenes (ComplexImage) y cómo integrarla o reconfigurarla para mantener la protección y controlarla de manera confiable.

Conclusion
Enlaces útiles
DocIconDocumentación de CapMonster Cloud (ComplexImage)DocIconGuía para crear su propio CAPTCHADocIconRegistro en el servicio CapMonster Cloud