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.
Jak rozwiązać CAPTCHA DataDome za pomocą CapMonster Cloud
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 :
- http - standardowy proxy HTTP/HTTPS;
- https - wypróbuj, jeśli „http” nie działa (wymagane dla niektórych niestandardowych proxy);
- socks4 - proxy typu SOCKS4;
- socks5 - proxy typu SOCKS5.
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/150.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/150.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:
- Ochrona sieci Web (HTTP traffic protection)
- Bot detection & mitigation
- Frequency & behavior analysis
- Strony challenge (strona weryfikacji DataDome)
- JS tag configuration
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:
- Logowanie nagłówków DataDome (enrichedHeaders)
- CSP nonce: app.use(datadomeClient.middleware({ nonce: 'VALUE' }))
- Nadpisanie metadanych żądania przez handlers
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.
Obsługiwane captchas
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.