TenDI (Tencent) CAPTCHA
e CapMonster Cloud

Solução de captcha, instalação no site e testes.

Preços da solução TenDI (Tencent)

CAPTCHA
Preço (USD)
$ 1.60
1000 tokens
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 <span class="font-bold">AppSecretKey</span> 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 <span class="font-bold">(ticket, randstr)</span> para evitar falsificações.
Coloque links corretos para a <span class="font-bold">Política de Privacidade</span> e os <span class="font-bold">Termos de Uso da Tencent</span> 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?

Perguntas frequentes sobre TenDI (Tencent) CAPTCHA

O TenDI oferece vários tipos de desafio para diferentes níveis de risco e necessidades de experiência do utilizador.

  • Non-Perception — executa-se silenciosamente em segundo plano para verificação de baixa fricção.
  • Slider — utiliza um puzzle de arrastar para verificações visíveis padrão.
  • Graphic — pede ao utilizador para clicar em formas específicas; adequado para tráfego de maior risco.
  • Audio — oferece uma alternativa acessível aos desafios visuais.
  • Smart Verification — permite que utilizadores de confiança passem silenciosamente e mostra um desafio apenas em sessões suspeitas.

O TenDI também inclui Multi-dimensional Defense, um conjunto de 10 mecanismos de proteção em segundo plano que melhoram a resistência a bots. Para o CapMonster Cloud, use sempre type: CustomTask e class: "TenDI", independentemente do desafio mostrado na página. Para mais detalhes da API, consulte aqui.

Depois de o cliente devolver um ticket e randstr, o servidor deve validá-los chamando a API Tencent DescribeCaptchaResult. Para verificar o ticket, envie um pedido API assinado com estes parâmetros:

  • CaptchaType: 9
  • Ticket: o ticket devolvido pelo cliente
  • Randstr: o randstr devolvido pelo cliente
  • CaptchaAppId: o seu AppId
  • AppSecretKey: a sua chave secreta do captcha
  • UserIp: o endereço IP do utilizador (recomendado)

O servidor também precisa de credenciais da API Tencent Cloud (SecretId e SecretKey) para assinar o pedido.

Verifique o valor CaptchaCode na resposta:

  • 0 ou OK: captcha aprovada, ticket válido
  • qualquer outro valor: verificação falhada, o pedido deve ser rejeitado
  • Nunca exponha AppSecretKey no código frontend.
  • Use no servidor o fluxo de CaptchaAppId encriptado da Tencent. Gere o valor encriptado no backend para o enviar ao cliente.
  • Após resolver a CAPTCHA, envie ticket e randstr do cliente para o backend para os validar através da API DescribeCaptchaResult.
  • Mantenha todos os segredos e a lógica de verificação no backend.

Para configuração passo a passo, consulte Como ligar TenDI (Tencent) CAPTCHA ao seu site mais acima nesta página.

No fluxo de integração cliente Tencent, o TenDI suporta um parâmetro opcional aidEncrypted que substitui o CaptchaAppId em texto simples na inicialização do widget.

aidEncrypted é gerado da seguinte forma: aidEncrypted = Base64(IV + ciphertext)

ciphertext é o resultado da encriptação de uma string que contém o seu AppId, o timestamp Unix atual e o ttl (tempo de expiração em segundos). A encriptação usa AES-256-CBC com preenchimento PKCS7.

Um IV aleatório de 16 bytes é gerado para cada pedido e anteposto ao resultado encriptado.

O valor binário final é codificado em Base64 antes de ser passado ao widget como aidEncrypted.

Se o script Tencent CAPTCHA não carregar ou inicializar, o modo Disaster Recovery do TenDI permite continuar o fluxo do utilizador em vez de bloquear o pedido.

  • Chame loadErrorCallback() quando o JavaScript CAPTCHA não puder carregar ou iniciar, por exemplo devido a um problema de rede ou CDN.
  • Isto cria um ticket de disaster recovery no formato trerror_<errorcode>_<CaptchaAppId>_<timestamp>.
  • O ticket é devolvido através do fluxo de callback normal com ret: 0 (sucesso).
  • No servidor, não trate ret: 0 sozinho como sucesso normal. Verifique também o prefixo do ticket (trerror_) e errorCode = 1001 para detetar o modo disaster recovery.

Para funcionar de forma fiável, defina o handler de erros antes de carregar o script CAPTCHA e chame-o quando ocorrer um erro de carregamento JS.