Перейти к основному содержимому
Возникают проблемы с получением токена?
Свяжитесь с поддержкой

Cloudflare Challenge

Ещё больше по теме в нашем блоге
Ещё больше по теме в нашем блоге
Важно:

CapMonster Cloud может возвращать результат решения в виде токена или cf_clearance cookie. Перед началом работы ознакомьтесь с обоими вариантами и выберите тот, который лучше всего подходит для ваших задач.

Параметры запроса


ВАЖНО: значения некоторых параметров являются динамическими — они меняются при каждом рендеринге страницы с Cloudflare Challenge.
Извлекайте их непосредственно перед созданием задачи, чтобы избежать ошибок при решении. Примеры автоматического извлечения параметров см. в разделе Как найти все нужные параметры для создания задачи.


Вариант 1. Challenge (token)

Внимание!
  • CapMonster Cloud по умолчанию работает через встроенные прокси — они уже включены в стоимость. Указывать собственные прокси требуется только в тех случаях, когда сайт не принимает токен или доступ к встроенным сервисам ограничен.

  • Если прокси с авторизацией по IP, то необходимо добавить адрес 65.21.190.34 в белый список.

  • После решения вы получите токен для подтверждения прохождения проверки.

type<string>required

TurnstileTask


websiteURL<string>required

Адрес страницы, на которой решается капча


websiteKey<string>required

Ключ Cloudflare Challenge (см. раздел Как найти все нужные параметры для создания задачи)
Имеет следующий примерный формат: 0x4AAAAAAABUYP0XeMJF0xoy


cloudflareTaskType<string>required

token


pageAction<string>required

Поле action, которое можно найти в callback функции для загрузки капчи. Если используется cloudflareTaskType, то action обычно “managed“ или “non-interactive“.


userAgent<string>required

User-Agent браузера.
Передавайте только актуальный UA от ОС Windows. Сейчас таковым является: userAgentPlaceholder


data<string>required

Значение поля data можно взять из параметра cData.
Пример: 874291f4retD1366


pageData<string>required

Значение поля pageData можно взять из параметра chlPageData.
Пример: HUHDWUHuhuwfiweh32..uh2uhuhyugYUG=


apiJsUrl<string>optional

Строка, которая содержит ссылку на скрипт капчи.


proxyType<string>optional

http - обычный http/https прокси;
https - попробуйте эту опцию только если "http" не работает (требуется для некоторых кастомных прокси);
socks4 - socks4 прокси;
socks5 - socks5 прокси.


proxyAddress<string>optional

IP адрес прокси IPv4/IPv6. Не допускается:

  • использование прозрачных прокси (там где можно видеть IP клиента);
  • использование прокси на локальных машинах.


proxyPort<integer>optional

Порт прокси.


proxyLogin<string>optional

Логин прокси-сервера.


proxyPassword<string>optional

Пароль прокси-сервера.


Эти параметры находятся в объекте, который передаётся во время создания капчи в функцию window.turnstile.render(el, paramsObj). Получить их можно, например, с помощью выполнения JavaScript перед загрузкой остальных скриптов:

(function () {
const obj = {
render: function () {
const { action, cData, chlPageData } = arguments[1];
const params = [
["action", action],
["data", cData],
["pageData", chlPageData],
];
console.table(params)
}
};

Object.defineProperty(window, "turnstile", {
get: () => {
return obj;
},
});
})();

При вызове window.turnstile.render(el, paramsObj) загружается капча на странице, и при успешном решении вызывается функция callback, которая передает информацию о решении.

window.turnstile.render(el, paramsObj):

el: DOM-элемент для вставки в него капчи.

paramsObj: Объект параметров, содержащий информацию о капче и инструкции для ее решения. Этот объект обычно содержит такие поля, как sitekey, action, cData, chlPageData, callback.

callback – функция обратного вызова после успешного прохождения капчи.


Внимание!
  • Для выполнения данной задачи используйте ваши собственные прокси.

  • После решения вы получите специальные cookie, которые необходимо добавить в браузер.

type<string>required

TurnstileTask


websiteURL<string>required

Адрес страницы, на которой решается капча


websiteKey<string>required

Ключ Cloudflare Challenge. Допускается передача любой строки, например: xxxxxx.


cloudflareTaskType<string>required

cf_clearance


htmlPageBase64<string>required

