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
Você herdou um site com captcha ou outra camada de proteção, mas não tem acesso ao código-fonte? Então é normal querer saber qual solução está instalada, se a configuração está correta e como testar tudo.

Neste artigo, procuramos responder a todas as principais dúvidas. Para começar a resolver o problema, o primeiro passo é identificar qual sistema de proteção está sendo utilizado. Para isso, você pode consultar a lista de captchas e sistemas de proteção antibot mais populares, onde há exemplos visuais e sinais principais que ajudam a identificar rapidamente com o que você está lidando.

Se você notar que o seu site utiliza TenDI (Tencent), o passo seguinte é estudar com mais detalhes as suas características e o seu funcionamento. Neste mesmo artigo, você também pode conferir o guia de integração do TenDI (Tencent), para entender por completo como o sistema opera no seu site. Isso permitirá não apenas compreender a proteção atual, mas também planejar adequadamente 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 usuário e aplica mecanismos especiais para verificar se o visitante do site é humano. Usado para proteger registros, login, campanhas de marketing e prevenir 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 usuário. Ideal para cenários em que a conveniência é importante.
Slider CAPTCHA
Slider CAPTCHA
Verificação rápida e simples deslizando o cursor. Adequado para a maioria dos casos.
Graphic CAPTCHA
Graphic CAPTCHA
O usuário clica sequencialmente nos elementos da imagem. Usado em cenários de alta segurança.
Audio CAPTCHA
Audio CAPTCHA
Verificação por meio de gravação de áudio. Ótimo para usuários com necessidades especiais.
Smart Verification
Smart Verification
O sistema avalia o comportamento do usuário: confiáveis passam imediatamente, suspeitos são verificados adicionalmente.
Multi-dimensional Defense
Multi-dimensional Defense
Vários mecanismos de proteção são usados: criptografia 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 adequadamente.
Você pode testar manualmente o captcha em seu site:
  • Abra a página do formulário e verifique se o captcha é exibido.
  • Tente enviar o formulário sem completá-lo — o servidor deve retornar um erro.
  • Após resolver corretamente o captcha, o formulário deve ser enviado sem erros.
Para reconhecimento automático de captcha, você pode usar serviços especializados, como o CapMonster Cloud — uma ferramenta que processa os parâmetros do captcha em seus servidores e retorna um token pronto. Este token pode ser inserido no formulário para passar a verificação sem intervenção do usuário.

Trabalhar com o CapMonster Cloud via API normalmente envolve as etapas abaixo:

Criação da tarefaCriação da tarefa
arrow
Envio da requisição APIEnvio da requisição API
arrow
Recebimento do resultadoRecebimento 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 requisições 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 o captcha aparecer (ex.: input ou iframe)
    await page.waitForSelector('#tendi_response, iframe[src*="tendi"], input[name="tendi_response"]', { timeout: 15000 });

    // Se necessário, pode extrair o websiteKey da página
    const WEBSITE_KEY = await page.evaluate(() => {
        // Exemplo: sitekey pode estar em um atributo data ou em uma 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 conectar TenDI (Tencent) CAPTCHA ao seu site
Para entender como o captcha funciona no seu site, compreender a lógica da verificação e reconectar ou reconfigurar, recomendamos estudar esta seção. Ela 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 seção Verification Management.
  • 3. Crie um novo captcha (se ainda não existir).

Você receberá dois parâmetros: CaptchaAppId e AppSecretKey. Eles 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 do 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 cache podem fazer o captcha funcionar incorretamente.

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 - 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 o captcha. Pode ser chamado várias vezes.

Passo 4: Processar o resultado

Callback recebe um objeto:


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

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

"Modo de emergência"

Se o captcha não carregar (ex.: CDN indisponível), você pode gerar automaticamente 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, você pode enviar para o captcha uma versão criptografada 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 criptografia 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ário para requisições assinadas.

Passo 2. Chamar API DescribeCaptchaResult

Após o cliente devolver ticket e randstr, o servidor envia a requisição:

  • 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 - seu AppId

AppSecretKey - sua chave secreta

UserIp - IP do usuário (recomendado)

Passo 3. Processar resposta

A API retorna:

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

Se CaptchaCode === OK, o usuário é 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 conectar 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 requisição incorretos. Verifique se CaptchaAppId, AppSecretKey e todos os parâmetros da requisição estão informados corretamente.
Bug Icon
Ticket/randstr inválido ou vazio
Verifique se o cliente envia ambos os parâmetros corretamente.
Bug Icon
Tempo de resolução expirado
Aumente o tempo de espera no servidor.
Verificação da 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.
Registre respostas completas do Tencent CAPTCHA, incluindo código de erro, hora da requisição 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 você 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 tem problema! É bem fácil identificar qual tecnologia está sendo usada. Para verificar se tudo está funcionando corretamente, você pode usar o serviço de reconhecimento CapMonster Cloud em um ambiente de testes isolado, para garantir que o mecanismo de processamento de tokens e a lógica de verificação estejam funcionando corretamente.

No caso de TenDI (Tencent), basta identificar o sistema, analisar o comportamento dele e se certificar de que a proteção está funcionando corretamente. No artigo, mostramos como identificar TenDI (Tencent) e onde encontrar instruções para a integração ou reconfiguração, para que você consiga manter a proteção com segurança e controlar o funcionamento dela.

Conclusion

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 usuário.

  • Non-Perception — executa silenciosamente em segundo plano para verificação de baixa fricção.
  • Slider — usa um quebra-cabeça de arrastar para verificações visíveis padrão.
  • Graphic — pede ao usuário 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 usuários confiáveis 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 exibido na página. Para mais detalhes da API, consulte aqui.

Depois que o cliente retornar um ticket e randstr, seu servidor deve validá-los chamando a API Tencent DescribeCaptchaResult. Para verificar o ticket, envie uma solicitação API assinada com estes parâmetros:

  • CaptchaType: 9
  • Ticket: o ticket retornado pelo cliente
  • Randstr: o randstr retornado pelo cliente
  • CaptchaAppId: seu AppId
  • AppSecretKey: sua chave secreta do captcha
  • UserIp: o endereço IP do usuário (recomendado)

Seu servidor também precisa de credenciais da API Tencent Cloud (SecretId e SecretKey) para assinar a solicitação.

Verifique o valor CaptchaCode na resposta:

  • 0 ou OK: captcha aprovada, ticket válido
  • qualquer outro valor: verificação falhou, a solicitação deve ser rejeitada
  • Nunca exponha AppSecretKey no código frontend.
  • Use no servidor o fluxo de CaptchaAppId criptografado da Tencent. Gere o valor criptografado no backend para enviá-lo ao cliente.
  • Após resolver a CAPTCHA, envie ticket e randstr do cliente para o backend para validá-los pela API DescribeCaptchaResult.
  • Mantenha todos os segredos e a lógica de verificação no backend.

Para configuração passo a passo, consulte Como conectar 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 criptografia de uma string que contém seu AppId, o timestamp Unix atual e o ttl (tempo de expiração em segundos). A criptografia usa AES-256-CBC com preenchimento PKCS7.

Um IV aleatório de 16 bytes é gerado para cada solicitação e anteposto ao resultado criptografado.

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 usuário em vez de bloquear a solicitação.

  • Chame loadErrorCallback() quando o JavaScript CAPTCHA não puder carregar ou iniciar, por exemplo por um problema de rede ou CDN.
  • Isso cria um ticket de disaster recovery no formato trerror_<errorcode>_<CaptchaAppId>_<timestamp>.
  • O ticket é retornado pelo 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 detectar o modo disaster recovery.

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