logo
bars

TenDI (Tencent) CAPTCHA
và CapMonster Cloud

Giải pháp captcha, cài đặt trên website và kiểm tra.
Bạn nhận lại một website đã có captcha hoặc lớp bảo vệ khác nhưng không có quyền truy cập mã nguồn? Khi đó điều bạn cần biết là giải pháp nào đang chạy, cấu hình có đúng không và cách kiểm tra như thế nào.

Trong bài viết này, chúng tôi đã cố gắng trả lời tất cả những câu hỏi quan trọng. Bước đầu tiên để bắt đầu giải quyết vấn đề là xác định hệ thống bảo mật nào đang được sử dụng. Để làm điều đó, bạn có thể tham khảo danh sách các captcha và hệ thống chống bot phổ biến, trong đó có các ví dụ minh họa và những dấu hiệu chính giúp bạn nhanh chóng nhận biết mình đang làm việc với giải pháp nào.

Nếu bạn phát hiện trang web của mình đang sử dụng TenDI (Tencent), bước tiếp theo là tìm hiểu chi tiết hơn về các đặc tính và cách hoạt động của nó. Ngay trong bài viết này, bạn cũng có thể xem hướng dẫn tích hợp hệ thống TenDI (Tencent) để hiểu đầy đủ cách nó vận hành trên trang web của bạn. Điều đó giúp bạn không chỉ nắm rõ lớp bảo vệ hiện tại mà còn lập kế hoạch bảo trì một cách hợp lý.

TenDI CAPTCHA là gì
TenDI CAPTCHA là gì
TenDI (Tencent) CAPTCHA là hệ thống bảo vệ nhiều lớp chống bot. Nó phân tích hành vi của người dùng và sử dụng cơ chế đặc biệt để xác thực xem người truy cập trang web có phải là người thật không. Dùng để bảo vệ đăng ký, đăng nhập, các chiến dịch marketing và ngăn chặn spam hoặc đánh cắp dữ liệu.
Background
Ví dụ về TenDI (Tencent)
Non-perception CAPTCHA
Non-perception CAPTCHA
Xác thực diễn ra tự động, không cần tương tác từ người dùng. Lý tưởng cho các kịch bản yêu cầu trải nghiệm tiện lợi cao.
Slider CAPTCHA
Slider CAPTCHA
Xác thực nhanh và đơn giản bằng cách kéo thanh trượt. Phù hợp với hầu hết các trường hợp.
Graphic CAPTCHA
Graphic CAPTCHA
Người dùng lần lượt nhấn vào các phần tử của hình ảnh. Dùng trong các kịch bản bảo mật cao.
Audio CAPTCHA
Audio CAPTCHA
Xác thực bằng âm thanh. Tối ưu cho người dùng có nhu cầu đặc biệt.
Smart Verification
Smart Verification
Hệ thống đánh giá hành vi người dùng: người tin cậy được vượt qua ngay, người khả nghi được kiểm tra thêm.
Multi-dimensional Defense
Multi-dimensional Defense
Sử dụng nhiều cơ chế bảo vệ: mã hóa động, chống bot và các cơ chế khác.

Cách giải Tencent CAPTCHA qua CapMonster Cloud

Khi thử nghiệm form với Tencent CAPTCHA, thường cần kiểm tra captcha hoạt động đúng và tích hợp chính xác.
Bạn có thể kiểm tra captcha trên website thủ công:
  • Mở trang form và xác nhận captcha hiển thị.
  • Thử gửi form mà không hoàn thành captcha — server phải trả lỗi.
  • Sau khi giải captcha thành công, form phải được gửi mà không lỗi.
Để nhận diện captcha tự động, bạn có thể sử dụng dịch vụ chuyên biệt như CapMonster Cloud — công cụ xử lý các tham số captcha trên server của nó và trả về token sẵn sàng. Token này có thể được dùng trong form để vượt qua xác thực mà không cần người dùng tham gia.

Làm việc với CapMonster Cloud qua API thường gồm các bước:

