跳转到主要内容
获取令牌时遇到问题吗
联系支持

DataDome

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

注意!
  • 执行此任务时,请使用 您自己的代理

  • 如果代理按 IP 授权,请将地址 65.21.190.34 加入白名单。

  • 完成验证后,您将获得 特殊的Cookie,需要添加到浏览器中。

请求参数

type<string>required

CustomTask


class<string>required

DataDome


websiteURL<string>required

验证码所在的主页面URL。


captchaUrl(在metadata中)<string>required

"captchaUrl" - 验证码链接。通常格式为: "https://geo.captcha-delivery.com/captcha/?initialCid=..."


datadomeCookie(在metadata中)<string>required

您的DataDome Cookie。可以通过页面的 document.cookie 获取(如果Cookie没有 HttpOnly 标志),通过请求头 Set-Cookie: "datadome=...",或直接从HTML代码中的 initialCid 获取 (查看如何找到datadomeCookie示例)。


datadomeVersion (在metadata中)<string>optional

DataDome 解决方法版本。 当参数设置为 "new" 时,将使用更新后的解决方案,支持 i.jsc.js 两种脚本(详见下文)。 如果未指定该参数,则使用旧版解决方案,仅支持 i.js


proxyType<string>required

http - 常规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。
请仅传递当前 Windows 系统下的有效 UA。当前推荐值为userAgentPlaceholder


任务创建方法

重要

在页面加载过程中,DataDome可能会使用两种脚本之一:c.jsi.js。 在执行解决方案之前,请检查加载了哪个脚本 (DevTools → Network / HTML)。

使用 c.js 的情况:

使用 i.js 的情况:

POST
https://api.capmonster.cloud/createTask

请求

{
"clientKey": "API_KEY",
"task": {
"type": "CustomTask",
"class": "DataDome",
"websiteURL": "https://example.com",
"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=VYUWrgJ9ap4zmXq8Mgbp...64emvUPeON45z",
"datadomeVersion": "new"
},
"proxyType": "http",
"proxyAddress": "123.45.67.89",
"proxyPort": 8080,
"proxyLogin": "proxyUsername",
"proxyPassword": "proxyPassword"
}
}

响应

{
"errorId":0,
"taskId":407533072
}

获取任务结果的方法

使用 getTaskResult 方法来获取DataDome验证码的解决方案。

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

  1. 在浏览器中打开受DataDome保护的网站(Chrome、Firefox)。

  2. 按 F12 → 打开 Application 标签 → Cookies

  3. 找到网站域名(例如:www.example.com)。

在Cookie中查找键 datadome —— 这就是所需的 datadomeCookie 参数。

方法2:

  1. 打开触发DataDome验证码的网站。

  2. 进入 DevTools → Network,刷新页面,找到加载带有 initialCid 参数的请求。

示例URL:

https://geo.captcha-delivery.com/interstitial/?initialCid=...&hash=...&cid=...

或:

  1. 打开该请求的 Response,在HTML代码中找到对象:

var ddm = { ... };

  1. 在该对象中找到参数 cid,其值即为当前 datadomeCookie

方法3:

  1. 打开触发DataDome验证码的网站。

  2. 进入 DevTools → Network,刷新页面,找到状态为 403 的请求。

  3. 切换到 Headers → Response Headers,在头部找到 Set-Cookie: 并复制 datadome 参数的值(格式 datadome=<value>)。

DataDome 自动化解决示例

注意!

下面的示例仅用于了解和演示总体逻辑。

由于各网站的防护机制、请求结构和参数各不相同,解决方案可能需要针对具体网站进行额外的适配和测试。

显示代码
// npm install axios cheerio https-proxy-agent

import axios from "axios";
import * as cheerio from "cheerio";
import { URL } from "url";
import { HttpsProxyAgent } from "https-proxy-agent";

// ======================================================
// 配置
// ======================================================

// 启用/禁用详细日志输出
// 仅用于开发和排错
const DEBUG = true;

const CAPMONSTER_API_KEY = "YOUR_API_KEY"; // 填写您的 CapMonster Cloud API 密钥
const PAGE_URL = "https://www.example.com/"; // 填写触发 DataDome 的页面 URL

const USER_AGENT =
"userAgentPlaceholder";

const PROXY_URL = "http://login:pass@address:port";

const CREATE_TASK = "https://api.capmonster.cloud/createTask";
const GET_RESULT = "https://api.capmonster.cloud/getTaskResult";

const MAX_WAIT = 120000;

// ======================================================
// 调试日志记录器
// ======================================================

