In diesem Artikel haben wir versucht, alle wichtigen Fragen zu beantworten. Der erste Schritt bei der Lösung der Aufgabe besteht darin festzustellen, welches Schutzsystem eingesetzt wird. Dazu können Sie die Liste beliebter Captchas und Anti-Bot-Schutzsysteme heranziehen, in der visuelle Beispiele und zentrale Merkmale aufgeführt sind, die Ihnen helfen, schnell zu erkennen, womit Sie es zu tun haben.
Wenn Sie feststellen, dass auf Ihrer Website TenDI (Tencent) eingesetzt wird, besteht der nächste Schritt darin, seine Eigenschaften und Funktionsweise genauer zu untersuchen. Ebenfalls in diesem Artikel finden Sie eine Anleitung zur Integration von TenDI (Tencent), damit Sie vollständig verstehen, wie das System auf Ihrer Website arbeitet. So können Sie nicht nur den aktuellen Schutz besser einschätzen, sondern auch seine Wartung vorausschauend planen.
Die Arbeit mit CapMonster Cloud über die API umfasst in der Regel folgende Schritte:
type - CustomTask
class - TenDI
websiteURL - Adresse der Seite, auf der die Captcha gelöst wird.
websiteKey - captchaAppId. Zum Beispiel "websiteKey": "189123456" — ein eindeutiger Parameter für Ihre Website
captchaUrl (innerhalb von metadata) - Link zum Skript mit der Captcha. Endet in der Regel auf TCaptcha.js oder TCaptcha-global.js;
websiteURL - Adresse der Seite, auf der die Captcha gelöst wird;
userAgent (optional) - User-Agent des Browsers. Übermitteln Sie nur einen aktuellen UA von einem Windows-Betriebssystem.
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';
// Ersetzen Sie dies durch Ihre eigenen Werte
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. Seite öffnen
await page.goto(WEBSITE_URL, { waitUntil: 'networkidle' });
// 2. Auf das Erscheinen der Captcha warten (z. B. input oder iframe)
await page.waitForSelector('#tendi_response, iframe[src*="tendi"], input[name="tendi_response"]', { timeout: 15000 });
// Falls nötig, kann der websiteKey direkt von der Seite extrahiert werden
const WEBSITE_KEY = await page.evaluate(() => {
// Beispiel: Der sitekey kann in einem data-Attribut oder einer globalen Variable enthalten sein
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-Aufgabe erstellen
const tenDIRequest = new TenDIRequest({
websiteURL: page.url(),
websiteKey: WEBSITE_KEY,
});
const balance = await client.getBalance();
console.log("Balance:", balance);
// 4. Captcha lösen
const solution = await client.Solve(tenDIRequest);
console.log("Solution:", solution);
const { ticket, randstr } = solution.solution.data;
// 5. Methoden zum Einfügen des Lösungsergebnisses
await page.evaluate(({ ticket, randstr }) => {
// Einfügen in ein input-Feld
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-Funktion
if (typeof window.onCaptchaSolved === 'function') {
window.onCaptchaSolved(ticket, randstr);
inserted = true;
}
// Wenn weder input noch Callback vorhanden sind
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);
Sie erhalten zwei Parameter: CaptchaAppId und AppSecretKey. Diese werden im Frontend und auf dem Server verwendet.
Beim Klicken erscheint die Captcha, nach erfolgreicher Lösung wird das Ergebnis in der Konsole ausgegeben.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Captcha Example</title>
// Erforderliches Laden des Captcha-JavaScripts
<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>
// Verarbeitung des Ergebnisses
function callback(res) {
console.log("callback:", res);
if (res.ret === 0) {
// Erfolgreiche Verifizierung
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("<b>Ticket</b> und <b<randstr</b> wurden in die Zwischenablage kopiert.");
}
}
// Fehlerbehandlung beim Laden des Captcha-Skripts
function loadErrorCallback() {
const appid = "CaptchaAppId";
const ticket = `trerror_1001_${appid}_1769260289`;
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>
Wie die Integration funktioniert
Schritt 1: Laden des Captcha-JavaScripts
Das Skript muss dynamisch geladen werden:
<script src="https://ca.turing.captcha.qcloud.com/TJNCaptcha-global.js"></script>Wenn das Skript auf nicht standardisierte Weise geladen oder zwischengespeichert wird, kann die Captcha fehlerhaft funktionieren.
Schritt 2: Erstellen eines TencentCaptcha-Objekts
Nach dem Laden des JavaScripts steht eine globale Klasse zur Verfügung:
<script src="new TencentCaptcha(domElement, CaptchaAppId, callback, options);"></script>Parameter:
domElement - Container, in den das Checkbox-/Iframe-Element eingebettet wird
CaptchaAppId - Ihre ID
callback - Aktion nach erfolgreicher Überprüfung
options - Darstellungseinstellungen (optional)
Schritt 3: Methode aufrufen .show()
captcha.show();Zeigt die Captcha an. Kann mehrfach aufgerufen werden.
Schritt 4: Ergebnis verarbeiten
Der Callback erhält ein Objekt:
{
ret: 0, // 0 -- Erfolg, 2 -- Benutzer hat das Fenster geschlossen
ticket: "...", // wird vom Server benötigt
randstr: "...", // wird ebenfalls vom Server benötigt
errorCode: 1001, // wenn die Captcha nicht geladen werden konnte
errorMessage: "..." // Fehlermeldung
}Auf dem Server muss zwingend eine zweite Überprüfung des ticket durchgeführt werden.
„Notfallmodus“ (Disaster Recovery)
Falls die Captcha nicht geladen werden kann (z. B. wenn das CDN nicht erreichbar ist), kann automatisch ein „Notfall-Ticket“ ausgegeben werden, um Geschäftsprozesse nicht zu unterbrechen.
Ablauf:
trerror_<errorcode>_<appid>_<timestamp>Verschlüsselung des AppId (optional)
Wenn maximaler Schutz erforderlich ist, kann statt des offenen AppId eine verschlüsselte Version an die Captcha übergeben werden:
aidEncrypted = Base64(IV + AES256(AppId & timestamp & ttl))Erforderlich:
Serverseitiges Verschlüsselungsbeispiel (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")Serverseitige Validierung
Schritt 1. Einrichtung des API-Zugriffs
Rufen Sie im Verwaltungsbereich Ihrer Schlüssel (CAM / API Key Management) SecretId und SecretKey für die API ab. Diese Schlüssel werden für signierte API-Anfragen benötigt.
Schritt 2. Aufruf der API DescribeCaptchaResult
Nachdem der Client ticket und randstr zurückgegeben hat, muss der Server folgende Anfrage senden:
Parameter:
CaptchaType - 9 (fester Wert)
Ticket - String — ticket, vom Client zurückgegeben
Randstr - String — randstr, vom Client zurückgegeben
CaptchaAppId - Ihre AppId
AppSecretKey - Ihr geheimer Schlüssel
UserIp - IP-Adresse des Benutzers (empfohlen)
Schritt 3. Verarbeitung der Antwort
Die API gibt zurück:
Wenn CaptchaCode === OK, kann davon ausgegangen werden, dass der Benutzer die Prüfung bestanden hat. Andernfalls — ablehnen.
Beispiel — Überprüfung des ticket in 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, falls erforderlich
});
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;
}Weitere Details zur Integration von Tencent CAPTCHA auf Ihrer Website finden Sie in der offiziellen Dokumentation.
Wenn Sie eine Website übernommen haben, auf der bereits ein Captcha oder ein anderes Schutzsystem installiert ist und Sie keinen Zugriff auf den Code haben, ist das kein Problem! Es ist ziemlich einfach festzustellen, welche Technologie genau verwendet wird. Und um die korrekte Funktionsweise zu überprüfen, können Sie den Erkennungsdienst CapMonster Cloud in einer isolierten Testumgebung nutzen, um sicherzustellen, dass der Mechanismus zur Tokenverarbeitung und die Prüflogik ordnungsgemäß funktionieren.
Im Fall von TenDI (Tencent) reicht es aus, das System zu erkennen, sein Verhalten zu analysieren und sich zu vergewissern, dass der Schutz korrekt arbeitet. In diesem Artikel haben wir gezeigt, wie Sie TenDI (Tencent) identifizieren und wo Sie Anleitungen für die Einbindung oder Neukonfiguration finden, damit Sie den Schutz zuverlässig betreiben und seine Arbeit unter Kontrolle halten können.