Tạo nhiệm vụTạo nhiệm vụ
arrow
Gửi yêu cầu APIGửi yêu cầu API
arrow
Nhận kết quảNhận kết quả
arrow
Áp dụng token lên trangÁp dụng token lên trang
arrow
Nhận diện TenDI (Tencent) CAPTCHA với thư viện có sẵn
CapMonster Cloud cung cấp thư viện sẵn dùng cho Python, JavaScript (Node.js) và C#.
Python
JavaScript
C#
Giải quyết, chèn token và gửi biểu mẫu
Ví dụ Node.js cho toàn bộ vòng đời nhận diện captcha trên trang web của bạn. Cách thực hiện: gửi HTTP request để lấy HTML và tham số hệ thống bảo vệ, gửi câu trả lời và xử lý kết quả; hoặc dùng công cụ tự động hóa (ví dụ Playwright) — mở trang, chờ xác thực, gửi tham số qua CapMonster Cloud client, nhận kết quả, chèn token vào form (dùng dữ liệu đúng hoặc sai cho test) và xem kết quả.

// npx playwright install chromium

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

// Thay bằng giá trị của bạn
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. Mở trang
    await page.goto(WEBSITE_URL, { waitUntil: 'networkidle' });

    // 2. Chờ captcha xuất hiện (ví dụ input hoặc iframe)
    await page.waitForSelector('#tendi_response, iframe[src*="tendi"], input[name="tendi_response"]', { timeout: 15000 });

    // Nếu cần, có thể lấy websiteKey từ trang
    const WEBSITE_KEY = await page.evaluate(() => {
        // Ví dụ: sitekey có thể ở data attribute hoặc biến toàn cục
        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. Tạo task TenDI
    const tenDIRequest = new TenDIRequest({
        websiteURL: page.url(),
        websiteKey: WEBSITE_KEY,
    });

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

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

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

    // 5. Cách chèn kết quả giải
    await page.evaluate(({ ticket, randstr }) => {
        // Chèn vào 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;
            }
        }

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

        // Nếu không có input và 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);
  
Cách kết nối TenDI (Tencent) CAPTCHA với website
Để hiểu cách captcha hoạt động trên website, nắm logic xác thực, kết nối lại hoặc cấu hình lại, hãy đọc phần này. Nó mô tả quy trình tích hợp bảo vệ giúp bạn nhanh chóng hiểu tất cả chi tiết.
  • 1. Đăng nhập tài khoản hoặc tạo mới tại Captcha Console.
  • 2. Mở phần Verification Management.
  • 3. Tạo captcha mới (nếu chưa có).

Bạn sẽ nhận hai tham số: CaptchaAppIdAppSecretKey. Dùng trên frontend và server.

Ví dụ tích hợp frontendVí dụ tích hợp frontend
arrow

Cách tích hợp hoạt động

Bước 1: Tải JS captcha

Script phải được tải động:

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

Tải không chuẩn hoặc cache có thể khiến captcha không hoạt động đúng.

Bước 2: Tạo object TencentCaptcha

Sau khi tải JS, có lớp global:

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

Tham số:

domElement - Container để nhúng checkbox/iframe

CaptchaAppId - ID của bạn

callback - Hành động sau khi xác thực

options - Cấu hình hiển thị (tùy chọn)

Bước 3: Gọi phương thức .show()

captcha.show();

Hiển thị captcha. Có thể gọi nhiều lần.

Bước 4: Xử lý kết quả

Callback nhận object:


{
  ret: 0,              // 0 -- thành công, 2 -- người dùng đóng cửa sổ
  ticket: "...",       // cần cho server
  randstr: "...",      // cũng cần cho server
  errorCode: 1001,     // nếu captcha không tải
  errorMessage: "..."  // văn bản lỗi
}

Trên server, luôn thực hiện xác thực thứ cấp ticket.

"Chế độ khẩn cấp"

Nếu captcha không tải (ví dụ CDN không khả dụng), có thể tự động cấp "ticket khẩn cấp" để không làm gián đoạn quy trình kinh doanh.

Kịch bản:

  • Thử tạo captcha → lỗi.
  • Gọi loadErrorCallback().
  • Tạo ticket dạng:
    trerror_<errorcode>_<appid>_<timestamp>
  • Tiếp tục xử lý bình thường, server nhận dạng ticket là khẩn cấp và quyết định hành động.

Mã hóa AppId (tùy chọn)

Để bảo vệ tối đa, bạn có thể gửi phiên bản mã hóa của AppId thay vì bản mở:

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

Cần:

  • Khóa 32 byte (AppSecretKey → hoàn thiện 32 byte)
  • AES-256 CBC + PKCS7Padding
  • IV 16 byte
  • timestamp và thời gian hiệu lực (giây)

Ví dụ mã hóa 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")

Xác thực server

Bước 1. Cấu hình truy cập API

Trong quản lý khóa (CAM / API Key Management), lấy SecretIdSecretKey cho API. Cần cho các request có ký.

Bước 2. Gọi API DescribeCaptchaResult

Sau khi client trả về ticketrandstr, server gửi yêu cầu:

  • Action: DescribeCaptchaResult
  • Version: 2019-07-22 (hoặc hiện tại)

Tham số:

CaptchaType - 9 (giá trị cố định)

Ticket - string — ticket từ client

Randstr - string — randstr từ client

CaptchaAppId - AppId của bạn

AppSecretKey - Khóa bí mật của bạn

UserIp - IP người dùng (khuyến nghị)

Bước 3. Xử lý kết quả

API trả về:

  • CaptchaCode: integerkết quả xác thực.
  • 0 (hoặc OK) — captcha hợp lệ, ticket hợp lệ

Nếu CaptchaCode === OK, người dùng được xem là đã xác thực. Nếu không — từ chối.

Ví dụ — kiểm tra ticket trên 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", // vùng, nếu cần
});

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

