Bu makalede tüm önemli sorulara cevap vermeye çalıştık. Bir problemi çözmeye başlamanın ilk adımı, hangi koruma sisteminin kullanıldığını belirlemektir. Bunun için, görsel örneklerin ve neyle karşı karşıya olduğunuzu hızlıca anlamanıza yardımcı olabilecek temel işaretlerin yer aldığı popüler captcha ve anti-bot koruma sistemleri listesine başvurabilirsiniz.
Sitenizde TenDI (Tencent) kullanıldığını fark ederseniz, bir sonraki adım özelliklerini ve çalışma şeklini daha ayrıntılı incelemek olacaktır. Yine bu makalede, TenDI (Tencent) sisteminin entegrasyonuna ilişkin kılavuzu da bulabilir ve böylece sitenizde nasıl çalıştığını tamamen anlayabilirsiniz. Bu da yalnızca mevcut korumayı anlamanıza değil, aynı zamanda bakımını doğru şekilde planlamanıza da yardımcı olur.
CapMonster Cloud API ile çalışma genellikle şu adımlardan oluşur:
type - CustomTask
class - TenDI
websiteURL - Captcha'nın çözüldüğü sayfanın adresi.
websiteKey - captchaAppId. Örneğin "websiteKey": "189123456" — sitenize özel benzersiz parametre
captchaUrl (metadata içinde) - Captcha script bağlantısı. Genellikle TCaptcha.js veya TCaptcha-global.js ile biter;
websiteURL - Captcha'nın çözüldüğü sayfanın adresi;
userAgent (isteğe bağlı) - Tarayıcı User-Agent. sadece geçerli UA'yı gönderin (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';
// Kendi değerleriniz ile değiştirin
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. Sayfayı açıyoruz
await page.goto(WEBSITE_URL, { waitUntil: 'networkidle' });
// 2. Captcha'nın görünmesini bekleyin (input veya iframe)
await page.waitForSelector('#tendi_response, iframe[src*="tendi"], input[name="tendi_response"]', { timeout: 15000 });
// Gerekirse websiteKey sayfadan çıkarılabilir
const WEBSITE_KEY = await page.evaluate(() => {
// Örnek: sitekey data-attribute veya global değişkende olabilir
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 görevi oluşturun
const tenDIRequest = new TenDIRequest({
websiteURL: page.url(),
websiteKey: WEBSITE_KEY,
});
const balance = await client.getBalance();
console.log("Balance:", balance);
// 4. Captcha'yı çözün
const solution = await client.Solve(tenDIRequest);
console.log("Solution:", solution);
const { ticket, randstr } = solution.solution.data;
// 5. Çözüm sonucunu yerleştirme yöntemleri
await page.evaluate(({ ticket, randstr }) => {
// Input'a yerleştirme
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 fonksiyonu
if (typeof window.onCaptchaSolved === 'function') {
window.onCaptchaSolved(ticket, randstr);
inserted = true;
}
// Input veya callback yoksa
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);
Size iki parametre verilecektir: CaptchaAppId ve AppSecretKey. Bunları frontend ve sunucuda kullanacaksınız.
Tıklayınca captcha görünür ve çözümü sonrası sonuç konsolda görüntülenir.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Captcha Example</title>
// Captcha JS yüklemesi zorunludur
<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>
// Sonucun işlenmesi
function callback(res) {
console.log("callback:", res);
if (res.ret === 0) {
// Başarılı doğrulama
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 ve randstr panoya kopyalanır.");
}
}
// Captcha script yükleme hatalarının işlenmesi
function loadErrorCallback() {
const appid = "CaptchaAppId";
const ticket = `trerror_1001_${appid}_1769260299`;
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>
Entegrasyon nasıl çalışır
Adım 1: Captcha JS yükleme
Script dinamik olarak yüklenmelidir:
<script src="https://ca.turing.captcha.qcloud.com/TJNCaptcha-global.js"></script>Standart olmayan yüklemeler veya cache captcha'nın hatalı çalışmasına neden olabilir.
Adım 2: TencentCaptcha nesnesini oluşturun
JS yüklendikten sonra global bir sınıf görünür:
<script src="new TencentCaptcha(domElement, CaptchaAppId, callback, options);"></script>Parametreler:
domElement - Checkbox/iframe’in yerleştirileceği container
CaptchaAppId - ID’niz
callback - Doğrulamadan sonra yapılacak işlemler
options - Görünüm ayarları (isteğe bağlı)
Adım 3: Metodu çağırın .show()
captcha.show();Captcha’yı gösterir. Tekrar tekrar çağrılabilir.
Adım 4: Sonucu işleyin
Callback bir obje alır:
{
ret: 0, // 0 -- başarılı, 2 -- kullanıcı pencereyi kapattı
ticket: "...", // sunucuya gerekli
randstr: "...", // sunucuya da gerekli
errorCode: 1001, // captcha yüklenmediyse
errorMessage: "..." // hata mesajı
}Sunucuda ticket ikinci doğrulaması mutlaka yapılmalıdır.
"Acil durum modu"
Captcha yüklenmezse (örneğin CDN erişilemez), iş sürecini bozmamak için otomatik 'acil bilet' oluşturabilirsiniz.
Senaryo:
trerror_<errorcode>_<appid>_<timestamp>AppId Şifreleme (opsiyonel)
Maksimum koruma için captcha’ya açık AppId yerine şifreli sürümünü gönderebilirsiniz:
aidEncrypted = Base64(IV + AES256(AppId & timestamp & ttl))Gerekli:
Sunucu tarafı şifreleme örneği (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")Sunucu Doğrulaması
Adım 1. API erişimini yapılandırma
Anahtar yönetimi panelinden (CAM / API Key Management) API için SecretId ve SecretKey alın. İmzalı istekler için gereklidir.
Adım 2. API DescribeCaptchaResult çağırma
İstemci ticket ve randstr döndükten sonra sunucu istek gönderir:
Parametreler:
CaptchaType - 9 (sabit değer)
Ticket - string — istemciden dönen ticket
Randstr - string — istemciden dönen randstr
CaptchaAppId - AppId’niz
AppSecretKey - Gizli anahtarınız
UserIp - Kullanıcı IP (önerilir)
Adım 3. Yanıtı işleme
API döndürür:
Eğer CaptchaCode === OK, kullanıcı doğrulanmış kabul edilir. Aksi takdirde — reddet.
Örnek — Node.js'de ticket doğrulama
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", // gerekiyorsa bölge
});
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;
}Tencent CAPTCHA'yı sitenize bağlama hakkında daha fazla bilgi için resmi dokümantasyona bakabilirsiniz.
Kodu üzerinde erişiminiz olmayan, ancak üzerinde zaten bir captcha veya başka bir koruma sistemi kurulmuş bir site devraldıysanız, sorun değil! Hangi teknolojinin kullanıldığını tespit etmek oldukça kolaydır. Çalışmanın düzgün olup olmadığını kontrol etmek için ise, izole bir test ortamında CapMonster Cloud tanıma servisinden yararlanarak, jeton işleme mekanizmasının ve doğrulama mantığının doğru şekilde çalıştığından emin olabilirsiniz.
TenDI (Tencent) söz konusu olduğunda, sistemi tanımlamak, davranışını incelemek ve korumanın düzgün çalıştığını doğrulamak yeterlidir. Bu yazıda, TenDI (Tencent) nasıl tespit edilir ve entegrasyonu ya da yeniden yapılandırılması için talimatların nerede bulunabileceği gösterdik; böylece korumayı güvenle sürdürebilir ve çalışmasını kontrol altında tutabilirsiniz.