Закодированная в base64 html страница "Just a moment", которая выдаётся с кодом 403 при обращении к сайту с данной защитой.
Пример получения строки htmlPageBase64:

var serializer = new XMLSerializer();
var fullHtml = serializer.serializeToString(document);

var htmlBase64 = btoa(unescape(encodeURIComponent(fullHtml)));
console.log(htmlBase64);

userAgent<string>required

User-Agent браузера.
Передавайте только актуальный UA от ОС Windows. Сейчас таковым является версия: userAgentPlaceholder


proxyType<string>required

http - обычный HTTP/HTTPS-прокси;
https - пробуйте этот вариант, если «http» не работает (требуется для некоторых кастомных прокси);
socks4 - прокси типа SOCKS4;
socks5 - прокси типа SOCKS5.


proxyAddress<string>required

IP адрес прокси IPv4/IPv6. Не допускается:

  • использование прозрачных прокси (там, где можно видеть IP клиента);
  • использование прокси на локальных машинах.


proxyPort<integer>required

Порт прокси.


proxyLogin<string>required

Логин прокси-сервера.


proxyPassword<string>required

Пароль прокси-сервера.


Метод создания задачи

Вариант 1. Challenge (token)

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

Пример запроса

{
"clientKey": "API_KEY",
"task": {
"type": "TurnstileTask",
"websiteURL": "https://yourwebsite.com/page-with-cf-challenge",
"websiteKey": "your-website-key",
"cloudflareTaskType": "token",
"userAgent": "userAgentPlaceholder",
"pageAction": "your-page-action",
"pageData": "your-page-data",
"data": "your-data"
}
}

Пример ответа

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

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

Пример запроса

{
"clientKey": "API_KEY",
"task": {
"type": "TurnstileTask",
"websiteURL": "https://yourwebsite.com/page-with-cf-challenge",
"websiteKey": "xxxxxxxxxx",
"cloudflareTaskType": "cf_clearance",
"htmlPageBase64": "PCFET0NUWVBFIGh0...vYm9keT48L2h0bWw+",
"userAgent": "userAgentPlaceholder",
"proxyType": "your-proxy-type",
"proxyAddress": "your-proxy-address",
"proxyPort": 1234,
"proxyLogin": "your-proxy-login",
"proxyPassword": "your-proxy-password"
}
}

Пример ответа

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

Метод получения результата задачи

Используйте метод getTaskResult, чтобы получить решение Challenge. В зависимости от загрузки системы вы получите ответ через время в диапазоне от 5 до 20 с.

Вариант 1. Challenge (token)

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

Пример запроса

{
"clientKey": "API_KEY",
"taskId": 407533072
}

Пример ответа

{
"errorId": 0,
"status": "ready",
"solution": {
"userAgent": "userAgentPlaceholder",
"token": "0.iGX3xsyFCkbGePM3jP4P4khLo6TrLukt8ZzBvwuQOvbC...f61f3082"
}
}
СвойствоТипОписание
tokenStringИспользуйте токен при вызове callback функции
POST
https://api.capmonster.cloud/getTaskResult

Пример запроса

{
"clientKey": "API_KEY",
"taskId": 407533072
}

Пример ответа

{
"errorId": 0,
"status": "ready",
"solution": {
"cf_clearance": "1tarGvbY2_ZhQdYxpSBloao.FoOn9VtcJtmb_IQ_hCE-1761217338-1.2.1.1-vyVPoLYIGX0VCJomVuLjF7n0kdM0PXaPjpDsRcohxGr7hb2CE7WfcHpmQZ70goqEjdWxPsDhSVaKNTz9opxWguiNdWEEq_.SceWXIqfP7tnEb69f3bP0mixNqcWy_5P_9INpoAEqr1k7aYU0r45PT4gPr5pwHxedVySyLRdoBXIJasdTE52YOQ3NPdGWTwQ_3h2n_wYqqIvf0kCSAvimRrmsgZxomlyejwqPI6ZHi.w"
}
}
СвойствоТипОписание
cf_clearanceStringСпециальные куки cloudflare, которые вы можете подставить в свой браузер

Как отличить Challenge от Turnstile

Отличия между Challenge и Turnstile

Типы проверок от Cloudflare могут выглядеть по-разному.

Обычный вариант:

Стилизованные варианты:

Challenge органично встроен в сам сайт

Выглядит как обычная капча Turnstile, но на самом деле это Challenge

