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ý.
Làm việc với CapMonster Cloud qua API thường gồm các bước:
type - CustomTask
class - TenDI
websiteURL - Địa chỉ trang nơi captcha được giải.
websiteKey - captchaAppId. Ví dụ: "websiteKey": "189123456" — tham số duy nhất cho website của bạn
captchaUrl (trong metadata) - Link script captcha. Thường kết thúc bằng TCaptcha.js hoặc TCaptcha-global.js;
websiteURL - Địa chỉ trang nơi captcha được giải;
userAgent (tùy chọn) - User-Agent trình duyệt. Chỉ gửi UA hiện tại từ Windows.
https://api.capmonster.cloud/createTask
{
"clientKey": "API_KEY",
"task": {
"type": "CustomTask",
"class": "TenDI",
"websiteURL": "https://example.com",
"websiteKey": "189123456",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36",
"metadata": {
"captchaUrl": "https://global.captcha.example.com/TCaptcha-global.js"
}
}
}
{
"errorId":0,
"taskId":407533072
}https://api.capmonster.cloud/getTaskResult{
"clientKey":"API_KEY",
"taskId": 407533072
}
{
"errorId":0,
"status":"ready",
"solution": {
"data": {
"randstr": "@EcL",
"ticket": "tr03lHUhdnuW3neJZu.....7LrIbs*"
},
"headers": {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36"
}
}
}
// 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);
Bạn sẽ nhận hai tham số: CaptchaAppId và AppSecretKey. Dùng trên frontend và server.
Click sẽ hiển thị captcha và sau khi giải xong, kết quả hiện trên console.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Captcha Example</title>
// Bắt buộc tải JS captcha
<script src="https://ca.turing.captcha.qcloud.com/TJNCaptcha-global.js"></script>
</head>
<body>
<div id="cap_iframe"></div>
<button id="CaptchaId">Verification</button>
<script>
// Xử lý kết quả
function callback(res) {
console.log("callback:", res);
if (res.ret === 0) {
// Xác thực thành công
const text = `[randstr] ${res.randstr} | [ticket] ${res.ticket}`;
const input = document.createElement("input");
input.value = text;
document.body.appendChild(input);
input.select();
document.execCommand("Copy");
document.body.removeChild(input);
alert("Ticket và randstr được sao chép vào clipboard.");
}
}
// Xử lý lỗi tải script captcha
function loadErrorCallback() {
const appid = "CaptchaAppId";
const ticket = `trerror_1001_${appid}_1769260365`;
callback({
ret: 0,
randstr: "@" + Math.random().toString(36).slice(2),
ticket,
errorCode: 1001,
errorMessage: "jsload_error",
});
}
window.onload = function () {
document.getElementById("CaptchaId").onclick = function () {
try {
const captcha = new TencentCaptcha(
document.getElementById("cap_iframe"),
"Your CaptchaAppId",
callback,
{}
);
captcha.show();
} catch (e) {
loadErrorCallback();
}
};
};
</script>
</body>
</html>
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:
trerror_<errorcode>_<appid>_<timestamp>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:
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 SecretId và SecretKey cho API. Cần cho các request có ký.
Bước 2. Gọi API DescribeCaptchaResult
Sau khi client trả về ticket và randstr, server gửi yêu cầu:
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ề:
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;
}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.
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ó.