logo
bars

DataDome CAPTCHA
和 CapMonster Cloud

CAPTCHA 解决方案,网站安装和测试。
接手一个已经部署 captcha 或其他防护的站点,却无法访问源代码?此时最关心的是使用了哪种方案、配置是否正确以及如何测试。

在本文中,我们尽量回答了所有关键问题。要开始解决问题,第一步是确定当前使用的是哪种防护系统。为此,您可以查看常见验证码与反机器人防护系统列表,其中提供了可视化示例和关键特征,帮助您快速判断自己正在使用哪一种方案。

如果您发现自己的网站使用的是 DataDome CAPTCHA,下一步就是更深入地了解它的特性和具体工作方式。在本文中,您还可以查看 DataDome CAPTCHA 的接入说明,以便彻底弄清它在您的网站上是如何运行的。这样一来,您不仅能更好地理解当前的防护机制,还可以更合理地规划后续的维护和支持。

什么是 DataDome
什么是 DataDome
DataDome 是一套防护机器人和自动攻击的系统,通过分析访问者行为和网络参数,将真实用户与恶意流量区分开来,确保网站或应用的稳定运行。
Background
DataDome CAPTCHA 示例
行为分析
行为分析
评估用户操作(点击、滚动、交互速度)。
JavaScript 检测
JavaScript 检测
隐藏检测浏览器及其环境。
网络检测
网络检测
分析 IP、headers、代理及已知机器人网络。
Challenge
Challenge
系统怀疑时显示 CAPTCHA(通常为“向右滑动完成拼图”滑块)。

通过 CapMonster Cloud 解决 DataDome CAPTCHA

在测试 DataDome 保护时,需要确保其正确集成并对可疑流量做出响应。手动检查时,请打开受 DataDome 保护的页面,确认系统已激活。
尝试发送模拟可疑行为的请求(例如频繁刷新页面或提交无效表单)——DataDome 应阻止访问或显示保护页面。
用于自动测试和 CAPTCHA 识别,可使用专业服务,例如 CapMonster Cloud——它接收 CAPTCHA 参数,在其服务器处理并返回可用的解决方案。此解决方案(token 或 cookie)可应用于表单或浏览器,无需用户干预。

通过 CapMonster Cloud API 工作的一般流程:

创建任务创建任务
arrow
发送 API 请求发送 API 请求
arrow
获取结果获取结果
arrow
将 token 应用到页面将 token 应用到页面
arrow
使用现成库识别 DataDome CAPTCHA
CapMonster Cloud 提供现成库,可在 PythonJavaScript (Node.js) 中使用。
Python
JavaScript
DataDome 解决方案与 Cookie 设置
Node.js 示例,展示在网页上完成 CAPTCHA 识别的完整流程。方法包括:通过 HTTP 请求获取 HTML 和保护系统参数,发送响应并处理结果;或使用自动化工具(如 Playwright)——打开页面,等待验证,使用 CapMonster Cloud 客户端发送参数,获取结果,设置 cookie 到浏览器(测试可用正确或错误数据),查看结果。

// 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/145.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();
  
如何将 DataDome CAPTCHA 连接到您的网站
为了了解网站 CAPTCHA 的工作原理、验证逻辑,并重新连接或重新配置,建议查看本部分。它描述了保护集成过程,帮助快速掌握所有细节。

1. 登录账户注册 DataDome 并获取 client-side 和 server-side key。

重要:注册时请使用公司企业邮箱。

注册后即可进入管理面板。

2. 在 DataDome 面板中添加网站(域名)。

在系统中添加域名并选择保护参数:

  • Web Protection(HTTP 流量保护)
  • Bot detection & mitigation
  • Frequency & behavior analysis
  • Challenge 页面(DataDome 验证页面)
  • JS tag configuration

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。

Express 集成Express 集成
arrow
Node.js HTTP 服务器集成Node.js HTTP 服务器集成
arrow

模块配置

创建客户端时可传入配置:


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',
});

高级选项:

  • 记录 DataDome headers(enrichedHeaders)
  • CSP nonce: app.use(datadomeClient.middleware({ nonce: 'VALUE' }))
  • 通过 handlers 重写请求元数据

HelpIcon

服务器端集成更多详情请参阅 官方文档

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,请添加以下指令:

内联脚本内联脚本
arrow
加载外部脚本加载外部脚本
arrow

HelpIcon

客户端集成更多详情请参阅 DataDome CAPTCHA 官方文档

检查结果

DataDome 在成功通过验证后会创建 datadome= cookie。该 cookie 会由用户自动发送,服务器便会允许请求通过。如果 cookie 缺失或无效,DataDome 会再次显示挑战。

Background
可能的错误与调试
Bug Icon
无效的 key 或域名
DataDome 未正确保护网站,challenge 不出现。请检查是否使用正确的 Server-Side Key 并确保域名已添加到 DataDome 面板。
Bug Icon
请求处理超时
服务器未收到 DataDome API 响应。请在模块设置中增加 timeout 值。
Bug Icon
Token 为空或参数无效
将验证结果发送到服务器时出错。请确保客户端 JS Tag 已正确安装并返回 ddtoken。
Bug Icon
Challenge 未通过
请求被标记为可疑或 token 已过期。诊断时,通过模块的 logger 参数启用日志记录并跟踪 blocked 和 valid 事件。
验证防护的可靠性
安全与优化建议
<b>Server-Side Key</b> 仅保存在服务器上,不传递给客户端。
通过 <b>logger</b> 或 <b>blocked/valid</b> 监听器启用事件日志记录,以追踪阻塞原因。
在表单页面放置 <b>隐私政策</b> 和 <b>DataDome 使用条款</b> 链接,以对用户透明。
结论

如果你接手了一个已经集成了验证码或其他防护系统的网站,但又无法访问其代码,也不用担心!要判断实际使用了哪种技术其实并不难。为了核实其是否正常工作,你可以在隔离的测试环境中使用CapMonster Cloud识别服务,确保令牌处理机制和校验逻辑都运行正常。

对于DataDome CAPTCHA,只需识别出所用的系统,观察其行为,并确认防护是否正常工作即可。本文演示了如何识别 DataDome CAPTCHA,以及到哪里查找其接入或重新配置的说明文档,从而帮助你自信地维护防护方案并掌控其运行情况。

Conclusion
实用链接
DocIconDataDome CAPTCHA 文档DocIconCapMonster Cloud 文档(与 DataDome CAPTCHA 配合使用)