W tym artykule staraliśmy się odpowiedzieć na wszystkie najważniejsze pytania. Pierwszym krokiem w rozwiązywaniu problemu jest ustalenie, jaki system ochrony jest używany. W tym celu możesz skorzystać z listy popularnych captcha i systemów ochrony antybotowej, gdzie znajdziesz przykłady graficzne oraz kluczowe cechy, które pomogą szybko rozpoznać, z czym masz do czynienia.
Jeśli okaże się, że na Twojej stronie używany jest DataDome CAPTCHA, kolejnym krokiem będzie dokładniejsze poznanie jej właściwości i sposobu działania. W tym artykule możesz również zapoznać się z instrukcją integracji systemu DataDome CAPTCHA, aby w pełni zrozumieć, jak funkcjonuje on na Twojej stronie. Dzięki temu nie tylko lepiej poznasz obecną ochronę, ale też świadomie zaplanujesz jej dalsze utrzymanie.
Praca z CapMonster Cloud poprzez API zazwyczaj obejmuje następujące kroki:
type - CustomTask
class - DataDome
websiteURL - adres głównej strony, na której rozwiązywana jest CAPTCHA.
captchaUrl (w metadata) - "captchaUrl" - link do CAPTCHA. Zwykle w formacie: "https://geo.captcha-delivery.com/captcha/?initialCid=..."
datadomeCookie (w metadata) - Twoje ciasteczka DataDome. Można je pobrać na stronie przy pomocy document.cookie (jeśli nie mają flagi HttpOnly), z nagłówka Set-Cookie: "datadome=..." lub bezpośrednio z kodu HTML strony initialCid.
userAgent - User-Agent przeglądarki. Używaj tylko aktualnego UA z systemu Windows.
Do tego zadania należy również użyć swoich proxy:
proxyType :
proxyAddress - Adres IP proxy IPv4/IPv6.
proxyPort - Port proxy.
proxyLogin - Login do proxy.
proxyPassword - Hasło do proxy.
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';
// Podaj swój klucz API CapMonster Cloud
const API_KEY = 'YOUR_API_KEY';
// Twoja strona jest chroniona przez DataDome
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
// Konfiguracja proxy
const proxy = {
proxyType: "http",
proxyAddress: '8.8.8.8',
proxyPort: 8080,
proxyLogin: 'proxyLogin',
proxyPassword: 'proxyPassword'
};
async function main() {
// Uruchamiamy przeglądarkę
const browser = await chromium.launch({ headless: true });
const context = await browser.newContext({ userAgent: USER_AGENT });
const page = await context.newPage();
// Przechodzimy na stronę
await page.goto(TARGET_URL, { waitUntil: 'networkidle' });
// Szukamy już ustawionego ciasteczka datadome (jeśli istnieje)
const existingDd = (await context.cookies()).find(c => /datadome|dd_/i.test(c.name));
// Szukamy iframe DataDome -> URL CAPTCHA
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(`=== Wyciągnięte parametry DataDome ===`);
console.log(`captchaUrl:`, captchaUrl || 'nie znaleziono');
console.log(`aktualne ciasteczko datadome::`, existingDd ? ${existingDd.name}=${existingDd.value}` : 'brak');
const cm = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: API_KEY })
);
// Wysyłamy zadanie do CapMonster
console.log(`Wysyłamy zadanie DataDome do CapMonster......`);
// Wysyłamy zadanie do rozwiązania DataDome
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;
// Pobieramy domenę i potrzebne ciasteczka z rozwiązania
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=== Ciasteczka z CapMonster ===`);
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));
// Ustawiamy ciasteczko datadome w przeglądarce
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(`Ciasteczko datadome ustawione:`, ddSolved.value);
// Ponownie otwieramy stronę po wstawieniu ciasteczka
const page2 = await context.newPage();
const resp2 = await page2.goto(TARGET_URL, { waitUntil: 'domcontentloaded', timeout: 60000 });
console.log(`Status po ustawieniu ciasteczka:: ${resp2?.status()}`);
await browser.close();
}
main();
1. Zaloguj się do swojego konta lub zarejestruj się w DataDome i uzyskaj klucze (client-side i server-side).
Ważne: do rejestracji należy użyć firmowego maila służbowego.
Po rejestracji trafisz do panelu administracyjnego.
2. Podłącz stronę (domenę) w panelu DataDome.
Dodaj swoją domenę do systemu i wybierz parametry ochrony:
3. Zainstaluj integrację po stronie serwera.
Użyj Protection API lub wybierz gotowy moduł dla swojego stacka (Node.js / Express, Nginx, Cloudflare, Java (Tomcat/Jetty/Vert.x), Go itp.).
Zainstaluj oficjalne SDK / middleware DataDome, skonfiguruj server key w ustawieniach.
Przykład integracji DataDome w Node.js:
DataDome chroni serwer przed botami i podejrzanymi żądaniami, automatycznie pokazując challenge (CAPTCHA) w razie potrzeby. Moduł można używać z Express lub wbudowanym serwerem HTTP Node.js.
Instalacja
Dla Express:
npm install @datadome/module-expressDla modułu HTTP Node.js:
npm install @datadome/module-httpObsługiwane wersje Node.js: 18+. Wymagany server-side key z panelu DataDome.
const { DatadomeExpress } = require('@datadome/module-express');
const express = require('express');
const app = express();
// Inicjalizacja klienta DataDome
const datadomeClient = new DatadomeExpress('YOUR_SERVER_KEY');
// Podłączenie middleware
app.use(datadomeClient.middleware());
// Twoje trasy
app.get('/', (req, res) => {
res.send('Hello World');
});
// Uruchomienie serwera
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}/`);
});Ustawienia modułu
Możesz przekazać konfigurację przy tworzeniu klienta:
const datadomeClient = new DatadomeExpress('YOUR_SERVER_KEY', {
timeout: 150, // timeout w ms, po którym żądanie jest przepuszczane
urlPatternInclusion: null, // które URL-e sprawdzać
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',
});Rozszerzone możliwości:
Więcej szczegółów o integracji serwerowej w oficjalnej dokumentacji.
4. Podłącz część kliencką.
Wstaw JS Tag w <head> swojej strony:
<head>
<script>
window.ddjskey = 'YOUR_DATADOME_JS_KEY';
window.ddoptions = {
// Dodaj tu swoje ustawienia (opcjonalnie)
};
</script>
<script src="https://js.datadome.co/tags.js" async></script>
<!-- Pozostałe elementy head -->
</head>
YOUR_DATADOME_JS_KEY → Zamień na swój Client-Side Key.
Skrypt najlepiej ładować na początku <head>, aby DataDome mógł przechwytywać żądania i prawidłowo śledzić zachowanie użytkowników.
Jeśli strona używa CSP, dodaj następujące dyrektywy:
<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; /* do wysyłania danych JS Tag */
frame-src *.captcha-delivery.com; /* dla stron challenge */
worker-src blob:; /* dla web workers */
Więcej szczegółów o integracji części klienckiej w oficjalnej dokumentacji DataDome CAPTCHA.
Sprawdzenie wyniku
DataDome tworzy ciasteczko datadome= po pomyślnym przejściu weryfikacji. To ciasteczko jest automatycznie wysyłane przez użytkownika — a serwer przepuszcza żądanie. Jeśli ciasteczka nie ma lub jest nieważne, DataDome ponownie wyświetli challenge.
Jeśli przejąłeś stronę internetową, na której jest już zainstalowany captcha lub inny system zabezpieczeń, a jednocześnie nie masz dostępu do kodu — to nic strasznego! Dość łatwo jest ustalić, jaka dokładnie technologia jest używana. Aby sprawdzić poprawność działania, możesz skorzystać z usługi rozpoznawania CapMonster Cloud w odizolowanym środowisku testowym, żeby upewnić się, że mechanizm przetwarzania tokenów i logika weryfikacji działają prawidłowo.
W przypadku DataDome CAPTCHA wystarczy rozpoznać system, przeanalizować jego zachowanie i upewnić się, że zabezpieczenie działa poprawnie. W artykule pokazaliśmy, jak zidentyfikować DataDome CAPTCHA oraz gdzie znaleźć instrukcje dotyczące jego podłączenia lub ponownej konfiguracji, aby móc pewnie utrzymywać ochronę i kontrolować jej działanie.