logo
bars

TenDI (Tencent) CAPTCHA
i CapMonster Cloud

Rozwiązywanie captchy, instalacja na stronie i testowanie.
Odziedziczyłeś stronę z już wdrożoną captchą lub ochroną, ale bez dostępu do kodu źródłowego? Naturalnie pojawia się pytanie, jaka technologia jest używana, czy działa poprawnie i jak ją przetestować.

W tym artykule staraliśmy się odpowiedzieć na wszystkie najważniejsze pytania. Pierwszym krokiem w rozwiązywaniu problemu jest ustalenie, jaki system ochrony jest używany. W tym celu możesz skorzystać z listy popularnych captcha i systemów ochrony antybotowej, gdzie znajdziesz przykłady graficzne oraz kluczowe cechy, które pomogą szybko rozpoznać, z czym masz do czynienia.

Jeśli okaże się, że na Twojej stronie używany jest TenDI (Tencent), kolejnym krokiem będzie dokładniejsze poznanie jej właściwości i sposobu działania. W tym artykule możesz również zapoznać się z instrukcją integracji systemu TenDI (Tencent), aby w pełni zrozumieć, jak funkcjonuje on na Twojej stronie. Dzięki temu nie tylko lepiej poznasz obecną ochronę, ale też świadomie zaplanujesz jej dalsze utrzymanie.

Czym jest TenDI CAPTCHA
Czym jest TenDI CAPTCHA
TenDI (Tencent) CAPTCHA to wielopoziomowy system ochrony przed botami. Analizuje zachowanie użytkownika i stosuje specjalne mechanizmy, aby sprawdzić, czy odwiedzający stronę jest człowiekiem. Stosowany do ochrony rejestracji, logowania, kampanii marketingowych oraz zapobiegania spamu i kradzieży danych.
Background
Przykłady TenDI (Tencent)
Non-perception CAPTCHA
Non-perception CAPTCHA
Weryfikacja odbywa się automatycznie, bez udziału użytkownika. Idealne w scenariuszach, gdzie wygoda jest kluczowa.
Slider CAPTCHA
Slider CAPTCHA
Szybka i prosta weryfikacja przez przesunięcie suwaka. Nadaje się w większości przypadków.
Graphic CAPTCHA
Graphic CAPTCHA
Użytkownik kolejno klika elementy obrazu. Stosowane w scenariuszach o wysokim poziomie bezpieczeństwa.
Audio CAPTCHA
Audio CAPTCHA
Weryfikacja za pomocą nagrania audio. Optymalne dla użytkowników z ograniczeniami.
Smart Verification
Smart Verification
System ocenia zachowanie użytkownika: zaufanych przepuszcza od razu, podejrzanych dodatkowo weryfikuje.
Multi-dimensional Defense
Multi-dimensional Defense
Stosowane są różne mechanizmy ochronne: szyfrowanie dynamiczne, anty-bot i inne.

Jak rozwiązać Tencent CAPTCHA przez CapMonster Cloud

Podczas testowania formularzy z Tencent CAPTCHA często trzeba sprawdzić, czy captcha działa poprawnie i jest prawidłowo zintegrowana.
Możesz ręcznie przetestować captcha na swojej stronie:
  • Otwórz stronę z formularzem i upewnij się, że captcha się wyświetla.
  • Spróbuj wysłać formularz bez jej rozwiązania — serwer powinien zwrócić błąd.
  • Po prawidłowym rozwiązaniu captchy formularz powinien zostać wysłany bez błędów.
Do automatycznego rozpoznawania captchy można użyć specjalistycznych usług, np. CapMonster Cloud — narzędzia, które przyjmuje parametry captchy, przetwarza je na swoich serwerach i zwraca gotowy token. Token można wstawić do formularza, aby przejść weryfikację bez udziału użytkownika.

Praca z CapMonster Cloud poprzez API zazwyczaj obejmuje następujące kroki:

