DataDome
Данный тип капчи в основном требует от пользователя решить головоломку, перемещая ползунок для подтверждения.

-
Для выполнения данной задачи используйте ваши собственные прокси.
-
Если прокси с авторизацией по IP, то необходимо добавить адрес 65.21.190.34 в белый список.
-
После решения вы получите специальные cookie, которые необходимо добавить в браузер.
Параметры запроса
type<string>requiredCustomTask
class<string>requiredDataDome
websiteURL<string>requiredАдрес основной страницы, на которой решается капча.
captchaUrl (внутри metadata)<string>required"captchaUrl" - ссылка на капчу. Обычно имеет следующий вид: "https://geo.captcha-delivery.com/captcha/?initialCid=...".
datadomeCookie (внутри metadata)<string>requiredВаши куки от datadome. Можно получить на странице с помощью document.cookie (если куки не имеют флага HttpOnly), в заголовке запроса Set-Cookie: "datadome=...", либо напрямую из HTML-кода страницы initialCid (см. примеры, как найти datadomeCookie)
datadomeVersion (внутри metadata)<string>optionalВерсия метода решения DataDome.
При значении "new" используется обновлённый метод с поддержкой обоих скриптов i.js и c.js (более подробно см. ниже).
Если параметр не указан, применяется прежний метод решения, поддерживающий только i.js.
proxyType<string>requiredhttp - обычный http/https прокси;
https - попробуйте эту опцию только если "http" не работает (требуется для некоторых кастомных прокси);
socks4 - socks4 прокси;
socks5 - socks5 прокси.
proxyAddress<string>requiredIP адрес прокси IPv4/IPv6. Не допускается:
- использование прозрачных прокси (там где можно видеть IP клиента);
- использование прокси на локальных машинах.
proxyPort<integer>requiredПорт прокси.
proxyLogin<string>requiredЛогин прокси-сервера.
proxyPassword<string>requiredПароль прокси-сервера.
userAgent<string>optionalUser-Agent браузера.
Передавайте только актуальный UA от ОС Windows. Сейчас таковым является: userAgentPlaceholder
Метод создания задачи
В процессе загрузки на странице 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://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.
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. Его значение и есть актуальное значение cookie datadome.

Вариант 3:
-
Откройте сайт, где срабатывает DataDome-капча.
-
Перейдите в DevTools → Network, перезагрузите страницу и найдите запрос со статусом 403.
-
Перейдите на вкладку Headers → Response Headers. В списке заголовков найдите
Set-Cookie:и скопируйте значение параметраdatadome(форматdatadome=<значение>).

