DataDome CAPTCHA
和 CapMonster Cloud

CAPTCHA 解决方案,网站安装和测试。

DataDome CAPTCHA解决方案的定价

验证码
价格 (USD)
$ 2.20
1000 代币
接手一个已经部署 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 到浏览器(测试可用正确或错误数据),查看结果。
python

// 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/150.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:

javascript
npm install @datadome/module-express

适用于 Node.js HTTP 模块:

javascript
npm install @datadome/module-http

支持 Node.js 18+。需要 DataDome 面板提供的 server-side key。

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

模块配置

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

javascript

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>:

markup

<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 事件。
验证防护的可靠性
安全与优化建议
<span class="font-bold">Server-Side Key</span> 仅保存在服务器上,不传递给客户端。
通过 <span class="font-bold">logger</span> 或 <span class="font-bold">blocked/valid</span> 监听器启用事件日志记录,以追踪阻塞原因。
在表单页面放置 <span class="font-bold">隐私政策</span> 和 <span class="font-bold">DataDome 使用条款</span> 链接,以对用户透明。
结论

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

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

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

关于 DataDome 的常见问题

最明显的标志是服务器响应中的 datadome cookie:

  1. 在浏览器(Chrome、Firefox)中打开受 DataDome 保护的网站。
  2. F12(开发者工具)→ 进入 Application 选项卡 → Cookies
  3. 找到网站的域名(例如 www.example.com)。
  4. 在 cookie 中查找 datadome

您还可以在开发者工具 → Network 选项卡中检查网站请求是否包含对 geo.captcha-delivery.com 的调用;该端点属于 DataDome 的 challenge 交付基础设施。

安装官方包:

npm install @datadome/module-express

导入并初始化客户端:

const { DatadomeExpress } = require('@datadome/module-express')

然后

new DatadomeExpress('YOUR_SERVER_SIDE_KEY')

挂载中间件:

app.use(datadomeClient.middleware())

在大多数情况下,中间件应在受保护路由之前注册,以便在请求到达路由处理程序之前进行分析。根据应用结构,您也可以将中间件选择性地应用于特定路由或路由组。

将此示例用作最小配置:

const { DatadomeExpress } = require('@datadome/module-express');
const express = require('express');
const app = express();

// Initialize DataDome client
const datadomeClient = new DatadomeExpress('YOUR_SERVER_KEY');

// Connect middleware
app.use(datadomeClient.middleware());

// Your routes
app.get('/', (req, res) => {
  res.send('Hello World');
});

// Start server
app.listen(3000, () => {
  console.log('Server running on port 3000');
})

官方模块还支持高级集成的额外配置和自定义选项。

有关服务端集成的更多详情,请参阅 官方文档

要检查 DataDome 是否正确配置,请尝试以下三项测试:

  1. 在没有 DataDome JS Tag 的情况下访问受保护页面。如果集成按预期工作,您应收到 CAPTCHA challenge。
  2. 使用 k6JMeter 等工具模拟自动化流量。DataDome 应检测到此活动并以 challenge 响应。
  3. 从其他 IP 地址重复使用已解决的 datadome cookie。这不应生效,DataDome 应显示新的 CAPTCHA challenge。

如果 DataDome 解决失败,最常见的原因如下:

  • ERROR_CAPTCHA_UNSOLVABLE: createTask 参数不正确。您的代理可能被 DataDome CAPTCHA 屏蔽。请更换用于请求的代理服务器。请再次检查请求中发送的参数。如果错误重复出现,请联系支持并提供:taskId、任务类型 (type)、原始图像或输入数据、任务日期/时间和请求正文。
  • ERROR_KEY_DOES_NOT_EXIST: 您的 clientKey 不正确或未激活。请在 CapMonster Cloud 账户中检查密钥。
  • ERROR_PROXY_READ_TIMEOUT: 代理太慢或不可靠。请尝试其他代理。此错误也可能由 createTask 请求中错误的 metadata.captchaUrl 引起。请再次检查 captcha 链接。
  • 从服务收到的 cookie 在目标网站上无效: 解决请求和最终请求是从不同 IP 发送的。请对两者使用相同 IP。同时检查 cookie 设置是否正确;确保返回的 datadome cookie 已正确设置在浏览器或请求头中。

对于 HTTP 请求,在每次后续请求受保护域名时,将已解决的值包含在 Cookie 请求头中,格式为 datadome=<value>

在 Puppeteer、Selenium 或 Playwright 等浏览器自动化工具中,在打开受保护页面之前,使用框架内置的 cookie 方法添加 datadome cookie。

例如:

  • 在 Playwright 中,使用 context.addCookies()
  • 在 Puppeteer 中,使用 page.setCookie()
  • 在 Selenium 中,使用 driver.add_cookie()

确保 cookie 为正确的域名和路径设置。同时使用 httpOnly: truesecure: truesameSite: 'Lax' 调用这些方法,以便浏览器像处理普通会话 cookie 一样处理它。