logo
bars

TenDI (Tencent) CAPTCHA
e CapMonster Cloud

Solução de captcha, instalação no site e testes.
Herdou um site com captcha ou outra proteção mas sem acesso ao código-fonte? É natural perguntar qual solução está instalada, se está configurada corretamente e como testá-la.

Neste artigo procurámos responder a todas as questões importantes. Para começar a resolver o problema, o primeiro passo é identificar que sistema de proteção está a ser utilizado. Para isso, pode consultar a lista de captchas e sistemas de proteção antibot mais populares, onde encontrará exemplos visuais e sinais principais que ajudam a perceber rapidamente com o que está a lidar.

Se verificar que o seu site utiliza TenDI (Tencent), o passo seguinte é analisar mais detalhadamente as suas características e o seu funcionamento. Neste mesmo artigo também pode consultar o guia de integração de TenDI (Tencent), para compreender totalmente como o sistema funciona no seu site. Isto permitirá não só entender a proteção atual, como também planear corretamente a sua manutenção.

O que é TenDI CAPTCHA
O que é TenDI CAPTCHA
TenDI (Tencent) CAPTCHA é um sistema de proteção em múltiplos níveis contra bots. Analisa o comportamento do utilizador e aplica mecanismos especiais para verificar se o visitante do site é humano. Utilizado para proteção de registos, login, campanhas de marketing e prevenção de spam e roubo de dados.
Background
Exemplos de TenDI (Tencent)
Non-perception CAPTCHA
Non-perception CAPTCHA
A verificação é automática, sem intervenção do utilizador. Ideal para cenários onde a conveniência é importante.
Slider CAPTCHA
Slider CAPTCHA
Verificação rápida e simples através do deslizar de um cursor. Adequado para a maioria dos casos.
Graphic CAPTCHA
Graphic CAPTCHA
O utilizador clica sequencialmente nos elementos da imagem. Utilizado em cenários de alta segurança.
Audio CAPTCHA
Audio CAPTCHA
Verificação através de gravação de áudio. Ótimo para utilizadores com necessidades especiais.
Smart Verification
Smart Verification
O sistema avalia o comportamento do utilizador: os confiáveis passam imediatamente, os suspeitos são verificados adicionalmente.
Multi-dimensional Defense
Multi-dimensional Defense
Vários mecanismos de proteção são utilizados: encriptação dinâmica, anti-bot e outros.

Como resolver Tencent CAPTCHA através do CapMonster Cloud

Ao testar formulários com Tencent CAPTCHA, é muitas vezes necessário verificar se o captcha funciona corretamente e está integrado de forma adequada.
Pode testar manualmente o captcha no seu site:
  • Abra a página do formulário e verifique se o captcha é exibido.
  • Tente enviar o formulário sem completar o captcha — o servidor deverá devolver um erro.
  • Após resolver corretamente o captcha, o formulário deve ser enviado sem erros.
Para reconhecimento automático de captcha, pode usar serviços especializados, como o CapMonster Cloud — uma ferramenta que processa os parâmetros do captcha nos seus servidores e devolve um token pronto. Este token pode ser inserido no formulário para passar a verificação sem intervenção do utilizador.

Trabalhar com o CapMonster Cloud através da API normalmente envolve os passos seguintes:

Criação da tarefaCriação da tarefa
arrow
Envio do pedido APIEnvio do pedido API
arrow
Receção do resultadoReceção do resultado
arrow
Aplicação do token na páginaAplicação do token na página
arrow
Reconhecimento TenDI (Tencent) CAPTCHA usando bibliotecas prontas
O CapMonster Cloud fornece bibliotecas prontas para uso em Python, JavaScript (Node.js) e C#.
Python
JavaScript
C#
Resolução, inserção de token e envio do formulário
Exemplo em Node.js para o ciclo completo de reconhecimento de captcha na sua página. Possíveis abordagens: usar pedidos HTTP para obter HTML e parâmetros do sistema de proteção, enviar a resposta e processar o resultado. Ou, como no exemplo abaixo, usar ferramentas de automação (ex.: Playwright) — abrir a página, aguardar a verificação, enviar parâmetros através do cliente CapMonster Cloud, receber o resultado, inserir o token no formulário (para testes pode usar dados corretos ou incorretos) e ver o resultado.

// npx playwright install chromium

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

