In questo articolo abbiamo cercato di rispondere a tutte le domande principali. Il primo passo per risolvere il problema è capire quale sistema di protezione viene utilizzato. A questo scopo puoi consultare l’elenco dei captcha e dei sistemi di protezione antibot più diffusi, dove trovi esempi visivi e caratteristiche chiave che ti aiutano a identificare rapidamente con cosa hai a che fare.
Se scopri che sul tuo sito viene utilizzato TenDI (Tencent), il passo successivo è analizzarne più nel dettaglio le proprietà e il funzionamento. In questo stesso articolo puoi anche studiare la guida all’integrazione di TenDI (Tencent), per comprendere a fondo come opera sul tuo sito. Questo ti permetterà non solo di capire la protezione attuale, ma anche di pianificarne correttamente la manutenzione.
Lavorare con CapMonster Cloud via API di solito prevede i seguenti passaggi:
type - CustomTask
class - TenDI
websiteURL - l'indirizzo della pagina in cui viene risolto il captcha.
websiteKey - captchaAppId. Ad esempio "websiteKey": "189123456" — parametro unico per il tuo sito
captchaUrl (all'interno dei metadata) - link allo script del captcha. Di solito termina con TCaptcha.js o TCaptcha-global.js;
websiteURL - l'indirizzo della pagina in cui viene risolto il captcha;
userAgent (opzionale) - User-Agent del browser. Invia solo un UA reale e aggiornato da 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';
// Sostituisci con i tuoi valori
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. Apri la pagina
await page.goto(WEBSITE_URL, { waitUntil: 'networkidle' });
// 2. Attendi la comparsa del captcha (es: input o iframe)
await page.waitForSelector('#tendi_response, iframe[src*="tendi"], input[name="tendi_response"]', { timeout: 15000 });
// Se necessario, puoi estrarre il websiteKey direttamente dalla pagina
const WEBSITE_KEY = await page.evaluate(() => {
// Esempio: sitekey potrebbe essere in un attributo data o in una variabile globale
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. Crea un task TenDI
const tenDIRequest = new TenDIRequest({
websiteURL: page.url(),
websiteKey: WEBSITE_KEY,
});
const balance = await client.getBalance();
console.log("Balance:", balance);
// 4. Risolvi il captcha
const solution = await client.Solve(tenDIRequest);
console.log("Solution:", solution);
const { ticket, randstr } = solution.solution.data;
// 5. Modi per inserire il risultato
await page.evaluate(({ ticket, randstr }) => {
// Inserimento in 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;
}
}
// Funzione callback JS
if (typeof window.onCaptchaSolved === 'function') {
window.onCaptchaSolved(ticket, randstr);
inserted = true;
}
// Se non ci sono input o 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);
Riceverai due parametri: CaptchaAppId e AppSecretKey. Li userai sia nel frontend che nel server.
Al click appare il captcha e, dopo la risoluzione, il risultato viene mostrato nella console.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Captcha Example</title>
// Caricamento obbligatorio del JS del 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>
// Elaborazione del risultato
function callback(res) {
console.log("callback:", res);
if (res.ret === 0) {
// Verifica completata
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 e randstr copiati negli appunti.");
}
}
// Gestione errori caricamento script captcha
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>
Come funziona l'integrazione
Step 1: Caricare il JS del captcha
Lo script deve essere caricato dinamicamente:
<script src="https://ca.turing.captcha.qcloud.com/TJNCaptcha-global.js"></script>Se lo script viene caricato in modo non standard o messo in cache, il captcha potrebbe non funzionare correttamente.
Step 2: Creare oggetto TencentCaptcha
Dopo il caricamento del JS appare una classe globale:
<script src="new TencentCaptcha(domElement, CaptchaAppId, callback, options);"></script>Parametri:
domElement - Container dove viene inserito checkbox/iframe
CaptchaAppId - Il tuo ID
callback - Cosa fare dopo la verifica
options - Impostazioni visive (opzionale)
Step 3: Chiamare il metodo .show()
captcha.show();Mostra il captcha. Può essere chiamato più volte.
Step 4: Elaborare il risultato
Il callback riceve un oggetto:
{
ret: 0, // 0 -- successo, 2 -- l'utente ha chiuso la finestra
ticket: "...", // necessario al server
randstr: "...", // necessario anche al server
errorCode: 1001, // se il captcha non è caricato
errorMessage: "..." // messaggio di errore
}Sul server eseguire sempre una verifica secondaria del ticket.
Modalità "Disaster Recovery"
Se il captcha non viene caricato (es: CDN non disponibile), è possibile generare automaticamente un "ticket di emergenza" per non interrompere il processo aziendale.
Scenario:
trerror_<errorcode>_<appid>_<timestamp>Crittografia AppId (opzionale)
Per la massima protezione, è possibile inviare al captcha una versione crittografata di AppId invece di quella aperta:
aidEncrypted = Base64(IV + AES256(AppId & timestamp & ttl))Necessario:
Esempio di crittografia lato server (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")Validazione lato server
Step 1. Configurazione accesso API
Nel pannello gestione chiavi (CAM / API Key Management) ottieni SecretId e SecretKey. Queste chiavi servono per richieste API firmate.
Step 2. Chiamare API DescribeCaptchaResult
Dopo che il client ha restituito ticket e randstr, il server deve inviare la richiesta:
Parametri:
CaptchaType - 9 (valore fisso)
Ticket - string — ticket, restituito dal client
Randstr - string — randstr, restituito dal client
CaptchaAppId - tuo AppId
AppSecretKey - tua chiave segreta
UserIp - IP utente (consigliato)
Step 3. Elaborare risposta
L'API restituisce:
Se CaptchaCode === OK, l'utente è considerato verificato. Altrimenti — rifiutare.
Esempio — verifica 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", // regione, se necessaria
});
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;
}Ulteriori informazioni sull'integrazione di Tencent CAPTCHA sul tuo sito sono disponibili nella documentazione ufficiale.
Se ti è capitato un sito con un captcha o un altro sistema di protezione già installato e senza accesso al codice, nessun problema! È piuttosto facile capire quale tecnologia viene utilizzata. Per verificare che tutto funzioni correttamente, puoi usare il servizio di riconoscimento CapMonster Cloud in un ambiente di test isolato, così da assicurarti che il meccanismo di elaborazione dei token e la logica di verifica funzionino correttamente.
Nel caso di TenDI (Tencent), è sufficiente individuare il sistema, analizzarne il comportamento e assicurarsi che la protezione funzioni correttamente. Nell’articolo abbiamo mostrato come riconoscere TenDI (Tencent) e dove trovare le istruzioni per la sua integrazione o riconfigurazione, in modo da poter mantenere la protezione in modo affidabile e controllarne il funzionamento.