Чтобы окончательно убедиться в наличии Challenge, можно открыть инструменты разработчика, посмотреть трафик, изучить код страницы и увидеть характерные признаки:

  • Первый запрос к сайту возвращает код 403:

  • Форма с id challenge-form имеет атрибут action (не путать с action из параметров для капчи turnstile), содержащий параметр __cf_chl_f_tk=:

  • На странице находится два похожих тега <script>, которые создают новое значение в объекте window:


Как найти все нужные параметры для создания задачи

Автоматически

Для автоматизации поиска параметров их можно извлекать через браузер (обычный или headless, например, с Playwright) или напрямую из HTTP-запросов. Поскольку значения динамических параметров действуют недолго, их рекомендуется использовать сразу после получения.

Важно!

Приведённые фрагменты кода являются базовыми примерами для ознакомления в извлечении необходимых параметров. Точная реализация будет зависеть от вашего сайта с капчей, его структуры и используемых HTML-элементов и селекторов.

Для варианта 1. Challenge (token) - Node.js
import { chromium } from "playwright";

(async () => {
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();

let params = null;

try {
while (!params) {
await page.goto("https://yourwebsite.com/page-with-cf-challenge");

await page.evaluate(() => {
window.turnstile = new Proxy(window.turnstile, {
get(target, prop) {
if (prop === "render") {
return function (a, b) {
const p = {
websiteKey: b.sitekey,
websiteURL: window.location.href,
data: b.cData,
pagedata: b.chlPageData,
action: b.action,
userAgent: navigator.userAgent,
};
window.params = p;
return target.render.apply(this, arguments);
};
}
return target[prop];
},
});
});

params = await page.evaluate(() => {
return new Promise((resolve) => {
setTimeout(() => resolve(window.params || null), 5000);
});
});

if (!params) {
await page.waitForTimeout(3000);
}
}

console.log("Turnstile Params:", params);
} finally {
await browser.close();
}
})();
Для варианта 2. Challenge (cookie cf_clearance) - Node.js
import { chromium } from "playwright";
import { Buffer } from "buffer";

(async () => {
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();

let websiteKey = null;

while (!websiteKey) {
await page.goto("https://yourwebsite.com/page-with-cf-challenge");

await page.evaluate(() => {
window.turnstile = new Proxy(window.turnstile, {
get(target, prop) {
if (prop === "render") {
return function (a, b) {
window.websiteKey = b.sitekey;
return target.render.apply(this, arguments);
};
}
return target[prop];
},
});
});

websiteKey = await page.evaluate(() => {
return new Promise((resolve) => {
setTimeout(() => resolve(window.websiteKey || null), 5000);
});
});

if (!websiteKey) {
await page.waitForTimeout(3000);
}
}

const html = await page.content();
const htmlPageBase64 = Buffer.from(html).toString("base64");

const result = {
websiteKey,
htmlPageBase64,
};

console.log(result);

await browser.close();
})();

Используйте библиотеку SDK

Вариант 1. Challenge (token)
// https://github.com/ZennoLab/capmonstercloud-client-js

import {
CapMonsterCloudClientFactory,
ClientOptions,
TurnstileRequest
} 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 })
);

// Базовый пример без прокси
// CapMonster Cloud автоматически использует свои прокси
let turnstileRequest = new TurnstileRequest({
websiteURL: "https://yourwebsite.com/page-with-cf-challenge", // URL страницы с капчей
websiteKey: "your-website-key", // Замените на нужное значение
data: "your-data",
pageAction: "managed", // Замените на нужное значение
cloudflareTaskType: "token",
pageData: "your-page-data",
userAgent: "userAgentPlaceholder"
});

// Пример использования вашего собственного прокси
// Раскомментируйте данный блок, если вы хотите использовать собственный прокси

/*
const proxy = {
proxyType: "http",
proxyAddress: "123.45.67.89",
proxyPort: 8080,
proxyLogin: "username",
proxyPassword: "password"
};

turnstileRequest = new TurnstileRequest({
websiteURL: "https://yourwebsite.com/page-with-cf-challenge", // Замените на корректное значение
websiteKey: "your-website-key",
proxy,
data: "your-data",
pageAction: "managed", // Замените на нужное значение
cloudflareTaskType: "token",
pageData: "your-page-data",
userAgent: "userAgentPlaceholder"
});
*/

// При необходимости можно проверить баланс
const balance = await client.getBalance();
console.log("Balance:", balance);

