logo
bars

TenDI (Tencent) CAPTCHA
y CapMonster Cloud

Resolución de captchas, integració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 TenDI (Tencent), 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 TenDI (Tencent) 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 TenDI CAPTCHA
Qué es TenDI CAPTCHA
TenDI (Tencent) CAPTCHA es un sistema de protección contra bots de múltiples niveles. Mediante análisis de comportamiento y mecanismos especializados, determina si un visitante del sitio web es un ser humano real. Se utiliza para proteger registros, inicios de sesión, campañas de marketing y prevenir spam y robo de datos.
Background
Ejemplos de TenDI (Tencent)
Non-perception CAPTCHA
Non-perception CAPTCHA
La verificación se realiza automáticamente sin interacción del usuario. Ideal para escenarios donde la usabilidad es crítica.
Slider CAPTCHA
Slider CAPTCHA
Verificación rápida y sencilla mediante el deslizamiento de un control. Adecuado para la mayoría de los casos.
Graphic CAPTCHA
Graphic CAPTCHA
El usuario hace clic de manera secuencial en los elementos de la imagen. Se usa en escenarios de alta seguridad.
Audio CAPTCHA
Audio CAPTCHA
Verificación mediante grabación de audio. Óptimo para usuarios con discapacidades.
Smart Verification
Smart Verification
El sistema evalúa el comportamiento del usuario: los confiables pasan inmediatamente y los sospechosos se verifican adicionalmente.
Multi-dimensional Defense
Multi-dimensional Defense
Se utilizan múltiples mecanismos de protección: cifrado dinámico, anti-bot y otros.

Cómo resolver Tencent CAPTCHA usando CapMonster Cloud

Al probar formularios con Tencent CAPTCHA, a menudo es necesario verificar que el captcha funciona correctamente y está correctamente integrado.
Puede probar manualmente el captcha integrado en su sitio web:
  • Abra la página con el formulario y asegúrese de que se muestre el captcha.
  • 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 el reconocimiento automático de captchas, puede usar servicios especializados como CapMonster Cloud, una herramienta que acepta parámetros de captcha, los procesa en sus servidores y devuelve un token listo para usar. Este token se puede insertar en el formulario para pasar la verificación sin interacció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 TenDI (Tencent) CAPTCHA usando bibliotecas listas
CapMonster Cloud proporciona bibliotecas listas para una integración cómoda en Python, JavaScript (Node.js) y C#.
Python
JavaScript
C#
Resolución, inserción de token y envío del formulario
Ejemplo en Node.js para el ciclo completo de resolución de captcha en su página web. Enfoques posibles: usar solicitudes HTTP para obtener HTML y parámetros de protección, enviar la respuesta y procesar el resultado. O, como en el ejemplo siguiente, usar herramientas de automatización (p. ej., Playwright): abrir la página, esperar la verificación, enviar los parámetros a través del cliente CapMonster Cloud, recibir el resultado, insertar el token en el formulario (para pruebas se pueden usar datos correctos o incorrectos) y observar el resultado.

// npx playwright install chromium

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

// Reemplace con sus propios valores
const API_KEY = "YOUR_API_KEY";         
const WEBSITE_URL = "https://example.com";

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

    // 1. Abrir la página
    await page.goto(WEBSITE_URL, { waitUntil: 'networkidle' });

    // 2. Esperar a que aparezca el captcha (por ejemplo, input o iframe)
    await page.waitForSelector('#tendi_response, iframe[src*="tendi"], input[name="tendi_response"]', { timeout: 15000 });

    // Si es necesario, se puede extraer el websiteKey directamente de la página
    const WEBSITE_KEY = await page.evaluate(() => {
        // Ejemplo: el sitekey puede estar en un atributo data o en una variable global
        const el = document.querySelector('#tendi_response') || document.querySelector('div[data-sitekey]');
        return el?.getAttribute('data-sitekey') || window.TenDI_siteKey || "183268248";
    });

    console.log("Website key detected:", WEBSITE_KEY);

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

    // 3. Crear una tarea TenDI
    const tenDIRequest = new TenDIRequest({
        websiteURL: page.url(),
        websiteKey: WEBSITE_KEY,
    });

    const balance = await client.getBalance();
    console.log("Balance:", balance);

    // 4. Resolver el captcha
    const solution = await client.Solve(tenDIRequest);
    console.log("Solution:", solution);

    const { ticket, randstr } = solution.solution.data;

    // 5. Formas de insertar el resultado
    await page.evaluate(({ ticket, randstr }) => {
        // Insertar en un campo input
        const inputSelectors = ['#tendi_response', 'input[name="tendi_response"]', 'input[type="hidden"]'];
        let inserted = false;
        for (const sel of inputSelectors) {
            const input = document.querySelector(sel);
            if (input) {
                input.value = ticket;
                input.dispatchEvent(new Event('input', { bubbles: true }));
                const form = input.closest('form');
                if (form) form.submit();
                inserted = true;
                break;
            }
        }

        // Función callback en JS
        if (typeof window.onCaptchaSolved === 'function') {
            window.onCaptchaSolved(ticket, randstr);
            inserted = true;
        }

        // Si no hay input ni callback
        if (!inserted) {
            window._tenDITicket = ticket;
            window._tenDIRandStr = randstr;
            console.log("Ticket and randstr saved to window._tenDITicket and window._tenDIRandStr");
        }
    }, { ticket, randstr });

    await page.waitForTimeout(5000);
    await browser.close();
}