// Substitua pelos seus 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. Abrimos a página
    await page.goto(WEBSITE_URL, { waitUntil: 'networkidle' });

    // 2. Esperamos que o captcha apareça (ex.: input ou iframe)
    await page.waitForSelector('#tendi_response, iframe[src*="tendi"], input[name="tendi_response"]', { timeout: 15000 });

    // Se necessário, pode extrair websiteKey da página
    const WEBSITE_KEY = await page.evaluate(() => {
        // Exemplo: sitekey pode estar num atributo data ou numa variável 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. Criamos a tarefa TenDI
    const tenDIRequest = new TenDIRequest({
        websiteURL: page.url(),
        websiteKey: WEBSITE_KEY,
    });

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

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

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

    // 5. Formas de inserir o resultado
    await page.evaluate(({ ticket, randstr }) => {
        // Inserção no 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;
            }
        }

        // Função callback JS
        if (typeof window.onCaptchaSolved === 'function') {
            window.onCaptchaSolved(ticket, randstr);
            inserted = true;
        }

        // Se não houver input nem 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);
  
Como ligar TenDI (Tencent) CAPTCHA ao seu site
Para compreender como a captcha funciona no seu site, entender a lógica da verificação e reconectar ou reconfigurar, recomendamos estudar esta seção. Descreve o processo de integração da proteção e ajuda a entender rapidamente todos os detalhes.
  • 1. Entre na sua conta ou crie uma nova em Captcha Console.
  • 2. Abra a secção Verification Management.
  • 3. Crie um novo captcha (se ainda não existir).

Receberá dois parâmetros: CaptchaAppId e AppSecretKey. Serão usados no frontend e no servidor.

Exemplo de integração frontendExemplo de integração frontend
arrow

Como funciona a integração

Passo 1: Carregar o JS da captcha

O script deve ser carregado dinamicamente:

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

Carregamentos não padrão ou caching podem causar funcionamento incorreto da captcha.

Passo 2: Criar o objeto TencentCaptcha

Após carregar o JS, aparece uma classe global:

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

Parâmetros:

domElement - Container onde o checkbox/iframe será inserido

CaptchaAppId - O seu ID

callback - O que fazer após a verificação

options - Configurações visuais (opcional)

Passo 3: Chamar o método .show()

captcha.show();

Mostra a captcha. Pode ser chamado várias vezes.

Passo 4: Processar o resultado

Callback recebe um objeto:


{
  ret: 0,              // 0 -- sucesso, 2 -- utilizador fechou a janela
  ticket: "...",       // necessário pelo servidor
  randstr: "...",      // também necessário pelo servidor
  errorCode: 1001,     // se a captcha não carregou
  errorMessage: "..."  // mensagem de erro
}

No servidor, sempre execute a verificação secundária do ticket.

"Modo de emergência"

Se a captcha não carregar (ex.: CDN indisponível), pode automaticamente gerar um 'ticket de emergência' para não interromper o processo de negócio.

Cenário:

  • Tentativa de criar captcha → erro.
  • Chamamos loadErrorCallback().
  • Geramos ticket do tipo:
    trerror_<errorcode>_<appid>_<timestamp>
  • Continuamos o processamento normalmente, mas o servidor reconhece como ticket de emergência e decide o que fazer.

Criptografia do AppId (opcional)

Para proteção máxima, pode enviar para a captcha uma versão encriptada do AppId em vez da versão aberta:

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

Necessário:

  • Chave de 32 bytes (AppSecretKey → completada para 32 bytes)
  • AES-256 CBC + PKCS7Padding
  • IV de 16 bytes
  • timestamp e validade em segundos

Exemplo de encriptação server-side (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")

Validação no servidor

Passo 1. Configurar acesso à API

No painel de gestão de chaves (CAM / API Key Management), obtenha SecretId e SecretKey para a API. Necessários para pedidos assinados.

Passo 2. Chamar API DescribeCaptchaResult

Após o cliente devolver ticket e randstr, o servidor envia o pedido:

  • Action: DescribeCaptchaResult
  • Version: 2019-07-22 (ou atual)

Parâmetros:

CaptchaType - 9 (valor fixo)

Ticket - string — ticket retornado do cliente

Randstr - string — randstr retornado do cliente

CaptchaAppId - o seu AppId

AppSecretKey - a sua chave secreta

UserIp - IP do utilizador (recomendado)

Passo 3. Processar resposta

A API devolve:

  • CaptchaCode: integerresultado da verificação.
  • 0 (ou OK) — captcha aprovada, ticket válido

Se CaptchaCode === OK, o utilizador é considerado verificado. Caso contrário — rejeitar.

Exemplo — verificação de ticket em 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ão, se necessário
});

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

Mais informações sobre como ligar Tencent CAPTCHA ao seu site podem ser encontradas na documentação oficial.

Background
Possíveis erros e depuração
Bug Icon
Captcha não carrega
(Erros 1001, 1002 ou mensagem de assinatura inválida) — a causa pode ser parâmetros de solicitação incorretos. Certifique-se de que CaptchaAppId, AppSecretKey e todos os parâmetros da solicitação estejam especificados corretamente.
Bug Icon
Ticket/randstr inválido ou vazio
Certifique-se de que o cliente envia ambos os parâmetros corretamente.
Bug Icon
Timeout da resolução
Aumente o tempo de espera no servidor.
Verificações de robustez
Após a integração, é importante garantir que a proteção funciona corretamente.
Recomendações de segurança e otimização
Guarde o <b>AppSecretKey</b> apenas no servidor, não envie para o navegador e não inclua no código JS.
Registe respostas completas do Tencent CAPTCHA, incluindo código de erro, hora do pedido e parâmetros de validação — ajuda a diagnosticar problemas mais rapidamente.
Use HTTPS ao enviar todos os parâmetros <b>(ticket, randstr)</b> para evitar falsificações.
Coloque links corretos para a <b>Política de Privacidade</b> e os <b>Termos de Uso da Tencent</b> na página, conforme exigido pela licença.
Conclusão

Se herdou um site que já tem um captcha ou outro sistema de proteção instalado e não tem acesso ao código, não há problema! É bastante fácil identificar qual a tecnologia que está a ser utilizada. Para verificar se tudo está a funcionar corretamente, pode usar o serviço de reconhecimento CapMonster Cloud num ambiente de teste isolado, para garantir que o mecanismo de processamento de tokens e a lógica de verificação estão a funcionar corretamente.

No caso de TenDI (Tencent), basta identificar o sistema, analisar o seu comportamento e confirmar que a proteção está a funcionar corretamente. No artigo, mostramos como identificar TenDI (Tencent) e onde encontrar instruções para a sua integração ou reconfiguração, para que possa manter a proteção com confiança e controlar o seu funcionamento.

Conclusion
Links úteis
DocIconDocumentação TenDI (Tencent) CAPTCHADocIconDocumentação CapMonster Cloud (trabalhar com Tencent CAPTCHA)DocIconO que é Tencent Captcha (TenDI) e como resolvê-la?