logo
bars

TenDI (Tencent) CAPTCHA
и CapMonster Cloud

Решение капчи, установка на сайт и тестирование.
Вам достался «по наследству» сайт с подключённой капчей или другой защитой, но доступа к исходному коду нет? В такой ситуации возникают вопросы: какую именно систему защиты использует сайт, правильно ли она установлена и как проверить её работу?

В этой статье мы постарались дать ответы на все вопросы. А начать решение задачи нужно с определения того, какая система защиты используется. Для этого можно обратиться к списку популярных капч и систем антибот-защиты, где представлены визуальные примеры и ключевые признаки, которые могут помочь быстро определить, с чем вы имеете дело.

Если вы обнаружили, что на вашем сайте используется TenDI (Tencent), следующим шагом станет более подробное изучение её свойств и самой работы. Также в этой статье вы можете изучить инструкцию по подключению системы TenDI (Tencent), чтобы полностью разобраться, как она функционирует на вашем сайте. Это позволит не только понимать текущую защиту, но и грамотно планировать её поддержку.

Что такое TenDI CAPTCHA
Что такое TenDI CAPTCHA
TenDI (Tencent) CAPTCHA — это система многоуровневой защиты от ботов. С помощью анализа поведения и специального механизма она проверяет, является ли посетитель сайта реальным человеком. Используется для защиты регистрации, входа в аккаунт, маркетинговых акций, предотвращения спама и кражи данных.
Background
Виды TenDI (Tencent)
Non-perception CAPTCHA
Non-perception CAPTCHA
Проверка проходит автоматически, без участия пользователя. Идеально для сценариев с высокой важностью удобства.
Slider CAPTCHA
Slider CAPTCHA
Быстрая и простая проверка с помощью перетаскивания ползунка. Подходит для большинства случаев.
Graphic CAPTCHA
Graphic CAPTCHA
Пользователь последовательно нажимает на элементы изображения. Используется в высокозащищённых сценариях.
Audio CAPTCHA
Audio CAPTCHA
Проверка через аудиозапись. Оптимально для пользователей с ограниченными возможностями.
Smart Verification
Smart Verification
Система оценивает поведение пользователя: доверенных пропускает сразу, а подозрительных проверяет дополнительно.
Multi-dimensional Defense
Multi-dimensional Defense
Используются несколько защитных механизмов: динамическое шифрование, анти-бот и другие.

Как решить Tencent CAPTCHA через CapMonster Cloud

При тестировании форм с Tencent CAPTCHA часто возникает необходимость проверить работу капчи и убедиться, что она корректно интегрирована.
Вы можете вручную протестировать подставленную на ваш сайт капчу:
  • Откройте страницу с формой и убедитесь, что капча отображается.
  • Попробуйте отправить форму без её прохождения — сервер должен выдать ошибку.
  • После успешного решения капчи — форма должна отправиться без ошибок.
Для автоматического распознавания капчи можно использовать специализированные сервисы, например, CapMonster Cloud — инструмент, который принимает параметры капчи, обрабатывает их на своих серверах и возвращает готовый токен. Этот токен можно подставить в форму, чтобы пройти проверку без участия пользователя.

Работа с CapMonster Cloud через API обычно включает следующие шаги:

Создание задачи (Task)Создание задачи (Task)
arrow
Отправка запроса к APIОтправка запроса к API
arrow
Получение результатаПолучение результата
arrow
Подстановка токена на страницуПодстановка токена на страницу
arrow
Распознавание TenDI (Tencent) CAPTCHA с использованием готовых библиотек
Сервис CapMonster Cloud предоставляет готовые библиотеки для удобной работы на языках Python, JavaScript (Node.js) и C#.
Python
JavaScript
C#
Решение, подстановка токена и отправка формы
Пример на Node.js для полного цикла распознавания капчи на вашей веб-странице. Возможные подходы: использовать HTTP-запросы для получения HTML и параметров системы защиты, отправить ответ и обработать результат. Или, как в примере ниже, с помощью инструментов для автоматизации (например, Playwright) — открыть страницу, дождаться проверки, отправить параметры через клиент CapMonster Cloud, получить результат, подставить токен в форму (для тестирования вы можете использовать как правильные, так и некорректные данные) и увидеть результат.

// npx playwright install chromium

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

