在本文中,我们尽量回答了所有关键问题。要开始解决问题,第一步是确定当前使用的是哪种防护系统。为此,您可以查看常见验证码与反机器人防护系统列表,其中提供了可视化示例和关键特征,帮助您快速判断自己正在使用哪一种方案。
如果您发现自己的网站使用的是 DataDome CAPTCHA,下一步就是更深入地了解它的特性和具体工作方式。在本文中,您还可以查看 DataDome CAPTCHA 的接入说明,以便彻底弄清它在您的网站上是如何运行的。这样一来,您不仅能更好地理解当前的防护机制,还可以更合理地规划后续的维护和支持。
通过 CapMonster Cloud API 工作的一般流程:
type - CustomTask
class - DataDome
websiteURL - 需要解决 CAPTCHA 的主页面地址。
captchaUrl(metadata 内) - "captchaUrl" - CAPTCHA 链接。通常格式为:"https://geo.captcha-delivery.com/captcha/?initialCid=..."
datadomeCookie(metadata 内) - 您的 DataDome cookies。可通过 document.cookie 获取(若非 HttpOnly),请求头 Set-Cookie: "datadome=...",或直接从页面 HTML 的 initialCid 中获取。
userAgent - 浏览器 User-Agent。仅使用当前有效 UA(Windows)。
此任务还需使用您的代理:
proxyType :
proxyAddress - 代理 IPv4/IPv6 IP 地址。
proxyPort - 代理端口。
proxyLogin - 代理用户名。
proxyPassword - 代理密码。
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 key
const API_KEY = 'YOUR_API_KEY';
// 您的网站受 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
// 代理配置
const proxy = {
proxyType: "http",
proxyAddress: '8.8.8.8',
proxyPort: 8080,
proxyLogin: 'proxyLogin',
proxyPassword: 'proxyPassword'
};
async function main() {
// 启动浏览器
const browser = await chromium.launch({ headless: true });
const context = await browser.newContext({ userAgent: USER_AGENT });
const page = await context.newPage();
// 访问网站
await page.goto(TARGET_URL, { waitUntil: 'networkidle' });
// 查找已存在的 datadome cookie(如有)
const existingDd = (await context.cookies()).find(c => /datadome|dd_/i.test(c.name));
// 查找 DataDome iframe -> CAPTCHA URL
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 参数 ===`);
console.log(`captchaUrl:`, captchaUrl || '未找到');
console.log(`当前 datadome cookie::`, existingDd ? ${existingDd.name}=${existingDd.value}` : '无');
const cm = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: API_KEY })
);
// 将任务发送到 CapMonster
console.log(`将 DataDome 任务发送到 CapMonster......`);
// 发送 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;
// 从结果中获取域名和所需 cookie
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 的 cookies ===`);
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
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 已设置:`, ddSolved.value);
// 设置 cookie 后重新打开网站
const page2 = await context.newPage();
const resp2 = await page2.goto(TARGET_URL, { waitUntil: 'domcontentloaded', timeout: 60000 });
console.log(`设置 cookie 后状态:: ${resp2?.status()}`);
await browser.close();
}
main();
1. 登录账户 或 注册 DataDome 并获取 client-side 和 server-side key。
重要:注册时请使用公司企业邮箱。
注册后即可进入管理面板。
2. 在 DataDome 面板中添加网站(域名)。
在系统中添加域名并选择保护参数:
3. 在服务器端安装集成。
使用 Protection API 或选择适合您技术栈的模块(Node.js / Express、Nginx、Cloudflare、Java (Tomcat/Jetty/Vert.x)、Go 等)。
安装官方 DataDome SDK / middleware,并在配置中设置 server-side key。
Node.js 中 DataDome 集成示例:
DataDome 保护服务器免受机器人和可疑请求侵扰,在需要时自动显示 challenge。模块可与 Express 或 Node.js 内置 HTTP 服务器一起使用 Node.js。
安装
适用于 Express:
npm install @datadome/module-express适用于 Node.js HTTP 模块:
npm install @datadome/module-http支持 Node.js 18+。需要 DataDome 面板提供的 server-side key。
const { DatadomeExpress } = require('@datadome/module-express');
const express = require('express');
const app = express();
// 初始化 DataDome 客户端
const datadomeClient = new DatadomeExpress('YOUR_SERVER_KEY');
// 连接 middleware
app.use(datadomeClient.middleware());
// 您的路由
app.get('/', (req, res) => {
res.send('Hello World');
});
// 启动服务器
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}/`);
});模块配置
创建客户端时可传入配置:
const datadomeClient = new DatadomeExpress('YOUR_SERVER_KEY', {
timeout: 150, // 请求超时(ms)后放行
urlPatternInclusion: null, // 检查哪些 URL
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',
});高级选项:
服务器端集成更多详情请参阅 官方文档。
4. 连接客户端。
将 JS Tag 插入网站 <head>:
<head>
<script>
window.ddjskey = 'YOUR_DATADOME_JS_KEY';
window.ddoptions = {
// 在此添加您的配置(可选)
};
</script>
<script src="https://js.datadome.co/tags.js" async></script>
<!-- 其他 head 元素 -->
</head>
YOUR_DATADOME_JS_KEY → 替换为您的 Client-Side Key。
建议 script 加载在 <head> 开头,以便 DataDome 捕获请求并正确追踪用户行为。
若网站使用 CSP,请添加以下指令:
<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 数据 */
frame-src *.captcha-delivery.com; /* 用于 challenge 页面 */
worker-src blob:; /* 用于 web workers */
客户端集成更多详情请参阅 DataDome CAPTCHA 官方文档。
检查结果
DataDome 在成功通过验证后会创建 datadome= cookie。该 cookie 会由用户自动发送,服务器便会允许请求通过。如果 cookie 缺失或无效,DataDome 会再次显示挑战。
如果你接手了一个已经集成了验证码或其他防护系统的网站,但又无法访问其代码,也不用担心!要判断实际使用了哪种技术其实并不难。为了核实其是否正常工作,你可以在隔离的测试环境中使用CapMonster Cloud识别服务,确保令牌处理机制和校验逻辑都运行正常。
对于DataDome CAPTCHA,只需识别出所用的系统,观察其行为,并确认防护是否正常工作即可。本文演示了如何识别 DataDome CAPTCHA,以及到哪里查找其接入或重新配置的说明文档,从而帮助你自信地维护防护方案并掌控其运行情况。