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 DataDome CAPTCHA kullanıldığını fark ederseniz, bir sonraki adım özelliklerini ve çalışma şeklini daha ayrıntılı incelemek olacaktır. Yine bu makalede, DataDome CAPTCHA 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 - DataDome
websiteURL - CAPTCHA'nın çözüldüğü ana sayfanın adresi.
captchaUrl (metadata içinde) - "captchaUrl" - CAPTCHA linki. Genellikle şu formatta olur: "https://geo.captcha-delivery.com/captcha/?initialCid=..."
datadomeCookie (metadata içinde) - DataDome cookie'leriniz. document.cookie üzerinden (HttpOnly değilse), Set-Cookie başlığında: "datadome=..." veya doğrudan sayfanın HTML kodundan initialCid olarak alınabilir.
userAgent - Tarayıcı User-Agent. Sadece geçerli UA'yı kullanın (Windows).
Bu görev için kendi proxylerinizi de kullanmanız gerekir:
proxyType :
proxyAddress - Proxy IPv4/IPv6 IP adresi.
proxyPort - Proxy portu.
proxyLogin - Proxy sunucu kullanıcı adı.
proxyPassword - Proxy sunucu şifresi.
https://api.capmonster.cloud/createTask
{
"clientKey": "API_KEY",
"task": {
"type": "CustomTask",
"class": "DataDome",
"websiteURL": "https://example.com",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36",
"metadata": {
"captchaUrl": "https://geo.captcha-delivery.com/interstitial/?initialCid=AHrlqAAAAAMA9UvsL58YLqIAXNLFPg%3D%3D&hash=C0705ACD75EBF650A07FF8291D3528&cid=7sfa5xUfDrR4bQTp1c2mhtiD7jj9TXExcQypjdNAxKVFyIi1S9tE0~_mqLa2EFpOuzxKcZloPllsNHjNnqzD9HmBA4hEv7SsEyPYEidCBvjZEaDyfRyzefFfolv0lAHM&referer=https%3A%2F%2Fwww.example.com.au%2F&s=6522&b=978936&dm=cm",
"datadomeCookie": "datadome=VYUWrgJ9ap4zmXq8Mgbp...64emvUPeON45z"
},
"proxyType": "http",
"proxyAddress": "123.45.67.89",
"proxyPort": 8080,
"proxyLogin": "proxyUsername",
"proxyPassword": "proxyPassword"
}
}
{
"errorId":0,
"taskId":407533072
}https://api.capmonster.cloud/getTaskResult{
"clientKey":"API_KEY",
"taskId": 407533072
}
{
"errorId": 0,
"status": "ready",
"solution": {
"domains": {
"www.example.com": {
"cookies": {
"datadome": "P1w0VnjFcTFslfps0J4FaPpY_QPbPBW4MeYxj4LW~pztIfJiSSuBPr8oQTUHzdrfgv137FbOBd3kCUOOgny7LhIkhm5e1qdtzYM4s2e46U_qfERK4KiCy22MOSIDsDyh"
},
"localStorage": null
}
},
"url": null,
"fingerprint": null,
"headers": null,
"data": null
}
}
// npx playwright install chromium
import { chromium } from 'playwright';
import { CapMonsterCloudClientFactory, ClientOptions, DataDomeRequest } from '@zennolab_com/capmonstercloud-client';
// CapMonster Cloud API anahtarınızı girin
const API_KEY = 'YOUR_API_KEY';
// Siteniz DataDome ile korunuyor
const TARGET_URL = 'https://example.com/';
const USER_AGENT = Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36
// Proxy yapılandırması
const proxy = {
proxyType: "http",
proxyAddress: '8.8.8.8',
proxyPort: 8080,
proxyLogin: 'proxyLogin',
proxyPassword: 'proxyPassword'
};
async function main() {
// Tarayıcı başlatılıyor
const browser = await chromium.launch({ headless: true });
const context = await browser.newContext({ userAgent: USER_AGENT });
const page = await context.newPage();
// Siteye gidiliyor
await page.goto(TARGET_URL, { waitUntil: 'networkidle' });
// Mevcut datadome cookie aranıyor (varsa)
const existingDd = (await context.cookies()).find(c => /datadome|dd_/i.test(c.name));
// DataDome iframe -> CAPTCHA URL'si aranıyor
const captchaUrl = await page.evaluate(() =>
Array.from(document.querySelectorAll('iframe[src]'))
.find(i => /captcha-delivery\.com\/captcha/i.test(i.src))
?.src || null
);
console.log(`=== DataDome parametreleri çıkarıldı ===`);
console.log(`captchaUrl:`, captchaUrl || 'bulunamadı');
console.log(`Mevcut datadome cookie::`, existingDd ? ${existingDd.name}=${existingDd.value}` : 'yok');
const cm = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: API_KEY })
);
// Görev CapMonster'a gönderiliyor
console.log(`DataDome görevi CapMonster'a gönderiliyor......`);
// DataDome çözüm görevi gönderiliyor
const solve = await cm.Solve(new DataDomeRequest({
_class: "DataDome",
websiteURL: TARGET_URL,
userAgent: USER_AGENT,
proxy,
metadata: {
captchaUrl: captchaUrl || undefined,
datadomeCookie: existingDd
? `${existingDd.name}=${existingDd.value}`
: undefined
}
}));
const sol = solve?.solution;
// Çözümden alan ve gerekli cookie'ler alınıyor
const host = new URL(TARGET_URL).hostname;
const domainKey =
Object.keys(sol.domains).find(d => d.includes(host))
|| Object.keys(sol.domains)[0];
const cookiesArr = sol.domains[domainKey]?.cookies || [];
console.log(`\n=== CapMonster cookie'leri ===`);
cookiesArr.forEach(c => console.log(`${c.name}=${c.value}`));
const ddSolved =
cookiesArr.find(c => c.name?.toLowerCase() === 'datadome')
|| cookiesArr.find(c => /datadome/i.test(c.name));
// Datadome cookie tarayıcıya kuruluyor
await context.addCookies([{
name: 'datadome',
value: ddSolved.value,
domain: '.' + host,
path: '/',
httpOnly: ddSolved.httpOnly ?? true,
secure: ddSolved.secure ?? true,
sameSite: ddSolved.sameSite ?? 'Lax'
}]);
console.log(`Datadome cookie kuruldu:`, ddSolved.value);
// Cookie ekledikten sonra site tekrar açılıyor
const page2 = await context.newPage();
const resp2 = await page2.goto(TARGET_URL, { waitUntil: 'domcontentloaded', timeout: 60000 });
console.log(`Cookie sonrası durum:: ${resp2?.status()}`);
await browser.close();
}
main();
1. Hesabınıza giriş yapın veya kaydolun ve client-side ve server-side anahtarları alın.
Önemli: Kayıt için şirketinize ait kurumsal e-posta kullanın.
Kayıttan sonra yönetim paneline erişebilirsiniz.
2. Panelde siteyi (alan adını) ekleyin.
Sisteme alan adınızı ekleyin ve koruma parametrelerini seçin:
3. Sunucu tarafında entegrasyonu kurun.
Protection API kullanın veya Node.js / Express, Nginx, Cloudflare, Java (Tomcat/Jetty/Vert.x), Go vb. için hazır modül seçin.
Resmi DataDome SDK / middleware'i kurun, server-side key'i yapılandırın.
Node.js'de DataDome entegrasyon örneği:
DataDome sunucuyu botlardan ve şüpheli isteklerden korur, gerekirse challenge gösterir. Modül Express veya entegre HTTP sunucu ile kullanılabilir Node.js.
Kurulum
Express için:
npm install @datadome/module-expressNode.js HTTP modülü için:
npm install @datadome/module-httpNode.js 18+ desteklenir. DataDome panelinden sunucu anahtarı gereklidir.
const { DatadomeExpress } = require('@datadome/module-express');
const express = require('express');
const app = express();
// DataDome istemcisini başlatma
const datadomeClient = new DatadomeExpress('YOUR_SERVER_KEY');
// Middleware bağlama
app.use(datadomeClient.middleware());
// Rotalarınız
app.get('/', (req, res) => {
res.send('Hello World');
});
// Sunucu başlatma
app.listen(3000, () => {
console.log('Server running on port 3000');
})
const { DatadomeHttp } = require('@datadome/module-http');
const http = require('http');
const datadomeClient = new DatadomeHttp('YOUR_SERVER_KEY');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer(async (req, res) => {
const { result, error } = await datadomeClient.handleRequest(req, res);
if (result === 'ALLOW') {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
} else {
console.log('Request challenged');
if (error) console.error(error);
}
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});Modül ayarları
İstemci oluştururken yapılandırmayı geçebilirsiniz:
const datadomeClient = new DatadomeExpress('YOUR_SERVER_KEY', {
timeout: 150, // İsteğin geçmesine izin verilen ms cinsinden timeout
urlPatternInclusion: null, // Hangi URL'ler kontrol edilecek
urlPatternExclusion: /\.(avi|flv|mka|mkv|mov|mp4|mpeg|mpg|mp3|flac|ogg|ogm|opus|wav|webm|webp|bmp|gif|ico|jpeg|jpg|png|svg|svgz|swf|eot|otf|ttf|woff|woff2|css|less|js|map|json|avif|xml|gz|zip)$/i,
endpointHost: 'api.datadome.co',
});Gelişmiş seçenekler:
Sunucu entegrasyonu hakkında daha fazla bilgi için resmi dokümantasyon.
4. İstemci tarafını bağlayın.
JS Tag'i sitenizin <head> kısmına ekleyin:
<head>
<script>
window.ddjskey = 'YOUR_DATADOME_JS_KEY';
window.ddoptions = {
// Ayarlarınızı buraya ekleyin (opsiyonel)
};
</script>
<script src="https://js.datadome.co/tags.js" async></script>
<!-- Diğer head öğeleri -->
</head>
YOUR_DATADOME_JS_KEY → Client-Side Key ile değiştirin.
Script <head>'in başında yüklenmeli, böylece DataDome istekleri yakalayabilir ve kullanıcı davranışını doğru şekilde izleyebilir.
Site CSP kullanıyorsa, aşağıdaki direktifleri ekleyin:
<script nonce="DYNAMIC_NONCE">
window.ddjskey = 'YOUR_DATADOME_JS_KEY';
window.ddoptions = {};
</script>
script-src js.datadome.co ct.captcha-delivery.com 'nonce-DYNAMIC_NONCE';
connect-src api-js.datadome.co; /* JS Tag verilerini göndermek için */
frame-src *.captcha-delivery.com; /* Challenge sayfaları için */
worker-src blob:; /* Web workers için */
İstemci entegrasyonu hakkında daha fazla bilgi için DataDome CAPTCHA resmi dokümantasyon.
Sonuç kontrolü
DataDome, başarılı doğrulamadan sonra datadome= çerezini oluşturur. Bu çerez kullanıcı tarafından otomatik olarak gönderilir ve sunucu isteğe izin verir. Çerez yoksa veya geçersizse DataDome yeniden bir challenge gösterir.
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.
DataDome CAPTCHA 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, DataDome CAPTCHA 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.