Thông tin chi tiết hơn về kết nối Tencent CAPTCHA với website có tại tài liệu chính thức.

Background
Các lỗi thường gặp và cách xử lý
Bug Icon
Captcha không tải
(Lỗi 1001, 1002 hoặc thông báo chữ ký không hợp lệ) — nguyên nhân có thể do tham số yêu cầu không chính xác. Hãy đảm bảo rằng CaptchaAppId, AppSecretKey và tất cả các tham số yêu cầu được chỉ định chính xác.
Bug Icon
Ticket/randstr không hợp lệ hoặc trống
Đảm bảo client gửi đúng cả hai tham số.
Bug Icon
Hết thời gian giải
Tăng thời gian chờ phía server.
Kiểm tra độ bền vững của lớp bảo vệ
Sau khi kết nối, đảm bảo bảo vệ hoạt động đúng là quan trọng.
Khuyến nghị về bảo mật và tối ưu
Lưu <b>AppSecretKey</b> chỉ trên server, không gửi tới trình duyệt hoặc nhúng vào JS.
Ghi lại tất cả phản hồi Tencent CAPTCHA, bao gồm mã lỗi, thời gian yêu cầu và tham số xác thực — giúp chẩn đoán nhanh hơn.
Sử dụng HTTPS khi gửi tất cả tham số <b>(ticket, randstr)</b> để tránh giả mạo.
Đặt link chính xác tới <b>Chính sách bảo mật</b> và <b>Điều khoản sử dụng Tencent</b> trên trang, theo yêu cầu giấy phép.
Kết luận

Nếu bạn tiếp quản một trang web đã được cài sẵn captcha hoặc một hệ thống bảo vệ khác nhưng lại không có quyền truy cập vào mã nguồn thì cũng không có gì đáng lo! Việc xác định chính xác công nghệ nào đang được sử dụng khá đơn giản. Để kiểm tra xem mọi thứ có hoạt động đúng hay không, bạn có thể dùng dịch vụ nhận dạng CapMonster Cloud trong một môi trường thử nghiệm tách biệt nhằm đảm bảo cơ chế xử lý token và logic kiểm tra đang vận hành chính xác.

Với TenDI (Tencent), bạn chỉ cần nhận diện hệ thống, quan sát hành vi của nó và xác nhận rằng lớp bảo vệ hoạt động đúng cách. Trong bài viết này, chúng tôi đã chỉ ra cách nhận biết TenDI (Tencent) và nơi tìm hướng dẫn tích hợp hoặc cấu hình lại, giúp bạn tự tin duy trì lớp bảo vệ và kiểm soát hoạt động của nó.

Conclusion
Liên kết hữu ích
DocIconTài liệu TenDI (Tencent) CAPTCHADocIconTài liệu CapMonster Cloud (làm việc với Tencent CAPTCHA)DocIconTencent Captcha (TenDI) là gì và cách giải?