DataDome
这种类型的验证码通常要求用户通过移动滑块来完成拼图以进行验证。

-
执行此任务时,请使用 您自己的代理。
-
如果代理按 IP 授权,请将地址 65.21.190.34 加入白名单。
-
完成验证后,您将获得 特殊的Cookie,需要添加到浏览器中。
请求参数
重要提示:某些参数的值是动态的 — 它们会在每次渲染包含 DataDome 的页面时发生变化。
请在创建任务前立即提取这些参数,以避免在解决过程中出现错误。
参数提取示例请参见章节 如何找到 datadomeCookie 和 DataDome 自动化解决示例。
创建任务前,请检查 DataDome 对象或已生成的 captchaUrl 中参数 t 的值:
-
t=fe– 可以继续创建任务; -
t=bv– IP 地址或代理已被 DataDome 封禁。
如果参数值为 t=bv,请更换代理并重新获取最新参数。详细代码示例请参阅自动解决 DataDome 示例。
type<string>requiredCustomTask
class<string>requiredDataDome
websiteURL<string>required验证码所在的主页面URL。
captchaUrl(位于 metadata 中)<string>required包含最新动态参数的 CAPTCHA 链接。通常采用以下格式:
https://geo.captcha-delivery.com/captcha/?initialCid=...&hash=...&cid=...&t=fe&referer=...&s=...
仅在检查参数 t后传递该 URL。
datadomeCookie(位于 metadata 中)<string>required您的 datadome Cookie。可在页面中通过 document.cookie 获取(如果 Cookie 没有 HttpOnly 标志),也可从请求头 Set-Cookie: "datadome=..." 中获取,或者直接从页面 HTML 代码中的 initialCid 获取(参阅如何查找 datadomeCookie 的示例)
datadomeVersion(位于 metadata 中)<string>optionalDataDome 解决方法的版本。
当值为 "new" 时,将使用支持 i.js 和 c.js 两种脚本的更新方法(详情见下文)。
如果未指定该参数,则使用仅支持 i.js 的旧解决方法。
proxyType<string>requiredhttp - 常规http/https代理;
https - 仅在http不工作时使用(某些自定义代理需要);
socks4 - socks4代理;
socks5 - socks5代理。
proxyAddress<string>required代理IPv4/IPv6地址。禁止使用:
- 透明代理(客户端IP可见);
- 本地机器代理。
proxyPort<integer>required代理端口。
proxyLogin<string>required代理服务器登录名。
proxyPassword<string>required代理服务器密码。
userAgent<string>optional浏览器 User-Agent。请使用 CapMonster Cloud 当前支持的值:userAgentPlaceholder
可通过以下地址获取最新值:https://capmonster.cloud/api/useragent/actual。
任务创建方法
在页面加载过程中,DataDome可能会使用两种脚本之一:c.js 或 i.js。
在执行解决方案之前,请检查加载了哪个脚本 (DevTools → Network / HTML)。
使用 c.js 的情况:

使用 i.js 的情况:

https://api.capmonster.cloud/createTask
请求示例
{
"clientKey": "API_KEY",
"task": {
"type": "CustomTask",
"class": "DataDome",
"websiteURL": "https://yourwebsite.com/page-with-datadome",
"userAgent": "userAgentPlaceholder",
"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=cookie-value",
"datadomeVersion": "new"
},
"proxyType": "your-proxy-type",
"proxyAddress": "your-proxy-address",
"proxyPort": 1234,
"proxyLogin": "your-proxy-login",
"proxyPassword": "your-proxy-password"
}
}
响应示例
{
"errorId":0,
"taskId":407533072
}
获取任务结果的方法
使用 getTaskResult 方法来获取DataDome验证码的解决方案。
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
}
}
如何找到 datadomeCookie
使用开发者工具
方法1:
-
在浏览器中打开受DataDome保护的网站(Chrome、Firefox)。
-
按 F12 → 打开 Application 标签 → Cookies。
-
找到网站域名(例如:www.example.com)。
在Cookie中查找键 datadome —— 这就是所需的 datadomeCookie 参数。

方法2:
-
打开触发DataDome验证码的网站。
-
进入 DevTools → Network,刷新页面,找到加载带有
initialCid参数的请求。
示例URL:
https://geo.captcha-delivery.com/interstitial/?initialCid=...&hash=...&cid=...