const result = await client.Solve(turnstileRequest);
console.log("Solution:", result);
});
Вариант 2. Challenge (cookie cf_clearance)
// https://github.com/ZennoLab/capmonstercloud-client-js

import {
CapMonsterCloudClientFactory,
ClientOptions,
TurnstileRequest
} from '@zennolab_com/capmonstercloud-client';

document.addEventListener("DOMContentLoaded", async () => {
const cmcClient = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: 'YOUR_API_KEY' }) // Укажите ваш API-ключ CapMonster Cloud
);

// При необходимости можно проверить баланс
const balance = await cmcClient.getBalance();
console.log('Balance:', balance);

const proxy = {
proxyType: "http",
proxyAddress: '123.45.67.89',
proxyPort: 8080,
proxyLogin: 'username',
proxyPassword: 'password'
};

// Cloudflare cf_clearance решается только с вашим прокси
const turnstileRequest = new TurnstileRequest({
websiteURL: 'https://yourwebsite.com/page-with-cf-challenge/', // Замените на корректное значение
websiteKey: 'xxxxx',
cloudflareTaskType: 'cf_clearance',
proxy,
htmlPageBase64: 'PGh0bW...h0bWw+',
userAgent: 'userAgentPlaceholder'
});

// Отправка задачи на решение
const result = await cmcClient.Solve(turnstileRequest);
console.log('Solution:', result.solution);
});

Примеры автоматического решения Cloudflare Challenge (cf_clearance)

Примеры демонстрируют общий порядок работы с Cloudflare Challenge: получение параметров, создание задачи в CapMonster Cloud и использование cookie cf_clearance в последующих запросах. Вы можете использовать официальный SDK или прямую работу с API — выберите удобный вариант интеграции.

Показать код
import { ProxyAgent, setGlobalDispatcher } from "undici";

// ================= КОНФИГ (ИЛИ ИСПОЛЬЗУЙТЕ .ENV) =================

const API_KEY = "YOUR_API_KEY"; // Замените на ваш API-ключ CapMonster Cloud

const URL = "https://www.example.com"; // Замените на целевой URL
const SITEKEY = "xxxxxx";

const UA =
"userAgentPlaceholder";

// ================= ПРОКСИ (ЗАМЕНИТЕ НА ДАННЫЕ ВАШЕГО ПРОКСИ) =================

const PROXY_HOST = "PROXY_HOST";
const PROXY_PORT = 1234;
const PROXY_USER = "PROXY_USER";
const PROXY_PASS = "PROXY_PASS";

const proxy = new ProxyAgent(
`http://${PROXY_USER}:${PROXY_PASS}@${PROXY_HOST}:${PROXY_PORT}`,
);

setGlobalDispatcher(proxy);

// ================= СЕССИЯ =================

let cookieHeader = "";

const headers = {
"User-Agent": UA,
Accept:
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,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",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"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"',
};

// ================= ПОЛУЧЕНИЕ СТРАНИЦЫ =================

async function fetchPage(url) {
const response = await fetch(url, {
method: "GET",
headers: {
...headers,
...(cookieHeader && {
Cookie: cookieHeader,
}),
},
});

const buffer = Buffer.from(await response.arrayBuffer());

return {
status: response.status,
body: buffer,
};
}

// ================= POST ЗАПРОС С JSON =================

async function postJson(url, data) {
const response = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(data),
});

return await response.json();
}

// ================= РЕШЕНИЕ =================

async function solveTurnstile(htmlBase64) {
const create = await postJson("https://api.capmonster.cloud/createTask", {
clientKey: API_KEY,
task: {
type: "TurnstileTask",
websiteURL: URL,
websiteKey: SITEKEY,
cloudflareTaskType: "cf_clearance",
htmlPageBase64: htmlBase64,
userAgent: UA,

proxyType: "http",
proxyAddress: PROXY_HOST,
proxyPort: PROXY_PORT,
proxyLogin: PROXY_USER,
proxyPassword: PROXY_PASS,
},
});

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

const taskId = create.taskId;

console.log("ID задачи:", taskId);

while (true) {
await new Promise((resolve) => setTimeout(resolve, 5000));

const result = await postJson(
"https://api.capmonster.cloud/getTaskResult",
{
clientKey: API_KEY,
taskId,
},
);

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

if (result.status === "ready") {
return result.solution.cf_clearance;
}

console.log("Ожидание...");
}
}