// Замените на свои значения
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. Открываем страницу
    await page.goto(WEBSITE_URL, { waitUntil: 'networkidle' });

    // 2. Ждем появления капчи (например, input или iframe)
    await page.waitForSelector('#tendi_response, iframe[src*="tendi"], input[name="tendi_response"]', { timeout: 15000 });

    // Если нужно, можно извлечь websiteKey с самой страницы
    const WEBSITE_KEY = await page.evaluate(() => {
        // Пример: sitekey может быть в data-атрибуте или глобальной переменной
        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. Создаем задачу TenDI
    const tenDIRequest = new TenDIRequest({
        websiteURL: page.url(),
        websiteKey: WEBSITE_KEY,
    });

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

    // 4. Решаем капчу
    const solution = await client.Solve(tenDIRequest);
    console.log("Solution:", solution);

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

    // 5. Способы вставки результата решения
    await page.evaluate(({ ticket, randstr }) => {
        // Вставка в 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;
            }
        }

        // JS-функция callback
        if (typeof window.onCaptchaSolved === 'function') {
            window.onCaptchaSolved(ticket, randstr);
            inserted = true;
        }

        // Если нет input и 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);
  
Как подключить TenDI (Tencent) CAPTCHA к своему сайту
Чтобы уверенно ориентироваться в работе капчи на вашем сайте, понимать логику её проверки, заново подключить или перенастроить, рекомендуем вам изучить этот раздел. В нём описан процесс подключения защиты — это поможет быстро разобраться во всех нюансах.
  • 1. Зайдите в свой аккаунт или создайте новый в Captcha Console.
  • 2. Откройте раздел Verification Management.
  • 3. Создайте новую капчу (если её ещё нет).

Вы получите два параметра: CaptchaAppId и AppSecretKey. Их вы будете использовать на фронтенде и сервере.

Пример фронтенд-интеграцииПример фронтенд-интеграции
arrow

Как работает интеграция

Шаг 1: Загрузить JS капчи

Скрипт должен загружаться динамически:

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

Если скрипт подгружать нестандартно или пытаться кэшировать — капча может работать некорректно.

Шаг 2: Создать объект TencentCaptcha

После загрузки JS появляется глобальный класс:

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

Параметры:

domElement - Контейнер, куда встраивается чекбокс/iframe

CaptchaAppId - Ваш ID

callback - Что делать после проверки

options - Настройки внешнего вида (можно не указывать)

Шаг 3: Вызвать метод .show()

captcha.show();

Показывает капчу. Можно вызывать многократно.

Шаг 4: Обработать результат

Callback получает объект:


{
  ret: 0,              // 0 -- успех, 2 -- пользователь закрыл окно
  ticket: "...",       // нужна серверу
  randstr: "...",      // тоже нужна серверу
  errorCode: 1001,     // если капча не загрузилась
  errorMessage: "..."  // текст ошибки
}

На сервере обязательно выполняйте вторичную проверку ticket.

"Аварийный режим" (Disaster Recovery)

Если капча не загрузилась (например, CDN недоступен), можно автоматически выдать «аварийный билет», чтобы не ломать бизнес-процесс.

Сценарий:

  • Попробовали создать капчу → ошибка.
  • Вызываем loadErrorCallback().
  • Генерируем ticket вида:
    trerror_<errorcode>_<appid>_<timestamp>
  • Продолжаем обработку, как обычно, но сервер видит, что это аварийный билет, и принимает решение, что делать.

Шифрование AppId (необязательно)

Если требуется максимальная защита, можно передавать капче не открытый AppId, а его зашифрованную версию:

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

Нужно:

  • 32-байтовый ключ (AppSecretKey → дополняется до 32 байт)
  • AES-256 CBC + PKCS7Padding
  • 16-байтовый IV
  • timestamp и срок действия в секундах

Серверный пример шифрования (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")

Серверная валидация

Шаг 1. Настройка доступа к API

В панели управления вашими ключами (CAM / API Key Management) получите SecretId и SecretKey для API. Эти ключи понадобятся для подписанных запросов к API.

Шаг 2. Вызов API DescribeCaptchaResult

После того как клиент вернул ticket и randstr, сервер должен отправить запрос:

  • Action: DescribeCaptchaResult
  • Version: 2019-07-22 (или актуальную)

Параметры:

CaptchaType - 9 (фиксированное значение)

Ticket - строка — ticket, вернувшийся с клиента

Randstr - строка — randstr, вернувшийся с клиента

CaptchaAppId - ваш AppId

AppSecretKey - ваш секретный ключ

UserIp - IP пользователя (рекомендуется передавать)

Шаг 3. Обработка ответа

API вернёт:

  • CaptchaCode: integerрезультат проверки.
  • 0 (или OK) — капча пройдена, ticket действителен

Если CaptchaCode === OK, можно считать, что пользователь прошёл проверку. Иначе — отклонить.

Пример — проверка ticket на 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", // регион, если требуется
});

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

Более подробную информацию о подключении Tencent CAPTCHA к вашему сайту вы можете найти в официальной документации.

Background
Возможные ошибки и отладка
Bug Icon
Капча не загружается
(Ошибки 1001, 1002 или сообщение о некорректной подписи) — причиной могут быть некорректные параметры запроса. Убедитесь, что CaptchaAppId, AppSecretKey и все параметры запроса указаны правильно.
Bug Icon
Неверный или пустой ticket/randstr
Убедитесь, что клиент корректно передаёт оба параметра.
Bug Icon
Таймаут решения
Увеличьте время ожидания на серверной стороне.
Проверка устойчивости защиты
После подключения важно убедиться, что защита действительно работает корректно.
Рекомендации по безопасности и оптимизации
Храните <b>AppSecretKey</b> только на сервере, не передавайте его в браузер и не включайте в JS-код.
Логируйте полные ответы Tencent CAPTCHA, включая код ошибки, время запроса и параметры валидации — это поможет быстрее диагностировать проблемы.
Используйте HTTPS при передаче всех параметров <b>(ticket, randstr)</b>, чтобы избежать подмены.
Разместите на странице корректные ссылки на <b>Политику конфиденциальности</b> и <b>Условия использования Tencent</b>, как требует лицензия.
Заключение

Если вам достался сайт с уже установленной капчей или другой системой защиты и при этом нет доступа к коду — ничего страшного! Определить, какая именно технология используется, достаточно легко. А для проверки корректности работы можно использовать сервис распознавания CapMonster Cloud в изолированной тестовой среде, чтобы убедиться, что механизм обработки токенов и логика проверки функционируют корректно.

В случае с TenDI (Tencent) — достаточно распознать систему, изучить её поведение и убедиться, что защита функционирует корректно. В статье мы показали, как определить TenDI (Tencent) и где найти инструкции по её подключению или перенастройке, чтобы уверенно поддерживать защиту и контролировать её работу.

Conclusion
Полезные ссылки
DocIconДокументация TenDI (Tencent) CAPTCHADocIconДокументация CapMonster Cloud (работа с Tencent CAPTCHA)DocIconЧто такое Tencent Captcha (TenDI) и как её решить?