Cloudflare Challenge

CapMonster Cloud может возвращать результат решения в виде токена или cf_clearance cookie. Перед началом работы ознакомьтесь с обоими вариантами и выберите тот, который лучше всего подходит для ваших задач.
Параметры запроса
ВАЖНО: значения некоторых параметров являются динамическими — они меняются при каждом рендеринге страницы с Cloudflare Challenge.
Извлекайте их непосредственно перед созданием задачи, чтобы избежать ошибок при решении. Примеры автоматического извлечения параметров см. в разделе Как найти все нужные параметры для создания задачи.
Вариант 1. Challenge (token)
-
CapMonster Cloud по умолчанию работает через встроенные прокси — они уже включены в стоимость. Указывать собственные прокси требуется только в тех случаях, когда сайт не принимает токен или доступ к встроенным сервисам ограничен.
-
Если прокси с авторизацией по IP, то необходимо добавить адрес 65.21.190.34 в белый список.
-
После решения вы получите токен для подтверждения прохождения проверки.
type<string>requiredTurnstileTask
websiteURL<string>requiredАдрес страницы, на которой решается капча
websiteKey<string>requiredКлюч Cloudflare Challenge (см. раздел Как найти все нужные параметры для создания задачи)
Имеет следующий примерный формат: 0x4AAAAAAABUYP0XeMJF0xoy
cloudflareTaskType<string>requiredtoken
pageAction<string>requiredПоле action, которое можно найти в callback функции для загрузки капчи. Если используется cloudflareTaskType, то action обычно “managed“ или “non-interactive“.
userAgent<string>requiredUser-Agent браузера.
Передавайте только актуальный UA от ОС Windows. Сейчас таковым является: userAgentPlaceholder
data<string>requiredЗначение поля data можно взять из параметра cData.
Пример: 874291f4retD1366
pageData<string>requiredЗначение поля pageData можно взять из параметра chlPageData.
Пример: HUHDWUHuhuwfiweh32..uh2uhuhyugYUG=
apiJsUrl<string>optionalСтрока, которая содержит ссылку на скрипт капчи.
proxyType<string>optionalhttp - обычный http/https прокси;
https - попробуйте эту опцию только если "http" не работает (требуется для некоторых кастомных прокси);
socks4 - socks4 прокси;
socks5 - socks5 прокси.
proxyAddress<string>optionalIP адрес прокси 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 – функция обратного вызова после успешного прохождения капчи.
Вариант 2. Challenge (cookie)
-
Для выполнения данной задачи используйте ваши собственные прокси.
-
После решения вы получите специальные cookie, которые необходимо добавить в браузер.
type<string>requiredTurnstileTask
websiteURL<string>requiredАдрес страницы, на которой решается капча
websiteKey<string>requiredКлюч Cloudflare Challenge. Допускается передача любой строки, например: xxxxxx.
cloudflareTaskType<string>requiredcf_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>requiredUser-Agent браузера.
Передавайте только актуальный UA от ОС Windows. Сейчас таковым является версия: userAgentPlaceholder
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Пароль прокси-сервера.
Метод создания задачи
Вариант 1. Challenge (token)
- TurnstileTask (без прокси)
- TurnstileTask (c прокси)
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
}
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",
"proxyType": "your-proxy-type",
"proxyAddress": "your-proxy-address",
"proxyPort": 1234,
"proxyLogin": "your-proxy-login",
"proxyPassword": "your-proxy-password"
}
}
Пример ответа
{
"errorId": 0,
"taskId": 407533072
}
Вариант 2. Challenge (cookie)
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)
https://api.capmonster.cloud/getTaskResult
Пример запроса
{
"clientKey": "API_KEY",
"taskId": 407533072
}
Пример ответа
{
"errorId": 0,
"status": "ready",
"solution": {
"userAgent": "userAgentPlaceholder",
"token": "0.iGX3xsyFCkbGePM3jP4P4khLo6TrLukt8ZzBvwuQOvbC...f61f3082"
}
}
| Свойство | Тип | Описание |
|---|---|---|
| token | String | Используйте токен при вызове callback функции |
Вариант 2. Challenge (cookie)
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_clearance | String | Специальные куки cloudflare, которые вы можете подставить в свой браузер |
Как отличить Challenge от Turnstile
Отличия между Challenge и Turnstile
Типы проверок от Cloudflare могут выглядеть по-разному.
Обычный вариант:

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

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

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

