Trong bài viết này, chúng tôi đã cố gắng trả lời tất cả những câu hỏi quan trọng. Bước đầu tiên để bắt đầu giải quyết vấn đề là xác định hệ thống bảo mật nào đang được sử dụng. Để làm điều đó, bạn có thể tham khảo danh sách các captcha và hệ thống chống bot phổ biến, trong đó có các ví dụ minh họa và những dấu hiệu chính giúp bạn nhanh chóng nhận biết mình đang làm việc với giải pháp nào.
Nếu bạn phát hiện trang web của mình đang sử dụng DataDome CAPTCHA, bước tiếp theo là tìm hiểu chi tiết hơn về các đặc tính và cách hoạt động của nó. Ngay trong bài viết này, bạn cũng có thể xem hướng dẫn tích hợp hệ thống DataDome CAPTCHA để hiểu đầy đủ cách nó vận hành trên trang web của bạn. Điều đó giúp bạn không chỉ nắm rõ lớp bảo vệ hiện tại mà còn lập kế hoạch bảo trì một cách hợp lý.
Làm việc với CapMonster Cloud qua API thường gồm các bước:
type - CustomTask
class - DataDome
websiteURL - Địa chỉ trang chính nơi CAPTCHA được giải.
captchaUrl (trong metadata) - "captchaUrl" - liên kết đến CAPTCHA. Thường có dạng: "https://geo.captcha-delivery.com/captcha/?initialCid=..."
datadomeCookie (trong metadata) - Cookie DataDome của bạn. Có thể lấy từ document.cookie (nếu không HttpOnly), trong header Set-Cookie: "datadome=...", hoặc trực tiếp từ HTML của trang initialCid.
userAgent - User-Agent trình duyệt. Chỉ sử dụng UA hiện tại từ Windows.
Cũng cần sử dụng proxy của bạn cho tác vụ này:
proxyType :
proxyAddress - Địa chỉ IP của proxy IPv4/IPv6.
proxyPort - Cổng proxy.
proxyLogin - Tên đăng nhập proxy.
proxyPassword - Mật khẩu 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';
// Nhập API key CapMonster Cloud của bạn
const API_KEY = 'YOUR_API_KEY';
// Website của bạn được bảo vệ bởi 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
// Cấu hình proxy
const proxy = {
proxyType: "http",
proxyAddress: '8.8.8.8',
proxyPort: 8080,
proxyLogin: 'proxyLogin',
proxyPassword: 'proxyPassword'
};
async function main() {
// Khởi chạy trình duyệt
const browser = await chromium.launch({ headless: true });
const context = await browser.newContext({ userAgent: USER_AGENT });
const page = await context.newPage();
// Truy cập website
await page.goto(TARGET_URL, { waitUntil: 'networkidle' });
// Tìm cookie datadome đã có (nếu có)
const existingDd = (await context.cookies()).find(c => /datadome|dd_/i.test(c.name));
// Tìm 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(`=== Các tham số DataDome đã trích xuất ===`);
console.log(`captchaUrl:`, captchaUrl || 'không tìm thấy');
console.log(`cookie datadome hiện tại::`, existingDd ? ${existingDd.name}=${existingDd.value}` : 'không có');
const cm = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: API_KEY })
);
// Gửi task đến CapMonster
console.log(`Gửi task DataDome đến CapMonster......`);
// Gửi task giải 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;
// Lấy domain và cookie cần thiết từ kết quả
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=== Cookies từ 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));
// Cài đặt cookie datadome trong trình duyệt
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(`cookie datadome đã được cài đặt:`, ddSolved.value);
// Mở lại website sau khi cài cookie
const page2 = await context.newPage();
const resp2 = await page2.goto(TARGET_URL, { waitUntil: 'domcontentloaded', timeout: 60000 });
console.log(`Trạng thái sau khi cài cookie:: ${resp2?.status()}`);
await browser.close();
}
main();
1. Đăng nhập tài khoản hoặc đăng ký DataDome và lấy key client-side và server-side.
Quan trọng: dùng email công ty để đăng ký.
Sau khi đăng ký, bạn truy cập vào bảng quản trị.
2. Thêm website (domain) trong bảng DataDome.
Thêm domain và chọn các tham số bảo vệ:
3. Cài đặt tích hợp phía server.
Sử dụng Protection API hoặc chọn module sẵn cho stack của bạn (Node.js / Express, Nginx, Cloudflare, Java (Tomcat/Jetty/Vert.x), Go...).
Cài đặt SDK/middleware chính thức DataDome, cấu hình server-side key.
Ví dụ tích hợp DataDome trên Node.js:
DataDome bảo vệ server khỏi bot và yêu cầu đáng ngờ, tự động hiển thị challenge khi cần. Module có thể dùng với Express hoặc HTTP server tích hợp Node.js.
Cài đặt
Cho Express:
npm install @datadome/module-expressCho Node.js HTTP module:
npm install @datadome/module-httpHỗ trợ Node.js 18+. Cần server-side key từ panel DataDome.
const { DatadomeExpress } = require('@datadome/module-express');
const express = require('express');
const app = express();
// Khởi tạo client DataDome
const datadomeClient = new DatadomeExpress('YOUR_SERVER_KEY');
// Kết nối middleware
app.use(datadomeClient.middleware());
// Các route của bạn
app.get('/', (req, res) => {
res.send('Hello World');
});
// Khởi chạy server
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}/`);
});Cấu hình module
Có thể truyền cấu hình khi tạo client:
const datadomeClient = new DatadomeExpress('YOUR_SERVER_KEY', {
timeout: 150, // timeout (ms) sau đó request được cho phép
urlPatternInclusion: null, // URL nào được kiểm tra
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',
});Tùy chọn nâng cao:
Chi tiết hơn xem tài liệu chính thức.
4. Kết nối client.
Chèn JS Tag vào <head> website:
<head>
<script>
window.ddjskey = 'YOUR_DATADOME_JS_KEY';
window.ddoptions = {
// Thêm cài đặt tại đây (tùy chọn)
};
</script>
<script src="https://js.datadome.co/tags.js" async></script>
<!-- Các phần tử khác của head -->
</head>
YOUR_DATADOME_JS_KEY → Thay bằng Client-Side Key của bạn.
Script nên load đầu <head> để DataDome bắt request và theo dõi hành vi người dùng chính xác.
Nếu website dùng CSP, thêm các directive sau:
<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; /* để gửi dữ liệu JS Tag */
frame-src *.captcha-delivery.com; /* cho trang challenge */
worker-src blob:; /* cho web workers */
Chi tiết client-side integration xem tài liệu chính thức DataDome CAPTCHA.
Kiểm tra kết quả
DataDome tạo cookie datadome= sau khi xác minh thành công. Cookie này được người dùng tự động gửi và máy chủ sẽ cho phép yêu cầu. Nếu cookie bị thiếu hoặc không hợp lệ, DataDome sẽ hiển thị lại thử thách.
Nếu bạn tiếp quản một trang web đã được cài sẵn captcha hoặc một hệ thống bảo vệ khác nhưng lại không có quyền truy cập vào mã nguồn thì cũng không có gì đáng lo! Việc xác định chính xác công nghệ nào đang được sử dụng khá đơn giản. Để kiểm tra xem mọi thứ có hoạt động đúng hay không, bạn có thể dùng dịch vụ nhận dạng CapMonster Cloud trong một môi trường thử nghiệm tách biệt nhằm đảm bảo cơ chế xử lý token và logic kiểm tra đang vận hành chính xác.
Với DataDome CAPTCHA, bạn chỉ cần nhận diện hệ thống, quan sát hành vi của nó và xác nhận rằng lớp bảo vệ hoạt động đúng cách. Trong bài viết này, chúng tôi đã chỉ ra cách nhận biết DataDome CAPTCHA và nơi tìm hướng dẫn tích hợp hoặc cấu hình lại, giúp bạn tự tin duy trì lớp bảo vệ và kiểm soát hoạt động của nó.