// ================= ОСНОВНАЯ ФУНКЦИЯ =================

async function main() {
// ПЕРВЫЙ ЗАПРОС

const first = await fetchPage(URL);

console.log("Начальный статус:", first.status);

console.log(first.body.toString("utf8").substring(0, 800));

// РЕШЕНИЕ

const htmlBase64 = first.body.toString("base64");

const cfClearance = await solveTurnstile(htmlBase64);

console.log("cf_clearance:", cfClearance);

cookieHeader = `cf_clearance=${cfClearance}`;

// ВТОРОЙ ЗАПРОС

const second = await fetchPage(URL);

console.log("Финальный статус:", second.status);

console.log(second.body.toString("utf8").substring(0, 800));
}

main().catch(console.error);
Показать код (SDK)
import { ProxyAgent, setGlobalDispatcher } from "undici";
import {
CapMonsterCloudClientFactory,
ClientOptions,
TurnstileRequest,
} from "@zennolab_com/capmonstercloud-client";

// ================= КОНФИГ (ИЛИ ИСПОЛЬЗУЙТЕ .ENV) =================

const API_KEY = "YOUR_API_KEY"; // Замените на ваш ключ CapMonster Cloud

const URL = "https://www.example.com"; // Замените на ваш URL
const SITEKEY = "xxxxxx";

const UA =
"userAgentPlaceholder";

// ================= ПРОКСИ (ЗАМЕНИТЕ НА ДАННЫЕ ВАШЕГО ПРОКСИ) =================

const PROXY_HOST = "PROXY_HOST";
const PROXY_PORT = 1234;
const PROXY_USER = "PROXY_USER";
const PROXY_PASS = "PROXY_PASSWORD";

const proxy = new ProxyAgent(
`http://${PROXY_USER}:${PROXY_PASS}@${PROXY_HOST}:${PROXY_PORT}`,
);

setGlobalDispatcher(proxy);

// ================= ИНИЦИАЛИЗАЦИЯ CAPMONSTER CLOUD SDK =================

const cmcClient = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: API_KEY }),
);

// ================= СЕССИЯ =================

let cookieHeader = "";

const headers = {
"User-Agent": UA,
Accept:
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,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",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"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"',
};

// ================= ПОЛУЧЕНИЕ СТРАНИЦЫ =================

async function fetchPage(url) {
const response = await fetch(url, {
method: "GET",
headers: {
...headers,
...(cookieHeader && {
Cookie: cookieHeader,
}),
},
});

const buffer = Buffer.from(await response.arrayBuffer());

return {
status: response.status,
body: buffer,
};
}

// ================= РЕШЕНИЕ ЧЕРЕЗ SDK =================

async function solveTurnstile(htmlBase64) {
try {
// Проверяем баланс (опционально)
const balance = await cmcClient.getBalance();
console.log("Баланс:", balance);

// Создаем запрос на решение
const turnstileRequest = new TurnstileRequest({
websiteURL: URL,
websiteKey: SITEKEY,
cloudflareTaskType: "cf_clearance",
htmlPageBase64: htmlBase64,
userAgent: UA,
proxy: {
proxyType: "http",
proxyAddress: PROXY_HOST,
proxyPort: PROXY_PORT,
proxyLogin: PROXY_USER,
proxyPassword: PROXY_PASS,
},
});

console.log("Отправка задачи на решение...");
const result = await cmcClient.Solve(turnstileRequest);

console.log("Задача решена!");
return result.solution.cf_clearance;
} catch (error) {
throw new Error(`Ошибка CapMonster Cloud SDK: ${error.message}`);
}
}

// ================= ОСНОВНАЯ ФУНКЦИЯ =================

async function main() {
// ПЕРВЫЙ ЗАПРОС

const first = await fetchPage(URL);

console.log("Начальный статус:", first.status);

console.log(first.body.toString("utf8").substring(0, 800));

// РЕШЕНИЕ

const htmlBase64 = first.body.toString("base64");

const cfClearance = await solveTurnstile(htmlBase64);

console.log("cf_clearance:", cfClearance);

cookieHeader = `cf_clearance=${cfClearance}`;

// ВТОРОЙ ЗАПРОС

const second = await fetchPage(URL);

console.log("Финальный статус:", second.status);

console.log(second.body.toString("utf8").substring(0, 800));
}

main().catch(console.error);