或:
- 打开该请求的 Response,在HTML代码中找到对象:
var ddm = { ... };
- 在该对象中找到参数
cid,其值即为当前datadomeCookie。

方法3:
-
打开触发DataDome验证码的网站。
-
进入 DevTools → Network,刷新页面,找到状态为 403 的请求。
-
切换到 Headers → Response Headers,在头部找到
Set-Cookie:并复制datadome参数的值(格式datadome=<value>)。

DataDome 自动化解决示例
下面的示例仅用于了解和演示总体逻辑。
由于各网站的防护机制、请求结构和参数各不相同,解决方案可能需要针对具体网站进行额外的适配和测试。
- Node.js
- Python
显示代码 (Node.js + Playwright)
// npm install cheerio playwright @zennolab_com/capmonstercloud-client
// npx playwright install chromium
const cheerio = require("cheerio");
const { chromium } = require("playwright");
const {
CapMonsterCloudClientFactory,
ClientOptions,
DataDomeRequest,
} = require("@zennolab_com/capmonstercloud-client");
const API_KEY = "YOUR_API_KEY"; // 请填写您的 CapMonster Cloud API 密钥
const PAGE_URL = "https://example.com/"; // 请填写带有 DataDome 保护的页面 URL
const USER_AGENT = "userAgentPlaceholder";
const BASE_HEADERS = {
accept:
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8",
"accept-language": "en-US,en;q=0.9",
"cache-control": "no-cache",
pragma: "no-cache",
"sec-ch-ua":
'"Chromium";v="150", "Google Chrome";v="150", ";Not A Brand";v="99"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
"sec-fetch-dest": "document",
"sec-fetch-mode": "navigate",
"sec-fetch-site": "none",
"sec-fetch-user": "?1",
"upgrade-insecure-requests": "1",
};
const PROXY = {
proxyType: "http",
proxyAddress: "127.0.0.1",
proxyPort: 8080,
proxyLogin: "proxy_login",
proxyPassword: "proxy_password",
};
/**
* 从页面 HTML 中提取 DataDome 参数
*
* @param {string} html
*/
function extractDD(html) {
const $ = cheerio.load(html);
for (const script of $("script").toArray()) {
const text = $(script).html();
if (text && text.includes("var dd=")) {
try {
const raw = text.split("var dd=")[1].split(";")[0].replace(/'/g, '"');
return JSON.parse(raw);
} catch {
return null;
}
}
}
return null;
}
/**
* 根据从页面获取的参数构建 DataDome 验证码 URL
*
* @param {any} dd
*/
function buildCaptchaUrl(dd) {
const params = new URLSearchParams({
initialCid: dd.cid,
hash: dd.hsh,
cid: dd.cookie,
t: dd.t,
referer: PAGE_URL,
s: dd.s,
dm: "cd",
});
if (dd.e) {
params.append("e", dd.e);
}
return `https://${dd.host}/captcha/?${params.toString()}`;
}
(async () => {
// 为浏览器配置代理
// 浏览器和 CapMonster Cloud 任务必须使用相同的代理
const proxyConfig = {
server: `http://${PROXY.proxyAddress}:${PROXY.proxyPort}`,
username: PROXY.proxyLogin,
password: PROXY.proxyPassword,
};
// 使用指定代理启动 Chromium
const browser = await chromium.launch({
headless: false,
proxy: proxyConfig,
});
// 创建浏览器上下文,设置 User-Agent 和 HTTP 头
const context = await browser.newContext({
userAgent: USER_AGENT,
extraHTTPHeaders: BASE_HEADERS,
});
const page = await context.newPage();
// 打开受保护的页面
await page.goto(PAGE_URL, {
waitUntil: "domcontentloaded",
});
// 获取页面 HTML 并提取 DataDome 参数
const html = await page.content();
const dd = extractDD(html);
if (!dd) {
throw new Error("未找到 DataDome 参数。");
}
// 检查代理是否被 DataDome 屏蔽
if (dd.t === "bv") {
throw new Error("代理已被 DataDome 屏蔽。");
}
// 构建完整的验证码 URL,用于提交任务
const captchaUrl = buildCaptchaUrl(dd);
// 创建 CapMonster Cloud 客户端
const client = CapMonsterCloudClientFactory.Create(
new ClientOptions({
clientKey: API_KEY,
}),
);
// 检查账户余额
const balance = await client.getBalance();
console.log("余额:", balance);
// 构建 CapMonster Cloud 的 DataDome 任务
const request = new DataDomeRequest({
_class: "DataDome",
websiteURL: PAGE_URL,
userAgent: USER_AGENT,
proxy: PROXY,
metadata: {
captchaUrl,
datadomeCookie: `datadome=${dd.cookie}`,
datadomeVersion: "new",
},
});
console.log("正在提交 DataDome 任务进行识别...");
// 提交任务到 CapMonster Cloud 并等待结果
const result = await client.Solve(request);
console.dir(result, { depth: null });
// =====================================
// 从 CapMonster Cloud 响应中提取 Cookies
// =====================================
const domains = result?.solution?.domains ?? {};
const allCookies = [];
// 将 CapMonster Cloud 返回的 cookies 转换为 Playwright 接受的格式
for (const [domain, data] of Object.entries(domains)) {
const cookies = data?.cookies ?? {};
for (const [name, value] of Object.entries(cookies)) {
allCookies.push({
name,
value,
domain: ".example.com", // 请替换为实际域名
path: "/",
secure: true,
sameSite: "Lax",
});
}
}
if (!allCookies.length) {
throw new Error("CapMonster Cloud 未返回 cookies。");
}
// ===============================
// 在 Playwright 中应用 Cookies
// ===============================
// 获取当前浏览器上下文的 cookies
const existingCookies = await context.cookies();
// 移除旧的 DataDome cookies,避免与新解决方案冲突
const filtered = existingCookies.filter((c) => {
const name = c.name.toLowerCase();
return !name.includes("datadome");
});
await context.clearCookies();
// 还原当前会话中其他 cookies
if (filtered.length) {
await context.addCookies(filtered);
}
console.log("已移除旧的 DataDome cookies。");
// 添加 CapMonster Cloud 返回的 cookies
await context.addCookies(allCookies);
console.log("已应用 CapMonster Cloud 的 cookies:", allCookies);
// ===============================
// 使用新 cookies 重新加载页面
// ===============================
// 将获取的 cookies 一并设置到 HTTP 头中
await context.setExtraHTTPHeaders({
...BASE_HEADERS,
cookie: allCookies.map((c) => `${c.name}=${c.value}`).join("; "),
});
// 重新加载页面,此时 DataDome 验证应已通过
await page.reload({
waitUntil: "domcontentloaded",
});
console.log("已使用获取的 DataDome cookies 重新加载页面。");
await page.waitForTimeout(10000);
await browser.close();
})().catch(console.error);
显示代码 (Python + Playwright)
# pip install playwright beautifulsoup4 capmonstercloudclient
# playwright install chromium
import json
import asyncio
from urllib.parse import urlencode
from bs4 import BeautifulSoup
from playwright.async_api import async_playwright
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import DataDomeCustomTaskRequest
API_KEY = "YOUR_CAPMONSTER_API_KEY" # 请填写您的 CapMonster Cloud API 密钥
PAGE_URL = "https://example.com/" # 请填写带有 DataDome 保护的页面 URL
USER_AGENT = (
"userAgentPlaceholder"
)
BASE_HEADERS = {
"accept": (
"text/html,application/xhtml+xml,application/xml;q=0.9,"
"image/avif,image/webp,image/apng,*/*;q=0.8"
),
"accept-language": "en-US,en;q=0.9",
"cache-control": "no-cache",
"pragma": "no-cache",
"sec-ch-ua": '"Chromium";v="150", "Google Chrome";v="150", ";Not A Brand";v="99"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
"sec-fetch-dest": "document",
"sec-fetch-mode": "navigate",
"sec-fetch-site": "none",
"sec-fetch-user": "?1",
"upgrade-insecure-requests": "1",
}
PROXY = {
"proxyType": "http",
"proxyAddress": "YOUR_PROXY_ADDRESS",
"proxyPort": 12345,
"proxyLogin": "YOUR_PROXY_LOGIN",
"proxyPassword": "YOUR_PROXY_PASSWORD",
}
def extract_dd(html: str):
"""
从页面 HTML 中提取 DataDome 参数
:param html: 页面 HTML 代码
"""
soup = BeautifulSoup(html, "html.parser")
for script in soup.find_all("script"):
text = script.string or script.get_text()
if text and "var dd=" in text:
try:
raw = text.split("var dd=")[1].split(";")[0].replace("'", '"')
return json.loads(raw)
except Exception:
return None
return None
def build_captcha_url(dd):
"""
根据从页面获取的参数构建 DataDome 验证码 URL
:param dd: DataDome 参数
"""
params = {
"initialCid": dd.get("cid"),
"hash": dd.get("hsh"),
"cid": dd.get("cookie"),
"t": dd.get("t"),
"referer": PAGE_URL,
"s": dd.get("s"),
"dm": "cd",
}
if dd.get("e"):
params["e"] = dd.get("e")
return f"https://{dd.get('host')}/captcha/?{urlencode(params)}"
def normalize_result(result):
if isinstance(result, dict):
return result
if hasattr(result, "model_dump"):
return result.model_dump()
if hasattr(result, "dict"):
return result.dict()
return result
def extract_datadome_cookies(result):
result = normalize_result(result)
print("识别结果:")
print(json.dumps(result, indent=2, default=str))
# =====================================
# 从 CapMonster Cloud 响应中提取 Cookies
# =====================================
solution = result.get("solution", result) if isinstance(result, dict) else result
domains = {}
if isinstance(solution, dict):
domains = solution.get("domains") or {}
all_cookies = []
# 将 CapMonster Cloud 返回的 cookies 转换为 Playwright 接受的格式
for domain, data in domains.items():
cookies = data.get("cookies", {}) if isinstance(data, dict) else {}
for name, value in cookies.items():
all_cookies.append({
"name": name,
"value": value,
"domain": ".example.com", # 请替换为实际域名
"path": "/",
"secure": True,
"sameSite": "Lax",
})
return all_cookies
async def main():
# 为浏览器配置代理
# 浏览器和 CapMonster Cloud 任务必须使用相同的代理
proxy_config = {
"server": f"http://{PROXY['proxyAddress']}:{PROXY['proxyPort']}",
"username": PROXY["proxyLogin"],
"password": PROXY["proxyPassword"],
}
async with async_playwright() as p:
# 使用指定代理启动 Chromium
browser = await p.chromium.launch(
headless=False,
proxy=proxy_config,
)
# 创建浏览器上下文,设置 User-Agent 和 HTTP 头
context = await browser.new_context(
user_agent=USER_AGENT,
extra_http_headers=BASE_HEADERS,
)
page = await context.new_page()
# 打开受保护的页面
await page.goto(
PAGE_URL,
wait_until="domcontentloaded",
)
# 获取页面 HTML 并提取 DataDome 参数
html = await page.content()
dd = extract_dd(html)
if not dd:
raise Exception("未找到 DataDome 参数。")
# 检查代理是否被 DataDome 屏蔽
if dd.get("t") == "bv":
raise Exception("代理已被 DataDome 屏蔽。")
# 构建完整的验证码 URL,用于提交任务
captcha_url = build_captcha_url(dd)
# 创建 CapMonster Cloud 客户端
client = CapMonsterClient(
options=ClientOptions(
api_key=API_KEY,
)
)
# 检查账户余额
balance = await client.get_balance()
print("余额:", balance)
# 构建 CapMonster Cloud 的 DataDome 任务
request = DataDomeCustomTaskRequest(
_class="DataDome",
websiteUrl=PAGE_URL,
userAgent=USER_AGENT,
proxy=PROXY,
metadata={
"captchaUrl": captcha_url,
"datadomeCookie": f"datadome={dd.get('cookie')}",
"datadomeVersion": "new",
},
)
print("正在提交 DataDome 任务进行识别...")
# 提交任务到 CapMonster Cloud 并等待结果
result = await client.solve_captcha(request)
all_cookies = extract_datadome_cookies(result)
if not all_cookies:
raise Exception("CapMonster Cloud 未返回 cookies。")
# ===============================
# 在 Playwright 中应用 Cookies
# ===============================
# 获取当前浏览器上下文的 cookies
existing_cookies = await context.cookies()
# 移除旧的 DataDome cookies,避免与新解决方案冲突
filtered = [
c for c in existing_cookies
if "datadome" not in c.get("name", "").lower()
]
await context.clear_cookies()
# 还原当前会话中其他 cookies
if filtered:
await context.add_cookies(filtered)
print("已移除旧的 DataDome cookies。")
# 添加 CapMonster Cloud 返回的 cookies
await context.add_cookies(all_cookies)
print("已应用 CapMonster Cloud 的 cookies:", all_cookies)
# ===============================
# 使用新 cookies 重新加载页面
# ===============================
# 将获取的 cookies 一并设置到 HTTP 头中
await context.set_extra_http_headers({
**BASE_HEADERS,
"cookie": "; ".join(
f"{cookie['name']}={cookie['value']}" for cookie in all_cookies
),
})
# 重新加载页面,此时 DataDome 验证应已通过
await page.reload(
wait_until="domcontentloaded",
)
print("已使用获取的 DataDome cookies 重新加载页面。")
await page.wait_for_timeout(10000)
await browser.close()
asyncio.run(main())
使用 SDK 库
- JavaScript
- Python
显示代码(用于浏览器)
// https://github.com/ZennoLab/capmonstercloud-client-js
import { CapMonsterCloudClientFactory, ClientOptions, DataDomeRequest } from '@zennolab_com/capmonstercloud-client';
const API_KEY = "YOUR_API_KEY"; // 输入您的 CapMonster Cloud API 密钥
document.addEventListener("DOMContentLoaded", async () => {
const client = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: API_KEY })
);
// 如有必要,可以检查余额
const balance = await client.getBalance();
console.log("Balance:", balance);
// DataDome 只能使用您的代理解决
const proxy = {
proxyType: "http",
proxyAddress: "123.45.67.89",
proxyPort: 8080,
proxyLogin: "username",
proxyPassword: "password"
};
const datadomeRequest = new DataDomeRequest({
_class: 'DataDome',
websiteURL: "https://example.com/", // 验证码页面的 URL
userAgent: "userAgentPlaceholder",
proxy,
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=datadome-cookie-value"
}
});
const result = await client.Solve(datadomeRequest);
console.log("Solution:", result);
});
显示代码 (Node.js)
// https://github.com/ZennoLab/capmonstercloud-client-js
import { CapMonsterCloudClientFactory, ClientOptions, DataDomeRequest } from '@zennolab_com/capmonstercloud-client';
const API_KEY = "YOUR_API_KEY"; // 输入您的 CapMonster Cloud API 密钥
async function solveDataDome() {
const client = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: API_KEY })
);
// 如有必要,可以检查余额
const balance = await client.getBalance();
console.log("Balance:", balance);
// DataDome 只能使用您的代理解决
const proxy = {
proxyType: "http",
proxyAddress: "123.45.67.89",
proxyPort: 8080,
proxyLogin: "username",
proxyPassword: "password"
};
const datadomeRequest = new DataDomeRequest({
_class: 'DataDome',
websiteURL: "https://example.com/", // 验证码页面的 URL
userAgent: "userAgentPlaceholder",
proxy,
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=datadome-cookie-value"
}
});
const result = await client.Solve(datadomeRequest);
console.log("Solution:", result);
}
solveDataDome().catch(console.error);
显示代码
# https://github.com/ZennoLab/capmonstercloud-client-python
import asyncio
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import DataDomeCustomTaskRequest
from capmonstercloudclient.requests.baseRequestWithProxy import ProxyInfo
API_KEY = "YOUR_API_KEY" # 输入您的 CapMonster Cloud API 密钥
async def solve_datadome_captcha():
client_options = ClientOptions(api_key=API_KEY)
cap_monster_client = CapMonsterClient(options=client_options)
# DataDome 只能使用您的代理解决
proxy = ProxyInfo(
proxyType="http",
proxyAddress="123.45.67.89",
proxyPort=8080,
proxyLogin="username",
proxyPassword="password"
)
# 创建 DataDome 任务
datadome_request = DataDomeCustomTaskRequest(
websiteUrl="https://example.com", # 验证码页面的 URL
metadata={
"datadomeCookie": "datadome=cookie-value",
"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"
},
proxy=proxy,
userAgent="userAgentPlaceholder"
)
# 如有必要,可以检查余额
balance = await cap_monster_client.get_balance()
print("Balance:", balance)
result = await cap_monster_client.solve_captcha(datadome_request)
print("Solution:", result)
asyncio.run(solve_datadome_captcha())