solveTenDIOnPage().catch(console.error);
  
Cómo integrar TenDI (Tencent) CAPTCHA en su sitio web
Para entender cómo funciona el captcha en su sitio, comprender la lógica de verificación, re-integrarlo o reconfigurarlo, le recomendamos revisar esta sección. Describe todo el proceso de integración y ayuda a comprender todos los detalles rápidamente.
  • 1. Inicie sesión en su cuenta o cree una nueva en Captcha Console.
  • 2. Abra la sección Verification Management.
  • 3. Cree un nuevo captcha (si aún no existe).

Recibirá dos parámetros: CaptchaAppId y AppSecretKey. Se usan en el frontend y en el servidor.

Ejemplo de integración frontendEjemplo de integración frontend
arrow

Cómo funciona la integración

Paso 1: Cargar el JavaScript del captcha

El script debe cargarse dinámicamente:

<script src="https://ca.turing.captcha.qcloud.com/TJNCaptcha-global.js"></script>

Si el script se carga de forma no estándar o se cachea, el captcha puede funcionar incorrectamente.

Paso 2: Crear un objeto TencentCaptcha

Después de cargar el JS, estará disponible una clase global:

<script src="new TencentCaptcha(domElement, CaptchaAppId, callback, options);"></script>

Parámetros:

domElement - Contenedor donde se incrusta el checkbox/iframe

CaptchaAppId - Su ID

callback - Acción después de la verificación

options - Configuración visual (opcional)

Paso 3: Llamar al método .show()

captcha.show();

Muestra el captcha. Se puede llamar varias veces.

Paso 4: Procesar el resultado

El callback recibe un objeto:


{
  ret: 0,              // 0 -- éxito, 2 -- usuario cerró la ventana
  ticket: "...",       // requerido por el servidor
  randstr: "...",      // también requerido por el servidor
  errorCode: 1001,     // si el captcha no se cargó
  errorMessage: "..."  // mensaje de error
}

En el servidor siempre se debe realizar una verificación secundaria del ticket.

Modo "Recuperación ante Desastres"

Si el captcha no se carga (por ejemplo, si el CDN no está disponible), se puede emitir automáticamente un ticket de emergencia para no interrumpir los procesos de negocio.

Escenario:

  • Intento de crear captcha → error.
  • Llamar a loadErrorCallback().
  • Generar ticket en el formato:
    trerror_<errorcode>_<appid>_<timestamp>
  • Continuar el procesamiento como de costumbre, pero el servidor reconoce que es un ticket de emergencia y decide qué hacer.

Cifrado de AppId (opcional)

Si se requiere protección máxima, puede pasar a la captcha una versión cifrada del AppId en lugar del original:

aidEncrypted = Base64(IV + AES256(AppId & timestamp & ttl))

Requerido:

  • Clave de 32 bytes (AppSecretKey → rellenada hasta 32 bytes)
  • AES-256 CBC + PKCS7Padding
  • IV de 16 bytes
  • timestamp y tiempo de validez en segundos

Ejemplo de cifrado en el servidor (Python)


from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import base64

def encrypt(plaintext, key, iv):
    cipher = AES.new(key, AES.MODE_CBC, iv)
    ciphertext = cipher.encrypt(pad(plaintext.encode(), AES.block_size))
    return base64.b64encode(iv + ciphertext).decode("utf-8")