Tworzenie zadaniaTworzenie zadania
arrow
Wysyłanie żądania APIWysyłanie żądania API
arrow
Odebranie wynikuOdebranie wyniku
arrow
Umieszczenie tokenu na stronieUmieszczenie tokenu na stronie
arrow
Rozpoznawanie TenDI (Tencent) CAPTCHA przy użyciu gotowych bibliotek
Serwis CapMonster Cloud udostępnia gotowe biblioteki do wygodnej pracy w Python, JavaScript (Node.js) i C#.
Python
JavaScript
C#
Rozwiązanie, wstawianie tokena i wysyłanie formularza
Przykład w Node.js dla pełnego cyklu rozpoznawania captchy na twojej stronie. Możliwe podejścia: użyć żądań HTTP do pobrania HTML i parametrów systemu ochrony, wysłać odpowiedź i przetworzyć wynik. Lub jak w przykładzie poniżej, za pomocą narzędzi automatyzacji (np. Playwright) — otworzyć stronę, poczekać na weryfikację, wysłać parametry przez klienta CapMonster Cloud, otrzymać wynik, wstawić token do formularza (do testów można użyć prawidłowych lub nieprawidłowych danych) i zobaczyć wynik.

// npx playwright install chromium

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

// Zamień na własne wartości
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. Otwieramy stronę
    await page.goto(WEBSITE_URL, { waitUntil: 'networkidle' });

    // 2. Czekamy na pojawienie się captchy (np. input lub iframe)
    await page.waitForSelector('#tendi_response, iframe[src*="tendi"], input[name="tendi_response"]', { timeout: 15000 });

    // Jeśli trzeba, można pobrać websiteKey ze strony
    const WEBSITE_KEY = await page.evaluate(() => {
        // Przykład: sitekey może być w atrybucie data lub zmiennej globalnej
        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. Tworzymy zadanie TenDI
    const tenDIRequest = new TenDIRequest({
        websiteURL: page.url(),
        websiteKey: WEBSITE_KEY,
    });

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

    // 4. Rozwiązujemy captchę
    const solution = await client.Solve(tenDIRequest);
    console.log("Solution:", solution);

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

    // 5. Sposoby wstawienia wyniku
    await page.evaluate(({ ticket, randstr }) => {
        // Wstawienie do 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;
            }
        }

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

        // Jeśli nie ma input ani 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);
  
Jak podłączyć TenDI (Tencent) CAPTCHA do swojej strony
Aby zrozumieć działanie captchy na stronie, logikę weryfikacji oraz ponownie podłączyć lub skonfigurować, zalecamy zapoznanie się z tym rozdziałem. Opisuje proces integracji ochrony, co pomaga szybko zrozumieć wszystkie szczegóły.
  • 1. Zaloguj się lub utwórz nowe konto w Captcha Console.
  • 2. Otwórz sekcję Verification Management.
  • 3. Utwórz nową captchę (jeśli jeszcze nie istnieje).

Otrzymasz dwa parametry: CaptchaAppId i AppSecretKey. Będą używane na frontendzie i serwerze.

Przykład integracji frontendowejPrzykład integracji frontendowej
arrow

Jak działa integracja

Krok 1: Załaduj JS captchy

Skrypt musi być ładowany dynamicznie:

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

Nieprawidłowe lub pamiętanie w cache może spowodować niepoprawne działanie captchy.

Krok 2: Utwórz obiekt TencentCaptcha

Po załadowaniu JS pojawia się klasa globalna:

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

Parametry:

domElement - Kontener, w którym umieszczony jest checkbox/iframe

CaptchaAppId - Twój ID

callback - Co zrobić po weryfikacji

options - Ustawienia wyglądu (opcjonalne)

Krok 3: Wywołaj metodę .show()

captcha.show();

Wyświetla captchę. Można wywoływać wielokrotnie.

Krok 4: Przetwarzanie wyniku

Callback otrzymuje obiekt:


{
  ret: 0,              // 0 -- sukces, 2 -- użytkownik zamknął okno
  ticket: "...",       // wymagane przez serwer
  randstr: "...",      // również wymagane przez serwer
  errorCode: 1001,     // jeśli captcha nie została załadowana
  errorMessage: "..."  // treść błędu
}

Na serwerze należy zawsze wykonać weryfikację ticket.

"Tryb awaryjny"

Jeśli captcha nie załaduje się (np. CDN niedostępny), można automatycznie wygenerować 'bilet awaryjny', aby nie przerywać procesu biznesowego.

Scenariusz:

  • Próba utworzenia captchy → błąd.
  • Wywołujemy loadErrorCallback().
  • Generujemy ticket w formacie:
    trerror_<errorcode>_<appid>_<timestamp>
  • Kontynuujemy przetwarzanie normalnie, ale serwer widzi to jako ticket awaryjny i decyduje co zrobić.

Szyfrowanie AppId (opcjonalnie)

Jeśli wymagana jest maksymalna ochrona, można przesyłać do captchy zaszyfrowaną wersję AppId zamiast jawnej:

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

Potrzebne:

  • Klucz 32-bajtowy (AppSecretKey → uzupełniany do 32 bajtów)
  • AES-256 CBC + PKCS7Padding
  • IV 16-bajtowy
  • timestamp i czas ważności w sekundach

Przykład szyfrowania po stronie serwera (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")

Walidacja po stronie serwera

Krok 1. Konfiguracja dostępu do API

W panelu zarządzania kluczami (CAM / API Key Management) uzyskaj SecretId i SecretKey dla API. Klucze są potrzebne do podpisanych żądań.

Krok 2. Wywołanie API DescribeCaptchaResult

Po tym, jak klient zwróci ticket i randstr, serwer wysyła żądanie:

  • Action: DescribeCaptchaResult
  • Version: 2019-07-22 (lub aktualne)

Parametry:

CaptchaType - 9 (wartość stała)

Ticket - string — ticket zwrócony przez klienta

Randstr - string — randstr zwrócony przez klienta

CaptchaAppId - Twój AppId

AppSecretKey - Twój SecretKey

UserIp - IP użytkownika (zalecane)

Krok 3. Przetwarzanie odpowiedzi

API zwróci:

  • CaptchaCode: integerwynik weryfikacji.
  • 0 (lub OK) — captcha zaliczona, ticket ważny

Jeśli CaptchaCode === OK, można uznać, że użytkownik przeszedł weryfikację. W przeciwnym razie — odrzucić.

Przykład — weryfikacja ticket w 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", // region, jeśli wymagany
});

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

Więcej informacji o podłączeniu Tencent CAPTCHA do swojej strony znajdziesz w oficjalnej dokumentacji.

Background
Możliwe błędy i debugowanie
Bug Icon
Captcha nie ładuje się
(Błędy 1001, 1002 lub komunikat o nieprawidłowym podpisie) — przyczyną mogą być nieprawidłowe parametry żądania. Upewnij się, że CaptchaAppId, AppSecretKey oraz wszystkie parametry żądania są podane poprawnie.
Bug Icon
Nieprawidłowy lub pusty ticket/randstr
Upewnij się, że klient przesyła oba parametry poprawnie.
Bug Icon
Limit czasu rozwiązania
Zwiększ czas oczekiwania po stronie serwera.
Sprawdzenie odporności ochrony
Po podłączeniu ważne jest, aby upewnić się, że ochrona działa poprawnie.
Rekomendacje dotyczące bezpieczeństwa i optymalizacji
Przechowuj <b>AppSecretKey</b> tylko na serwerze, nie przesyłaj go do przeglądarki i nie umieszczaj w kodzie JS.
Loguj pełne odpowiedzi Tencent CAPTCHA, w tym kod błędu, czas żądania i parametry weryfikacji — pomoże to szybciej diagnozować problemy.
Używaj HTTPS przy przesyłaniu wszystkich parametrów <b>(ticket, randstr)</b>, aby uniknąć podszywania się.
Umieść na stronie poprawne linki do <b>Polityki prywatności</b> i <b>Warunków użytkowania Tencent</b>, zgodnie z licencją.
Wnioski

Jeśli przejąłeś stronę internetową, na której jest już zainstalowany captcha lub inny system zabezpieczeń, a jednocześnie nie masz dostępu do kodu — to nic strasznego! Dość łatwo jest ustalić, jaka dokładnie technologia jest używana. Aby sprawdzić poprawność działania, możesz skorzystać z usługi rozpoznawania CapMonster Cloud w odizolowanym środowisku testowym, żeby upewnić się, że mechanizm przetwarzania tokenów i logika weryfikacji działają prawidłowo.

W przypadku TenDI (Tencent) wystarczy rozpoznać system, przeanalizować jego zachowanie i upewnić się, że zabezpieczenie działa poprawnie. W artykule pokazaliśmy, jak zidentyfikować TenDI (Tencent) oraz gdzie znaleźć instrukcje dotyczące jego podłączenia lub ponownej konfiguracji, aby móc pewnie utrzymywać ochronę i kontrolować jej działanie.

Conclusion
Przydatne linki
DocIconDokumentacja TenDI (Tencent) CAPTCHADocIconDokumentacja CapMonster Cloud (praca z Tencent CAPTCHA)DocIconCzym jest Tencent Captcha (TenDI) i jak ją rozwiązać?