function log(title, data = null) {
if (!DEBUG) return;

console.log(`\n${"=".repeat(25)} ${title} ${"=".repeat(25)}`);

if (typeof data === "object") console.log(JSON.stringify(data, null, 2));
else if (data) console.log(data);

console.log("=".repeat(70));
}

// ======================================================
// 提取 DD 对象
// ======================================================

function extractDD(html) {
const $ = cheerio.load(html);
const scripts = $("script").toArray();

for (const s of scripts) {
const text = $(s).html();
if (text && text.includes("var dd=")) {
try {
const raw = text.split("var dd=")[1].split(";")[0].replace(/'/g, '"');
return JSON.parse(raw);
} catch (e) {
return null;
}
}
}

return null;
}

// ======================================================
// 构建 CAPTCHA URL
// ======================================================

function buildCaptchaUrl(dd) {
const base = `https://${dd.host}/captcha/`;

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 base + "?" + params.toString();
}

// ======================================================
// 使用 CAPMONSTER CLOUD
// ======================================================

async function createTask(payload) {
log("CREATE TASK REQUEST", payload);

const { data } = await axios.post(CREATE_TASK, payload);

log("CREATE TASK RESPONSE", data);

return data.taskId;
}

async function waitResult(taskId) {
const start = Date.now();

while (true) {
if (Date.now() - start > MAX_WAIT) throw new Error("CapMonster 超时");

await new Promise((r) => setTimeout(r, 3000));

const { data } = await axios.post(GET_RESULT, {
clientKey: CAPMONSTER_API_KEY,
taskId,
});

if (data.status === "processing") {
console.log("... 正在解决");
continue;
}

if (data.status === "ready") return data.solution;

if (data.errorId) throw new Error(JSON.stringify(data));
}
}

// ======================================================
// 主 SOLVER
// ======================================================

async function solveDataDome() {
console.log("\nDataDome → CapMonster solver 已启动(HTTP 模式)\n");

let agent = null;
let parsedProxy = null;

if (PROXY_URL) {
parsedProxy = new URL(PROXY_URL);
agent = new HttpsProxyAgent(PROXY_URL);
}

// 1. 第一次请求
console.log("正在打开页面...");

const response = await axios.get(PAGE_URL, {
headers: {
"User-Agent": USER_AGENT,
Accept:
"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Cache-Control": "no-cache",
Pragma: "no-cache",
"Upgrade-Insecure-Requests": "1",
},
httpsAgent: agent,
proxy: false, // 使用 httpsAgent 时很重要
validateStatus: () => true,
});

const html = response.data;

log("STATUS", response.status);

const dd = extractDD(html);

if (!dd) {
console.log("未检测到 DataDome。");
return;
}

log("DD OBJECT", dd);

if (dd.t === "bv") {
console.log("代理已被封禁。请更换代理。");
return;
}

// 2. 构建 captcha URL
const captchaUrl = buildCaptchaUrl(dd);
log("CAPTCHA URL", captchaUrl);

// 3. 在 CapMonster Cloud 中创建任务
const task = {
type: "CustomTask",
class: "DataDome",
websiteURL: PAGE_URL,
userAgent: USER_AGENT,
metadata: {
captchaUrl,
datadomeCookie: `datadome=${dd.cookie}`,
datadomeVersion: "new",
},
};

if (PROXY_URL) {
task.proxyType = "http";
task.proxyAddress = parsedProxy.hostname;
task.proxyPort = parseInt(parsedProxy.port);
task.proxyLogin = parsedProxy.username;
task.proxyPassword = parsedProxy.password;
}

const payload = {
clientKey: CAPMONSTER_API_KEY,
task,
};

const taskId = await createTask(payload);

if (!taskId) {
console.log("创建任务失败。");
return;
}

const solution = await waitResult(taskId);

log("SOLUTION", solution);

console.log("\nDataDome 已成功解决。\n");
}

solveDataDome().catch(console.error);
显示代码 (Node.js + Playwright)
// npm install axios cheerio playwright

import axios from "axios";
import * as cheerio from "cheerio";
import { chromium } from "playwright";
import { URL } from "url";

// ======================================================
// 配置
// ======================================================

// 启用/禁用详细日志输出
// 仅用于开发和排错
const DEBUG = true;

const CAPMONSTER_API_KEY = "YOUR_API_KEY" // 填写您的 CapMonster Cloud API 密钥
const PAGE_URL = "https://www.example.com/" // 填写触发 DataDome 的页面 URL

const USER_AGENT =
"userAgentPlaceholder";

const PROXY_URL = "http://login:pass@address:port" // 填写您的代理

const CREATE_TASK = "https://api.capmonster.cloud/createTask";
const GET_RESULT = "https://api.capmonster.cloud/getTaskResult";

const MAX_WAIT = 120000;

// ======================================================
// 调试日志记录器
// ======================================================

function log(title, data = null) {
if (!DEBUG) return;

console.log(`\n${"=".repeat(25)} ${title} ${"=".repeat(25)}`);

if (typeof data === "object") console.log(JSON.stringify(data, null, 2));
else if (data) console.log(data);

console.log("=".repeat(70));
}

// ======================================================
// 提取 DD 对象
// ======================================================

function extractDD(html) {
const $ = cheerio.load(html);
const scripts = $("script").toArray();

for (const s of scripts) {
const text = $(s).html();
if (text && text.includes("var dd=")) {
try {
const raw = text.split("var dd=")[1].split(";")[0].replace(/'/g, '"');
return JSON.parse(raw);
} catch (e) {
return null;
}
}
}

return null;
}

// ======================================================
// 构建 CAPTCHA URL
// ======================================================

function buildCaptchaUrl(dd) {
const base = `https://${dd.host}/captcha/`;

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 base + "?" + params.toString();
}

// ======================================================
// 使用 CAPMONSTER CLOUD
// ======================================================

async function createTask(payload) {
log("CREATE TASK REQUEST", payload);

const { data } = await axios.post(CREATE_TASK, payload);

log("CREATE TASK RESPONSE", data);

return data.taskId;
}

async function waitResult(taskId) {
const start = Date.now();

while (true) {
if (Date.now() - start > MAX_WAIT) throw new Error("CapMonster 超时");

await new Promise((r) => setTimeout(r, 3000));

const { data } = await axios.post(GET_RESULT, {
clientKey: CAPMONSTER_API_KEY,
taskId,
});

if (data.status === "processing") {
console.log("... 正在解决");
continue;
}

if (data.status === "ready") return data.solution;

if (data.errorId) throw new Error(JSON.stringify(data));
}
}

// ======================================================
// 主 SOLVER(PLAYWRIGHT)
// ======================================================

async function solveDataDome() {
console.log("\nDataDome → CapMonster solver 已启动\n");

let proxyConfig = null;
let parsedProxy = null;

if (PROXY_URL) {
parsedProxy = new URL(PROXY_URL);

proxyConfig = {
server: `http://${parsedProxy.hostname}:${parsedProxy.port}`,
username: parsedProxy.username,
password: parsedProxy.password,
};
}

const browser = await chromium.launch({
headless: false,
proxy: proxyConfig,
});

const context = await browser.newContext({
userAgent: USER_AGENT,
});

const page = await context.newPage();

console.log("正在打开页面...");
await page.goto(PAGE_URL, { waitUntil: "domcontentloaded" });

const html = await page.content();
const dd = extractDD(html);

if (!dd) {
console.log("未检测到 DataDome。");
await browser.close();
return;
}

log("DD OBJECT", dd);

if (dd.t === "bv") {
console.log("代理已被封禁。请更换代理。");
await browser.close();
return;
}

const captchaUrl = buildCaptchaUrl(dd);
log("CAPTCHA URL", captchaUrl);

const task = {
type: "CustomTask",
class: "DataDome",
websiteURL: PAGE_URL,
userAgent: USER_AGENT,
metadata: {
captchaUrl,
datadomeCookie: `datadome=${dd.cookie}`,
datadomeVersion: "new",
},
};

if (PROXY_URL) {
task.proxyType = "http";
task.proxyAddress = parsedProxy.hostname;
task.proxyPort = parseInt(parsedProxy.port);
task.proxyLogin = parsedProxy.username;
task.proxyPassword = parsedProxy.password;
}

const payload = {
clientKey: CAPMONSTER_API_KEY,
task,
};

const taskId = await createTask(payload);

if (!taskId) {
console.log("创建任务失败。");
await browser.close();
return;
}

const solution = await waitResult(taskId);
log("SOLUTION", solution);

await browser.close();
}

solveDataDome().catch(console.error);

使用 SDK 库

显示代码(用于浏览器)
// 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=VYUWrgJ9ap4zmXq8Mgbp...64emvUPeON45z"
}
});

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=VYUWrgJ9ap4zmXq8Mgbp...64emvUPeON45z"
}
});

const result = await client.Solve(datadomeRequest);
console.log("Solution:", result);
}

solveDataDome().catch(console.error);