Validación del servidor

Paso 1. Configurar acceso API

En el panel de gestión de claves (CAM / API Key Management), obtenga SecretId y SecretKey para la API. Estas claves son necesarias para solicitudes API firmadas.

Paso 2. Llamar a la API DescribeCaptchaResult

Después de que el cliente devuelva ticket y randstr, el servidor debe enviar la siguiente solicitud:

  • Action: DescribeCaptchaResult
  • Version: 2019-07-22 (o la versión actual)

Parámetros:

CaptchaType - 9 (valor fijo)

Ticket - cadena — ticket devuelta por el cliente

Randstr - cadena — randstr devuelta por el cliente

CaptchaAppId - su AppId

AppSecretKey - su clave secreta

UserIp - IP del usuario (recomendado)

Paso 3. Procesar la respuesta

La API devuelve:

  • CaptchaCode: integerresultado de la verificación.
  • 0 (o OK) — captcha pasada, ticket válido

Si CaptchaCode === OK, el usuario se considera verificado. De lo contrario, rechazar.

Ejemplo — verificación del ticket en Node.js


import { v20190722 as captcha } from "@tencentcloud/tencentcloud-sdk-nodejs";
const client = new captcha.Client({
  credential: {
    secretId: "YOUR_SECRET_ID",
    secretKey: "YOUR_SECRET_KEY"
  },
  region: "ap-project", // región, si es necesario
});

async function verifyCaptcha(ticket, randstr, userIp) {
  const params = {
    CaptchaType: 9,
    Ticket: ticket,
    Randstr: randstr,
    CaptchaAppId: YOUR_APP_ID,
    AppSecretKey: "YOUR_APP_SECRET_KEY",
    UserIp: userIp
  };

  const resp = await client.DescribeCaptchaResult(params);
  const code = resp.Response.CaptchaCode;
  return code === 0;
}
HelpIcon

Puede encontrar más información sobre cómo integrar Tencent CAPTCHA en su sitio web en la documentación oficial.

Background
Posibles errores y depuración
Bug Icon
Captcha no se carga
(Errores 1001, 1002 o mensaje de firma no válida) — la causa puede ser parámetros de solicitud incorrectos. Asegúrese de que CaptchaAppId, AppSecretKey y todos los parámetros de la solicitud estén especificados correctamente.
Bug Icon
ticket/randstr inválido o vacío
Asegúrese de que el cliente pase correctamente ambos parámetros.
Bug Icon
Tiempo de resolución agotado
Aumente el tiempo de espera en el servidor.
Pruebas de resistencia de la protección
Después de la integración, es importante asegurarse de que la protección funcione correctamente.
Consejos de seguridad y optimización
Almacene <b>AppSecretKey</b> solo en el servidor, no lo exponga al navegador ni lo incluya en código JavaScript.
Registre las respuestas completas de Tencent CAPTCHA, incluyendo códigos de error, tiempo de solicitud y parámetros de validación — esto ayudará a diagnosticar problemas más rápido.
Use HTTPS al transmitir todos los parámetros <b>(ticket, randstr)</b> para evitar manipulaciones.
Coloque enlaces correctos a la <b>Política de Privacidad</b> y a los <b>Términos de Servicio de Tencent</b> en la página, como requiere la licencia.
Conclusión

Si has heredado un sitio web que ya tiene un captcha u otro sistema de protección instalado y no tienes acceso al código, no pasa nada. Identificar qué tecnología se está utilizando es bastante sencillo. Para comprobar que todo funciona correctamente, puedes usar el servicio de reconocimiento CapMonster Cloud en un entorno de pruebas aislado, para asegurarte de que el mecanismo de procesamiento de tokens y la lógica de verificación funcionan correctamente.

En el caso de TenDI (Tencent), basta con detectar el sistema, analizar su comportamiento y confirmar que la protección funciona correctamente. En el artículo hemos mostrado cómo identificar TenDI (Tencent) y dónde encontrar las instrucciones para su integración o reconfiguración, de modo que puedas mantener la protección con confianza y controlar su funcionamiento.

Conclusion
Enlaces útiles
DocIconDocumentación TenDI (Tencent) CAPTCHADocIconDocumentación CapMonster Cloud (trabajo con Tencent CAPTCHA)DocIconQué es Tencent Captcha (TenDI) y cómo resolverla