Как найти все нужные параметры для создания задачи
Автоматически
Для автоматизации поиска параметров их можно извлекать через браузер (обычный или headless, например, с Playwright) или напрямую из HTTP-запросов. Поскольку значения динамических параметров действуют недолго, их рекомендуется использовать сразу после получения.
Приведённые фрагменты кода являются базовыми примерами для ознакомления в извлечении необходимых параметров. Точная реализация будет зависеть от вашего сайта с капчей, его структуры и используемых HTML-элементов и селекторов.
- JavaScript
- Python
- C#
Для варианта 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();
})();
Для варианта 1. Challenge (token)
import asyncio
from playwright.async_api import async_playwright
async def extract_turnstile_params():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False)
page = await browser.new_page()
params = None
while not 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];
}
});
""")
await page.wait_for_timeout(5000)
params = await page.evaluate("window.params || null")
if not params:
await page.wait_for_timeout(3000)
print("Turnstile Params:", params)
await browser.close()
asyncio.run(extract_turnstile_params())
Для варианта 2. Challenge (cookie cf_clearance)
import asyncio
import base64
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False)
page = await browser.new_page()
website_key = None
while not website_key:
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];
}
});
}
""")
website_key = await page.evaluate("""
() => new Promise(resolve => {
setTimeout(() => resolve(window.websiteKey || null), 5000);
})
""")
if not website_key:
await page.wait_for_timeout(3000)
html = await page.content()
html_base64 = base64.b64encode(html.encode("utf-8")).decode("utf-8")
result = {
"websiteKey": website_key,
"htmlPageBase64": html_base64
}
print(result)
await browser.close()
asyncio.run(main())
Для варианта 1. Challenge (token)
using Microsoft.Playwright;
using System.Text.Json;
class Program
{
public static async Task Main()
{
using var playwright = await Playwright.CreateAsync();
var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions
{
Headless = false
});
var page = await browser.NewPageAsync();
object? parameters = null;
while (parameters == null)
{
await page.GotoAsync("https://yourwebsite.com/page-with-cf-challenge");
await page.EvaluateAsync(@"() => {
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];
}
});
}");
parameters = await page.EvaluateAsync(@"() => new Promise(resolve => {
setTimeout(() => resolve(window.params || null), 5000);
})");
if (parameters == null)
{
await page.WaitForTimeoutAsync(3000);
}
}
Console.WriteLine("Turnstile Params:");
Console.WriteLine(JsonSerializer.Serialize(parameters, new JsonSerializerOptions { WriteIndented = true }));
await browser.CloseAsync();
}
}
Для варианта 2. Challenge (cookie cf_clearance)
using System;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Playwright;
class Program
{
public static async Task Main()
{
using var playwright = await Playwright.CreateAsync();
var browser = await playwright.Chromium.LaunchAsync(
new BrowserTypeLaunchOptions { Headless = false });
var page = await browser.NewPageAsync();
string websiteKey = null;
while (websiteKey == null)
{
await page.GotoAsync("https://yourwebsite.com/page-with-cf-challenge");
await page.EvaluateAsync(@"() => {
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.EvaluateAsync<string>(@"() =>
new Promise(resolve => {
setTimeout(() => resolve(window.websiteKey || null), 5000);
})");
if (websiteKey == null)
{
await page.WaitForTimeoutAsync(3000);
}
}
var html = await page.ContentAsync();
var htmlBase64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(html));
Console.WriteLine($"websiteKey: {websiteKey}");
Console.WriteLine($"htmlPageBase64: {htmlBase64}");
await browser.CloseAsync();
}
}
Используйте библиотеку SDK
- JavaScript
- Node.js
- Python
- C#
Вариант 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);
});
Вариант 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
(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';
async function main() {
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);
}
main().catch(console.error);
Вариант 1. Challenge (token)
# https://github.com/ZennoLab/capmonstercloud-client-python
import asyncio
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import TurnstileRequest
# from capmonstercloudclient.requests.baseRequestWithProxy import ProxyInfo # Раскомментируйте, если планируете использовать прокси
API_KEY = "YOUR_API_KEY" # Укажите ваш API-ключ CapMonster Cloud
async def solve_turnstile_token():
client_options = ClientOptions(api_key=API_KEY)
cap_monster_client = CapMonsterClient(options=client_options)
# Базовый пример без прокси
# CapMonster Cloud автоматически использует свои прокси
turnstile_request = 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"
)
# Пример использования вашего собственного прокси
# Раскомментируйте данный блок, если вы хотите использовать собственный прокси
#
# proxy = ProxyInfo(
# proxyType="http",
# proxyAddress="123.45.67.89",
# proxyPort=8080,
# proxyLogin="username",
# proxyPassword="password"
# )
#
# turnstile_request = TurnstileRequest(
# websiteURL="https://yourwebsite.com/page-with-cf-challenge/",
# websiteKey="your-website-key",
# proxy=proxy,
# data="your-data",
# pageAction="managed",
# cloudflareTaskType="token",
# pageData="your-page-data",
# userAgent="userAgentPlaceholder"
# )
# При необходимости можно проверить баланс
balance = await cap_monster_client.get_balance()
print("Balance:", balance)
result = await cap_monster_client.solve_captcha(turnstile_request)
print("Solution:", result)
asyncio.run(solve_turnstile_token())
Вариант 2. Challenge (cookie cf_clearance)
# https://github.com/ZennoLab/capmonstercloud-client-python
import asyncio
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import TurnstileRequest
from capmonstercloudclient.requests.baseRequestWithProxy import ProxyInfo # Используем ProxyInfo
API_KEY = "YOUR_API_KEY" # Укажите ваш API-ключ CapMonster Cloud
async def solve_cf_clearance():
client_options = ClientOptions(api_key=API_KEY)
cap_monster_client = CapMonsterClient(options=client_options)
# Пример настройки прокси
proxy = ProxyInfo(
proxyType="http",
proxyAddress="123.45.67.89",
proxyPort=8080,
proxyLogin="username",
proxyPassword="password"
)
# Cloudflare cf_clearance решается только с вашим прокси
turnstile_request = TurnstileRequest(
websiteURL="https://yourwebsite.com/page-with-cf-challenge",
websiteKey="xxxxx",
cloudflareTaskType="cf_clearance",
htmlPageBase64="BASE64_HTML_PAGE_HERE",
userAgent="userAgentPlaceholder",
proxy=proxy
)
# При необходимости можно проверить баланс
balance = await cap_monster_client.get_balance()
print("Balance:", balance)
result = await cap_monster_client.solve_captcha(turnstile_request)
print("Solution:", result)
asyncio.run(solve_cf_clearance())
Вариант 1. Challenge (token)
// https://github.com/ZennoLab/capmonstercloud-client-dotnet
using System;
using System.Threading.Tasks;
using Zennolab.CapMonsterCloud;
using Zennolab.CapMonsterCloud.Requests;
class Program
{
static async Task Main(string[] args)
{
// Ваш API-ключ от CapMonster Cloud
var clientOptions = new ClientOptions
{
ClientKey = "YOUR_API_KEY"
};
var cmCloudClient = CapMonsterCloudClientFactory.Create(clientOptions);
// Базовый пример без прокси
// CapMonster Cloud автоматически использует свои прокси
var turnstileRequest = new TurnstileRequest
{
WebsiteUrl = "https://yourwebsite.com/page-with-cf-challenge", // URL страницы с капчей
WebsiteKey = "your-website-key", // Ваш sitekey
Data = "your-data",
PageAction = "managed", // Замените на нужное значение
CloudflareTaskType = "token",
PageData = "your-page-data",
UserAgent = "userAgentPlaceholder"
};
// Пример использования вашего собственного прокси
// Раскомментируйте данный блок, если вы хотите использовать собственный прокси
/*
var turnstileRequest = new TurnstileRequest
{
WebsiteUrl = "https://yourwebsite.com/page-with-cf-challenge",
WebsiteKey = "your-website-key",
Data = "your-data",
PageAction = "managed", // Замените на нужное значение
CloudflareTaskType = "token",
PageData = "your-page-data",
UserAgent = "userAgentPlaceholder",
Proxy = new ProxyContainer(
"123.45.67.89",
8080,
ProxyType.Http,
"username",
"password"
)
};
*/
// При необходимости можно проверить баланс
var balance = await cmCloudClient.GetBalanceAsync();
Console.WriteLine("Balance: " + balance);
var turnstileResult = await cmCloudClient.SolveAsync(turnstileRequest);
Console.WriteLine("Solution: " + turnstileResult.Solution.Value);
}
}
Вариант 2. Challenge (cookie cf_clearance)
// https://github.com/ZennoLab/capmonstercloud-client-dotnet
using Zennolab.CapMonsterCloud;
using Zennolab.CapMonsterCloud.Requests;
class Program
{
static async Task Main(string[] args)
{
var clientOptions = new ClientOptions
{
ClientKey = "YOUR_API_KEY" // Ваш API-ключ CapMonster Cloud
};
var cmCloudClient = CapMonsterCloudClientFactory.Create(clientOptions);
var turnstileRequest = new TurnstileRequest
{
WebsiteUrl = "https://yourwebsite.com/page-with-cf-challenge", // URL страницы с капчей
WebsiteKey = "xxxxx",
CloudflareTaskType = "cf_clearance",
HtmlPageBase64 = "htmlPageBase64Here",
UserAgent = "userAgentPlaceholder",
Proxy = new ProxyContainer(
"123.45.67.89",
8080,
ProxyType.Http,
"username",
"password"
)
};
var turnstileResult = await cmCloudClient.SolveAsync(turnstileRequest);
Console.WriteLine("Solution: " + turnstileResult.Solution.Clearance);
}
}
Примеры автоматического решения Cloudflare Challenge (cf_clearance)
Примеры демонстрируют общий порядок работы с Cloudflare Challenge: получение параметров, создание задачи в CapMonster Cloud и использование cookie cf_clearance в последующих запросах. Вы можете использовать официальный SDK или прямую работу с API — выберите удобный вариант интеграции.
- Node.js
- Python
- C#
Показать код
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);
Показать код
import time, base64, requests
# ================= КОНФИГ (ИЛИ ИСПОЛЬЗУЙТЕ .ENV) =================
API_KEY = "YOUR_API_KEY" # Замените на ваш API-ключ CapMonster Cloud
URL = "https://www.example.com" # Замените на целевой URL
SITEKEY = "xxxxxx"
UA = "userAgentPlaceholder"
# ================= ПРОКСИ (ЗАМЕНИТЕ НА ДАННЫЕ ВАШЕГО ПРОКСИ) =================
PROXY_HOST = "PROXY_HOST"
PROXY_PORT = 1234
PROXY_USER = "PROXY_USER"
PROXY_PASS = "PROXY_PASSWORD"
PROXY_URL = f"http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}"
PROXY = {
"http": PROXY_URL,
"https": PROXY_URL
}
# ================= СЕССИЯ =================
session = requests.Session()
session.proxies.update(PROXY)
session.headers.update({
"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"'
})
# ================= ПОЛУЧЕНИЕ СТРАНИЦЫ =================
def fetch(url):
return session.get(url, verify=True, timeout=30)
# ================= POST ЗАПРОС С JSON =================
def solve_turnstile(html):
task = {
"clientKey": API_KEY,
"task": {
"type": "TurnstileTask",
"websiteURL": URL,
"websiteKey": SITEKEY,
"cloudflareTaskType": "cf_clearance",
"htmlPageBase64": html,
"userAgent": UA,
"proxyType": "http",
"proxyAddress": PROXY_HOST,
"proxyPort": PROXY_PORT,
"proxyLogin": PROXY_USER,
"proxyPassword": PROXY_PASS
}
}
create = requests.post(
"https://api.capmonster.cloud/createTask",
json=task
).json()
if create.get("errorId"):
raise Exception(create)
task_id = create["taskId"]
print("ID задачи:", task_id)
while True:
time.sleep(5)
result = requests.post(
"https://api.capmonster.cloud/getTaskResult",
json={
"clientKey": API_KEY,
"taskId": task_id
}
).json()
if result.get("errorId"):
raise Exception(result)
if result.get("status") == "ready":
return result["solution"]["cf_clearance"]
print("Ожидание...")
# ================= ОСНОВНАЯ ФУНКЦИЯ =================
# ПЕРВЫЙ ЗАПРОС
resp = fetch(URL)
print("Начальный статус:", resp.status_code)
print("\n--- Начальный фрагмент страницы ---")
print(resp.text[:800])
print("\n----------------------------------\n")
# РЕШЕНИЕ
cookie = solve_turnstile(
base64.b64encode(resp.content).decode()
)
print("cf_clearance:", cookie)
session.cookies.set(
"cf_clearance",
cookie
)
# ВТОРОЙ ЗАПРОС
resp2 = fetch(URL)
print("Финальный статус:", resp2.status_code)
print("\n--- Финальный фрагмент страницы ---")
print(resp2.text[:800])
Показать код (SDK)
import base64, requests
import asyncio
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import TurnstileRequest
from capmonstercloudclient.requests.baseRequestWithProxy import ProxyInfo
# ================= КОНФИГ (ИЛИ ИСПОЛЬЗУЙТЕ .ENV) =================
API_KEY = "YOUR_API_KEY" # Замените на ваш API-ключ CapMonster Cloud
URL = "https://www.example.com" # Замените на целевой URL
SITEKEY = "xxxxxx"
UA = "userAgentPlaceholder"
# ================= ПРОКСИ (ЗАМЕНИТЕ НА ДАННЫЕ ВАШЕГО ПРОКСИ) =================
PROXY_HOST = "PROXY_HOST"
PROXY_PORT = 1234
PROXY_USER = "PROXY_USER"
PROXY_PASS = "PROXY_PASSWORD"
PROXY_URL = f"http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}"
PROXY = {
"http": PROXY_URL,
"https": PROXY_URL
}
# ================= СЕССИЯ =================
session = requests.Session()
session.proxies.update(PROXY)
session.headers.update({
"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"'
})
# ================= ПОЛУЧЕНИЕ СТРАНИЦЫ =================
def fetch(url):
return session.get(url, verify=True, timeout=30)
# ================= РЕШЕНИЕ ЧЕРЕЗ SDK =================
async def solve_turnstile(html_base64):
# Инициализация клиента CapMonster Cloud с использованием API-ключа
client_options = ClientOptions(api_key=API_KEY)
cap_monster_client = CapMonsterClient(options=client_options)
# Проверка баланса (опционально)
try:
balance = await cap_monster_client.get_balance()
print(f"Баланс: {balance}")
except Exception as e:
print(f"Не удалось получить баланс: {e}")
# Настройка прокси для CapMonster Cloud
proxy = ProxyInfo(
proxyType="http",
proxyAddress=PROXY_HOST,
proxyPort=PROXY_PORT,
proxyLogin=PROXY_USER,
proxyPassword=PROXY_PASS
)
# Создание запроса на решение
turnstile_request = TurnstileRequest(
websiteURL=URL,
websiteKey=SITEKEY,
cloudflareTaskType="cf_clearance",
htmlPageBase64=html_base64,
userAgent=UA,
proxy=proxy
)
print("Отправка задачи на решение...")
result = await cap_monster_client.solve_captcha(turnstile_request)
print("Задача решена!")
# Извлекаем cf_clearance из результата
return result.get('cf_clearance')
# ================= ОСНОВНАЯ ФУНКЦИЯ =================
async def main():
# ПЕРВЫЙ ЗАПРОС
resp = fetch(URL)
print("Начальный статус:", resp.status_code)
print("\n--- Начальный фрагмент страницы ---")
print(resp.text[:800])
print("\n----------------------------------\n")
# РЕШЕНИЕ ЧЕРЕЗ SDK
html_base64 = base64.b64encode(resp.content).decode()
cf_clearance = await solve_turnstile(html_base64)
print("cf_clearance:", cf_clearance)
# Установка cookie для сессии
if cf_clearance:
session.cookies.set("cf_clearance", str(cf_clearance))
else:
print("Ошибка: не удалось получить cf_clearance")
return
# ВТОРОЙ ЗАПРОС
resp2 = fetch(URL)
print("Финальный статус:", resp2.status_code)
print("\n--- Финальный фрагмент страницы ---")
print(resp2.text[:800])
# ================= ЗАПУСК =================
if __name__ == "__main__":
asyncio.run(main())
Показать код
using System.Net;
using System.Text;
using System.Text.Json;
using System.Text.Json.Nodes;
class Program
{
// ================= КОНФИГ (ИЛИ ИСПОЛЬЗУЙТЕ .ENV) =================
const string API_KEY = "YOUR_API_KEY";
const string URL = "https://www.example.com";
const string SITEKEY = "xxxxxx";
const string UA =
"userAgentPlaceholder";
// ================= ПРОКСИ (ЗАМЕНИТЕ НА ДАННЫЕ ВАШЕГО ПРОКСИ) =================
const string PROXY_HOST = "PROXY_HOST";
const int PROXY_PORT = 1234;
const string PROXY_USER = "PROXY_USER";
const string PROXY_PASS = "PROXY_PASSWORD";
// ================= СЕССИЯ =================
static readonly CookieContainer Cookies = new();
static readonly HttpClient Client;
static readonly HttpClient Api = new();
static Program()
{
var handler = new HttpClientHandler
{
Proxy = new WebProxy(PROXY_HOST, PROXY_PORT)
{
Credentials = new NetworkCredential(PROXY_USER, PROXY_PASS)
},
UseProxy = true,
CookieContainer = Cookies,
AutomaticDecompression =
DecompressionMethods.GZip |
DecompressionMethods.Deflate
};
Client = new HttpClient(handler)
{
Timeout = TimeSpan.FromSeconds(30)
};
Client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", UA);
Client.DefaultRequestHeaders.TryAddWithoutValidation("Accept",
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8");
Client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Language", "en-US,en;q=0.9");
Client.DefaultRequestHeaders.TryAddWithoutValidation("Upgrade-Insecure-Requests", "1");
Client.DefaultRequestHeaders.TryAddWithoutValidation("Sec-Fetch-Dest", "document");
Client.DefaultRequestHeaders.TryAddWithoutValidation("Sec-Fetch-Mode", "navigate");
Client.DefaultRequestHeaders.TryAddWithoutValidation("Sec-Fetch-Site", "none");
Client.DefaultRequestHeaders.TryAddWithoutValidation("Sec-Fetch-User", "?1");
Client.DefaultRequestHeaders.TryAddWithoutValidation("sec-ch-ua",
"\"Chromium\";v=\"150\", \"Google Chrome\";v=\"150\", \"Not:A-Brand\";v=\"99\"");
Client.DefaultRequestHeaders.TryAddWithoutValidation("sec-ch-ua-mobile", "?0");
Client.DefaultRequestHeaders.TryAddWithoutValidation("sec-ch-ua-platform",
"\"Windows\"");
}
// ================= ПОЛУЧЕНИЕ СТРАНИЦЫ =================
static async Task<(HttpStatusCode Status, byte[] Body)> Fetch()
{
var response = await Client.GetAsync(URL);
return (
response.StatusCode,
await response.Content.ReadAsByteArrayAsync()
);
}
// ================= POST ЗАПРОС С JSON =================
static async Task<JsonNode> PostJson(string url, object body)
{
var response = await Api.PostAsync(
url,
new StringContent(
JsonSerializer.Serialize(body),
Encoding.UTF8,
"application/json"));
var json = await response.Content.ReadAsStringAsync();
return JsonNode.Parse(json)!;
}
static async Task<string> SolveTurnstile(string html)
{
var task = new
{
clientKey = API_KEY,
task = new
{
type = "TurnstileTask",
websiteURL = URL,
websiteKey = SITEKEY,
cloudflareTaskType = "cf_clearance",
htmlPageBase64 = html,
userAgent = UA,
proxyType = "http",
proxyAddress = PROXY_HOST,
proxyPort = PROXY_PORT,
proxyLogin = PROXY_USER,
proxyPassword = PROXY_PASS
}
};
var create = await PostJson(
"https://api.capmonster.cloud/createTask",
task);
if (create["errorId"] != null)
throw new Exception(create.ToString());
int taskId = create["taskId"]!.GetValue<int>();
Console.WriteLine("ID задачи: " + taskId);
while (true)
{
await Task.Delay(5000);
var result = await PostJson(
"https://api.capmonster.cloud/getTaskResult",
new
{
clientKey = API_KEY,
taskId
});
if (result["errorId"] != null)
throw new Exception(result.ToString());
if (result["status"]!.GetValue<string>() == "ready")
{
return result["solution"]!["cf_clearance"]!
.GetValue<string>();
}
Console.WriteLine("Ожидание...");
}
}
// ================= ОСНОВНАЯ ФУНКЦИЯ =================
static async Task Main()
{
// ПЕРВЫЙ ЗАПРОС
var resp = await Fetch();
Console.WriteLine("Начальный статус: " + (int)resp.Status);
Console.WriteLine("\n--- Начальный фрагмент страницы ---");
Console.WriteLine(
Encoding.UTF8.GetString(resp.Body)
.Substring(0, Math.Min(800, resp.Body.Length))
);
Console.WriteLine("\n----------------------------------\n");
// РЕШЕНИЕ
string cookie = await SolveTurnstile(
Convert.ToBase64String(resp.Body)
);
Console.WriteLine("cf_clearance: " + cookie);
Cookies.Add(
new Uri(URL),
new Cookie("cf_clearance", cookie)
);
// ВТОРОЙ ЗАПРОС
var resp2 = await Fetch();
Console.WriteLine("Финальный статус: " + (int)resp2.Status);
Console.WriteLine("\n--- Финальный фрагмент страницы ---");
Console.WriteLine(
Encoding.UTF8.GetString(resp2.Body)
.Substring(0, Math.Min(800, resp2.Body.Length))
);
}
}
Показать код (SDK)
using System.Net;
using System.Text;
using Zennolab.CapMonsterCloud;
using Zennolab.CapMonsterCloud.Requests;
using Zennolab.CapMonsterCloud.Responses;
class Program
{
// ================= КОНФИГ (ИЛИ ИСПОЛЬЗУЙТЕ .ENV) =================
const string API_KEY = "YOUR_API_KEY"; // Замените на ваш API-key CapMonster Cloud
const string URL = "https://www.example.com"; // Замените на целевой URL
const string SITEKEY = "xxxxxx";
const string UA =
"userAgentPlaceholder";
// ================= ПРОКСИ (ЗАМЕНИТЕ НА ДАННЫЕ ВАШЕГО ПРОКСИ) =================
const string PROXY_HOST = "PROXY_HOST";
const int PROXY_PORT = 1234;
const string PROXY_USER = "PROXY_USER";
const string PROXY_PASS = "PROXY_PASSWORD";
// ================= СЕССИЯ =================
static readonly CookieContainer Cookies = new();
static readonly HttpClient Client;
static readonly ICapMonsterCloudClient CmCloudClient;
static Program()
{
// Настройка прокси для HTTP клиента
var handler = new HttpClientHandler
{
Proxy = new WebProxy(PROXY_HOST, PROXY_PORT)
{
Credentials = new NetworkCredential(PROXY_USER, PROXY_PASS)
},
UseProxy = true,
CookieContainer = Cookies,
AutomaticDecompression =
DecompressionMethods.GZip |
DecompressionMethods.Deflate
};
Client = new HttpClient(handler)
{
Timeout = TimeSpan.FromSeconds(30)
};
// Настройка заголовков
Client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", UA);
Client.DefaultRequestHeaders.TryAddWithoutValidation("Accept",
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8");
Client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Language", "en-US,en;q=0.9");
Client.DefaultRequestHeaders.TryAddWithoutValidation("Upgrade-Insecure-Requests", "1");
Client.DefaultRequestHeaders.TryAddWithoutValidation("Sec-Fetch-Dest", "document");
Client.DefaultRequestHeaders.TryAddWithoutValidation("Sec-Fetch-Mode", "navigate");
Client.DefaultRequestHeaders.TryAddWithoutValidation("Sec-Fetch-Site", "none");
Client.DefaultRequestHeaders.TryAddWithoutValidation("Sec-Fetch-User", "?1");
Client.DefaultRequestHeaders.TryAddWithoutValidation("sec-ch-ua",
"\"Chromium\";v=\"150\", \"Google Chrome\";v=\"150\", \"Not:A-Brand\";v=\"99\"");
Client.DefaultRequestHeaders.TryAddWithoutValidation("sec-ch-ua-mobile", "?0");
Client.DefaultRequestHeaders.TryAddWithoutValidation("sec-ch-ua-platform",
"\"Windows\"");
// Инициализация CapMonster Cloud клиента
var clientOptions = new ClientOptions
{
ClientKey = API_KEY
};
CmCloudClient = CapMonsterCloudClientFactory.Create(clientOptions);
}
// ================= ПОЛУЧЕНИЕ СТРАНИЦЫ =================
static async Task<(HttpStatusCode Status, byte[] Body)> Fetch()
{
var response = await Client.GetAsync(URL);
return (
response.StatusCode,
await response.Content.ReadAsByteArrayAsync()
);
}
// ================= РЕШЕНИЕ ЧЕРЕЗ SDK =================
static async Task<string> SolveTurnstile(string htmlBase64)
{
try
{
// Проверка баланса (опционально)
try
{
var balance = await CmCloudClient.GetBalanceAsync(CancellationToken.None);
Console.WriteLine($"Баланс: {balance}");
}
catch (Exception ex)
{
Console.WriteLine($"Не удалось получить баланс: {ex.Message}");
}
// Создание запроса на решение
var turnstileRequest = new TurnstileRequest
{
WebsiteUrl = URL,
WebsiteKey = SITEKEY,
CloudflareTaskType = "cf_clearance",
HtmlPageBase64 = htmlBase64,
UserAgent = UA,
Proxy = new ProxyContainer(
PROXY_HOST,
PROXY_PORT,
ProxyType.Http,
PROXY_USER,
PROXY_PASS
)
};
Console.WriteLine("Отправка задачи на решение...");
// Решение капчи
var result = await CmCloudClient.SolveAsync(turnstileRequest, CancellationToken.None);
Console.WriteLine("Задача решена!");
// Извлечение cf_clearance из результата
if (result.Solution != null)
{
// Пробуем получить Clearance
var clearance = result.Solution.Clearance;
if (!string.IsNullOrEmpty(clearance))
{
return clearance;
}
}
return string.Empty;
}
catch (Exception ex)
{
throw new Exception($"Ошибка CapMonster SDK: {ex.Message}", ex);
}
}
// ================= ОСНОВНАЯ ФУНКЦИЯ =================
static async Task Main()
{
try
{
// ПЕРВЫЙ ЗАПРОС
var resp = await Fetch();
Console.WriteLine($"Начальный статус: {(int)resp.Status}");
Console.WriteLine("\n--- Начальный фрагмент страницы ---");
var bodyText = Encoding.UTF8.GetString(resp.Body);
Console.WriteLine(bodyText.Length > 800 ? bodyText[..800] : bodyText);
Console.WriteLine("\n----------------------------------\n");
// РЕШЕНИЕ ЧЕРЕЗ SDK
var htmlBase64 = Convert.ToBase64String(resp.Body);
var cfClearance = await SolveTurnstile(htmlBase64);
if (string.IsNullOrEmpty(cfClearance))
{
Console.WriteLine("Ошибка: не удалось получить cf_clearance");
return;
}
Console.WriteLine($"cf_clearance: {cfClearance}");
// Установка cookie для сессии
Cookies.Add(
new Uri(URL),
new Cookie("cf_clearance", cfClearance)
);
// ВТОРОЙ ЗАПРОС
var resp2 = await Fetch();
Console.WriteLine($"Финальный статус: {(int)resp2.Status}");
Console.WriteLine("\n--- Финальный фрагмент страницы ---");
var bodyText2 = Encoding.UTF8.GetString(resp2.Body);
Console.WriteLine(bodyText2.Length > 800 ? bodyText2[..800] : bodyText2);
}
catch (Exception ex)
{
Console.WriteLine($"Ошибка: {ex.Message}");
}
}
}