Пример автоматического решения DataDome
Приведённые ниже примеры предназначены для ознакомления и демонстрации общей логики.
Так как сайты отличаются механизмами защиты, структурой запросов и параметрами, решения могут потребовать дополнительной адаптации и тестирования под конкретный ресурс.
- Node.js
- Python
Показать код
// 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"; // Укажите ваш API-ключ CapMonster Cloud
const PAGE_URL = "https://www.example.com/"; // Укажите URL страницы, на которой срабатывает DataDome
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 timeout");
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("... solving");
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 started (HTTP mode)\n");
let agent = null;
let parsedProxy = null;
if (PROXY_URL) {
parsedProxy = new URL(PROXY_URL);
agent = new HttpsProxyAgent(PROXY_URL);
}
// 1. Первый запрос
console.log("Opening page...");
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("No DataDome detected.");
return;
}
log("DD OBJECT", dd);
if (dd.t === "bv") {
console.log("Proxy banned. Change proxy.");
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("Failed to create task.");
return;
}
const solution = await waitResult(taskId);
log("SOLUTION", solution);
console.log("\nDataDome solved successfully.\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" // Укажите ваш API-ключ CapMonster Cloud
const PAGE_URL = "https://www.example.com/" // Укажите URL страницы, на которой срабатывает DataDome
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 timeout");
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("... solving");
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 started\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("Opening page...");
await page.goto(PAGE_URL, { waitUntil: "domcontentloaded" });
const html = await page.content();
const dd = extractDD(html);
if (!dd) {
console.log("No DataDome detected.");
await browser.close();
return;
}
log("DD OBJECT", dd);
if (dd.t === "bv") {
console.log("Proxy banned. Change proxy.");
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("Failed to create task.");
await browser.close();
return;
}
const solution = await waitResult(taskId);
log("SOLUTION", solution);
await browser.close();
}
solveDataDome().catch(console.error);
Показать код
# pip install requests beautifulsoup4
import time
import json
import requests
import urllib.parse # Для разбора и кодирования URL (прокси, параметры captcha)
from bs4 import BeautifulSoup # Для парсинга HTML и извлечения объекта DataDome (var dd)
from urllib.parse import urlparse
# ======================================================
# НАСТРОЙКИ
# ======================================================
# Включает/выключает подробный вывод логов
# Используется только для удобства разработки и поиска ошибок
DEBUG = True
CAPMONSTER_API_KEY = "YOUR_API_KEY" # Укажите ваш API-ключ CapMonster Cloud
PAGE_URL = "https://www.example.com/" # Укажите URL страницы, на которой срабатывает DataDome
USER_AGENT = (
"userAgentPlaceholder"
)
PROXY_URL = "http://login:pass@address:port" # Укажите ваш прокси
CREATE_TASK = "https://api.capmonster.cloud/createTask"
GET_RESULT = "https://api.capmonster.cloud/getTaskResult"
MAX_WAIT = 120
# ======================================================
# ОТЛАДОЧНЫЙ ЛОГГЕР
# ======================================================
def log(title, data=None):
if not DEBUG:
return
print(f"\n{'='*25} {title} {'='*25}")
if isinstance(data, (dict, list)):
print(json.dumps(data, indent=2, ensure_ascii=False))
elif data:
print(data)
print("=" * 70)
# ======================================================
# ЗАГОЛОВКИ (МОЖЕТЕ УКАЗАТЬ СВОИ)
# ======================================================
def build_headers(first_request=True):
return {
"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",
"Accept-Encoding": "gzip, deflate, br",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1",
"Cache-Control": "max-age=0",
"DNT": "1",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none" if first_request else "same-origin",
"Sec-Fetch-User": "?1",
}
# ======================================================
# ПРОКСИ
# ======================================================
def build_proxy(proxy_url):
if not proxy_url:
return None, None
parsed = urlparse(proxy_url)
proxy_dict = {
"http": proxy_url,
"https": proxy_url
}
proxy_data = {
"proxyType": "http",
"proxyAddress": parsed.hostname,
"proxyPort": parsed.port,
"proxyLogin": parsed.username or "",
"proxyPassword": parsed.password or ""
}
return proxy_dict, proxy_data
# ======================================================
# ИЗВЛЕЧЕНИЕ ОБЪЕКТА DD
# ======================================================
def extract_dd(html):
soup = BeautifulSoup(html, "html.parser")
script = soup.find("script", string=lambda t: t and "var dd=" in t)
if not script:
return None
raw = script.text.split("var dd=")[1].split(";")[0]
raw = raw.replace("'", '"')
return json.loads(raw)
# ======================================================
# СБОР CAPTCHA URL
# ======================================================
def build_captcha_url(dd):
base = f"https://{dd['host']}/captcha/"
parts = [
("initialCid", dd["cid"]),
("hash", dd["hsh"]),
("cid", dd["cookie"]),
("t", dd["t"]),
("referer", PAGE_URL),
("s", dd["s"]),
]
if dd.get("e"):
parts.append(("e", dd["e"]))
parts.append(("dm", "cd"))
query = "&".join(
f"{k}={urllib.parse.quote(str(v), safe='')}"
for k, v in parts
)
return base + "?" + query
# ======================================================
# РЕШЕНИЕ ЧЕРЕЗ CAPMONSTER CLOUD
# ======================================================
def create_task(payload):
log("CREATE TASK REQUEST", payload)
r = requests.post(CREATE_TASK, json=payload)
resp = r.json()
log("CREATE TASK RESPONSE", resp)
return resp.get("taskId")
def wait_result(task_id):
start = time.time()
while True:
if time.time() - start > MAX_WAIT:
raise TimeoutError("CapMonster timeout")
time.sleep(2)
r = requests.post(GET_RESULT, json={
"clientKey": CAPMONSTER_API_KEY,
"taskId": task_id
})
resp = r.json()
if resp.get("status") == "processing":
print("... solving")
continue
if resp.get("status") == "ready":
return resp["solution"]
if resp.get("errorId"):
raise Exception(resp)
# ======================================================
# ОСНОВНОЙ SOLVER
# ======================================================
def solve_datadome():
print("\n DataDome → CapMonster solver started\n")
proxy_dict, proxy_data = build_proxy(PROXY_URL)
session = requests.Session()
session.headers.update(build_headers(first_request=True))
if proxy_dict:
session.proxies.update(proxy_dict)
# --------------------------------------------------
# 1. Первый запрос
# --------------------------------------------------
print("Opening page...")
r = session.get(PAGE_URL)
log("FIRST STATUS", r.status_code)
dd = extract_dd(r.text)
if not dd:
print("No DataDome detected")
return
log("DD OBJECT", dd)
if dd.get("t") == "bv":
print("Proxy banned (t=bv). Change proxy or headers.")
return
# --------------------------------------------------
# 2. Сбор captcha URL
# --------------------------------------------------
captcha_url = build_captcha_url(dd)
log("CAPTCHA URL", captcha_url)
# --------------------------------------------------
# 3. Создание задачи в CapMonster Cloud
# --------------------------------------------------
task = {
"type": "CustomTask",
"class": "DataDome",
"websiteURL": PAGE_URL,
"userAgent": USER_AGENT,
"metadata": {
"captchaUrl": captcha_url,
"datadomeCookie": f"datadome={dd['cookie']}",
"datadomeVersion": "new"
}
}
if proxy_data:
task.update(proxy_data)
payload = {
"clientKey": CAPMONSTER_API_KEY,
"task": task
}
task_id = create_task(payload)
if not task_id:
print("Failed to create task")
return
# --------------------------------------------------
# 4. Ожидание решения
# --------------------------------------------------
solution = wait_result(task_id)
log("SOLUTION", solution)
if __name__ == "__main__":
solve_datadome()
Показать код (Python + Playwright)
# pip install requests beautifulsoup4 playwright
import time
import json
import requests
import urllib.parse # Для кодирования параметров URL (captcha URL)
from bs4 import BeautifulSoup # Для парсинга HTML и извлечения объекта var dd
from urllib.parse import urlparse
from playwright.sync_api import sync_playwright # Для запуска браузера и работы со страницей через Playwright
# ======================================================
# НАСТРОЙКИ
# ======================================================
# Включает/выключает подробный вывод логов
# Используется только для удобства разработки и поиска ошибок
DEBUG = True
CAPMONSTER_API_KEY = "YOUR_API_KEY" # Укажите ваш API-ключ CapMonster Cloud
PAGE_URL = "https://www.example.com/" # Укажите URL страницы, на которой срабатывает DataDome
USER_AGENT = (
"userAgentPlaceholder"
)
PROXY_URL = "http://login:pass@address:port" # Укажите ваш прокси
CREATE_TASK = "https://api.capmonster.cloud/createTask"
GET_RESULT = "https://api.capmonster.cloud/getTaskResult"
MAX_WAIT = 120
# ======================================================
# ОТЛАДОЧНЫЙ ЛОГГЕР
# ======================================================
def log(title, data=None):
if not DEBUG:
return
print(f"\n{'='*25} {title} {'='*25}")
if isinstance(data, (dict, list)):
print(json.dumps(data, indent=2, ensure_ascii=False))
elif data:
print(data)
print("=" * 70)
# ======================================================
# ИЗВЛЕЧЕНИЕ ОБЪЕКТА DD
# ======================================================
def extract_dd(html):
soup = BeautifulSoup(html, "html.parser")
script = soup.find("script", string=lambda t: t and "var dd=" in t)
if not script:
return None
raw = script.text.split("var dd=")[1].split(";")[0]
raw = raw.replace("'", '"')
return json.loads(raw)
# ======================================================
# СБОРКА CAPTCHA URL
# ======================================================
def build_captcha_url(dd):
base = f"https://{dd['host']}/captcha/"
parts = [
("initialCid", dd["cid"]),
("hash", dd["hsh"]),
("cid", dd["cookie"]),
("t", dd["t"]),
("referer", PAGE_URL),
("s", dd["s"]),
]
if dd.get("e"):
parts.append(("e", dd["e"]))
parts.append(("dm", "cd"))
query = "&".join(
f"{k}={urllib.parse.quote(str(v), safe='')}"
for k, v in parts
)
return base + "?" + query
# ======================================================
# РАБОТА С CAPMONSTER CLOUD
# ======================================================
def create_task(payload):
log("CREATE TASK REQUEST", payload)
r = requests.post(CREATE_TASK, json=payload)
resp = r.json()
log("CREATE TASK RESPONSE", resp)
return resp.get("taskId")
def wait_result(task_id):
start = time.time()
while True:
if time.time() - start > MAX_WAIT:
raise TimeoutError("CapMonster timeout")
time.sleep(2)
r = requests.post(GET_RESULT, json={
"clientKey": CAPMONSTER_API_KEY,
"taskId": task_id
})
resp = r.json()
if resp.get("status") == "processing":
print("... solving")
continue
if resp.get("status") == "ready":
return resp["solution"]
if resp.get("errorId"):
raise Exception(resp)
# ======================================================
# ОСНОВНОЙ SOLVER (PLAYWRIGHT)
# ======================================================
def solve_datadome():
print("\n DataDome → CapMonster solver (Playwright) started\n")
proxy = None
if PROXY_URL:
parsed = urlparse(PROXY_URL)
proxy = {
"server": f"http://{parsed.hostname}:{parsed.port}",
"username": parsed.username,
"password": parsed.password
}
with sync_playwright() as p:
browser = p.chromium.launch(headless=False, proxy=proxy)
context = browser.new_context(user_agent=USER_AGENT)
page = context.new_page()
print("Opening page in real browser...")
page.goto(PAGE_URL, wait_until="domcontentloaded")
html = page.content()
log("FIRST PAGE LOADED")
dd = extract_dd(html)
if not dd:
print("No DataDome detected")
browser.close()
return
log("DD OBJECT", dd)
if dd.get("t") == "bv":
print("Proxy banned (t=bv). Change proxy.")
browser.close()
return
captcha_url = build_captcha_url(dd)
log("CAPTCHA URL", captcha_url)
task = {
"type": "CustomTask",
"class": "DataDome",
"websiteURL": PAGE_URL,
"userAgent": USER_AGENT,
"metadata": {
"captchaUrl": captcha_url,
"datadomeCookie": f"datadome={dd['cookie']}",
"datadomeVersion": "new"
}
}
if PROXY_URL:
task.update({
"proxyType": "http",
"proxyAddress": parsed.hostname,
"proxyPort": parsed.port,
"proxyLogin": parsed.username,
"proxyPassword": parsed.password
})
payload = {
"clientKey": CAPMONSTER_API_KEY,
"task": task
}
task_id = create_task(payload)
if not task_id:
print("Failed to create task")
browser.close()
return
solution = wait_result(task_id)
log("SOLUTION", solution)
browser.close()
if __name__ == "__main__":
solve_datadome()
Используйте библиотеку 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"; // Укажите ваш API-ключ CapMonster Cloud
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"; // Укажите ваш API-ключ CapMonster Cloud
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);
Показать код
# 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" # Укажите ваш API-ключ CapMonster Cloud
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=VYUWrgJ9ap4zmXq8Mgbp...64emvUPeON45z",
"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())
