Что такое Cloudflare CAPTCHA и как её решить с помощью CapMonster Cloud
Капча Cloudflare играет важную роль в обеспечении защиты различных веб-сайтов. Обычному пользователю она не доставляет хлопот, а вот при использовании скриптов могут возникнуть трудности, что и является её целью. В данной статье мы рассмотрим эффективные стратегии решения капчи Cloudflare, обращая внимание на возможности CapMonster Cloud – одного из ведущих сервисов по автоматическому решению самых разных типов капч.
Cloudflare капча – это система защиты от автоматических запросов, которая предотвращает злоупотребление ресурсами сайта. Для большинства реальных посетителей данная капча не создаёт каких-либо неудобств, ведь она не требует выполнения определённых задач – проверка чаще всего происходит в фоновом режиме (в ином случае, максимум, что нужно сделать – это кликнуть по окну с надписью “Подтвердите, что вы человек”).
Удачное прохождение Cloudflare капчи:
Данное сообщение может появляться в случае обнаружения системой признаков автоматических запросов:
Существует два вида капчи от Cloudflare: Turnstile и Challenge. Оба они нацелены на то, чтобы выявлять подозрительные действия и определять, посещает веб-ресурс реальный пользователь или компьютерная программа (скрипт).
Cloudflare Turnstile находится на самом сайте (виджет можно увидеть, например, ниже формы регистрации), а Cloudflare Challenge сначала вызывает отдельную страницу “Just a moment” с пятисекундной проверкой, а уже потом, в случае успешного её прохождения, открывает посетителю сам сайт.
Пример того, как выглядит обычная CF Turnstile:
Вызов страницы CF Challenge:
Чтобы окончательно убедиться в наличии Cloudflare Challenge, можно при открытии страницы с капчей изучить её код в Инструментах разработчика, посмотреть трафик во вкладке Сеть и увидеть характерные признаки:
Первый запрос к сайту возвращает код 403:
- Форма с id challenge-form имеет атрибут action (не путать с action из параметров для капчи turnstile), содержащий параметр __cf_chl_f_tk=:
- На странице находится два похожих тега <script>, которые создают новое значение в объекте window:
Парсинг требует эффективности и непрерывности в получении данных, но порой процесс бывает осложнён препятствиями в виде капчи от Cloudflare. Подобные проверки приводят к задержкам и прерываниям. Поэтому возникает необходимость находить способы их преодоления и адаптировать свои методы парсинга для преодоления Cloudflare CAPTCHA с сохранением необходимого уровня точности и надёжности данных.
Разработчики и практикующие парсинг данных исследуют различные подходы, среди которых стоит отметить эффективный инструмент для реализации автоматического разгадывания капч – CapMonster Cloud. Облачный сервис облегчает обход блокировок на веб-сайтах, что способствует экономии времени пользователей и упрощает выполнение автоматических задач.
CapMonster Cloud предоставляет API для решения капч на различных веб-сайтах. Для его использования вам нужно зарегистрироваться, получить API-ключ и использовать его в своем коде или программе. Хоть Cloudflare CAPTCHA и является достаточно серьёзной преградой, решить её всё же не составит труда при правильном составлении задачи для отправки на сервер и получения результата.
Дальнейшие инструкции помогут вам избежать возможные ошибки при использовании сервиса и решении капчи от Cloudflare.
Для решения капчи нужно передать в запросе на сервер Capmonster.cloud некоторые обязательные параметры. Для CF Turnstile таким параметром является websiteKey – ключ капчи, он имеет примерно такой формат: 0x4AAAAAAABUYP0XeMJF0xoy. Найти его можно в коде страницы, например, во вкладке Сеть:
Для решения Cloudflare Challenge помимо этого необходимо передавать дополнительные параметры (если вы работаете через браузер, вам потребуется получить токен для прохождения капчи):
- pageAction
- data
- pageData
- userAgent
Все эти параметры не нужно искать вручную, их можно перехватить с помощью Javascript-кода перед загрузкой страницы:
window.turnstile = new Proxy(window.turnstile, {
get(target, prop) {
if (prop === 'render') {
return function(a, b) {
let p = {
type: "TurnstileTaskProxyless",
websiteKey: b.sitekey,
websiteURL: window.location.href,
data: b.cData,
pagedata: b.chlPageData,
action: b.action,
userAgent: navigator.userAgent
};
console.log(JSON.stringify(p));
window.params = p;
window.turnstileCallback = b.callback;
return target.render.apply(this, arguments);
}
}
return target[prop];
}
});
Полученные данные затем используются для создания и отправки задачи на сервер Capmonster.cloud (пример полного скрипта по решению данного типа капчи разберём ниже).
Если вы работаете с помощью запросов, и вам требуются куки cf_clearance, то вам также необходимо указать параметры ваших прокси и htmlPageBase64 – закодированную в base64 html страницу "Just a moment" которая выдаётся с кодом 403 при обращении к сайту с данной защитой.
Пример кода для получения строки htmlPageBase64: var htmlContent = document.documentElement.outerHTML; var htmlBase64 = btoa(unescape(encodeURIComponent(htmlContent))); console.log(htmlBase64); |
Turnstile:
Пример запроса:
https://api.capmonster.cloud/createTask
{
"clientKey":"dce6bcbb1a728ea8d871de6d169a2057",
"task":
{
"type":"TurnstileTaskProxyless",
"websiteURL":"http://tsmanaged.zlsupport.com",
"websiteKey":"0x4AAAAAAABUYP0XeMJF0xoy"
}
}
Пример ответа:
{
"errorId":0,
"taskId":407533072
}
Challenge (для получения токена):
Пример запроса:
https://api.capmonster.cloud/createTask
{
"clientKey": "dce6bcbb1a728ea8d871de6d169a2057",
"task": {
"type": "TurnstileTask",
"websiteURL": "https://site.com",
"websiteKey": "0x4AAAAAAADnPIDROrmt1Wwj",
"cloudflareTaskType": "token",
"userAgent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"pageAction": "managed",
"pageData": "HUHDWUHuhuwfiweh32..uh2uhuhyugYUG=",
"data": "874291f4retD1366"
}
}
Challenge (работа с запросами, когда нужны куки cf_clearance):
Пример запроса:
https://api.capmonster.cloud/createTask
{
"clientKey":"dce6bcbb1a728ea8d871de6d169a2057",
"task": {
"type":"TurnstileTask",
"websiteURL":"https://nowsecure.nl",
"websiteKey":"xxxxxxxxxx",
"cloudflareTaskType": "cf_clearance",
"htmlPageBase64": "PCFET0NUWVBFIGh0...vYm9keT48L2h0bWw+",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"proxyType":"http",
"proxyAddress":"8.8.8.8",
"proxyPort":8080,
"proxyLogin":"proxyLoginHere",
"proxyPassword":"proxyPasswordHere"
}
}
Получение результата:
Используйте метод getTaskResult, чтобы получить решение капчи. В зависимости от загрузки системы вы получите ответ через время в диапазоне от 5 до 20 с.
// Первым шагом импортируем все необходимые зависимости:
const { Builder } = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');
(async function example() {
// Создаём экземпляр драйвера браузера Chrome с помощью Selenium WebDriver
const options = new chrome.Options();
options.addArguments('--auto-open-devtools-for-tabs');
const driver = await new Builder()
.forBrowser('chrome')
.setChromeOptions(options)
.build();
try {
// Переходим на страницу, где необходимо решить Cloudflare Challenge
await driver.get('https://your_site_with_captcha.com');
// Внедряем JavaScript для настройки Proxy объекта window.turnstile
await driver.executeScript(`
window.turnstile = new Proxy(window.turnstile, {
get(target, prop) {
if (prop === 'render') {
return function(a, b) {
// Получаем параметры для задачи TurnstileTaskProxyless
let p = {
type: "TurnstileTaskProxyless",
websiteKey: b.sitekey,
websiteURL: window.location.href,
data: b.cData,
pagedata: b.chlPageData,
action: b.action,
userAgent: navigator.userAgent
};
// Выводим параметры в консоль
console.log(JSON.stringify(p));
window.params = p;
window.turnstileCallback = b.callback;
return target.render.apply(this, arguments);
}
}
return target[prop];
}
});
`);
// Выполнение JavaScript с ожиданием завершения через 5 секунд
const params = await driver.executeAsyncScript(`
const callback = arguments[arguments.length - 1];
setTimeout(() => {
callback(window.params);
}, 5000);
`);
// Выводим полученные параметры в консоль
console.log('Params:', params);
if (params) {
// Формируем данные для создания задачи в сервисе CapMonster
const data = {
clientKey: 'your_API',
task: {
type: 'TurnstileTaskProxyless',
websiteURL: params.websiteURL,
websiteKey: params.websiteKey,
data: params.data,
action: params.action,
cloudflareTaskType: "token",
pageAction: "managed",
pageData: params.pagedata
}
};
// Выводим данные для создания задачи в консоль
console.log('Data:', data);
// Отправляем запрос на создание задачи в CapMonster.cloud
const createResult = await fetch('https://api.capmonster.cloud/createTask', {
method: 'post',
body: JSON.stringify(data)
});
// Получаем результаты создания задачи
const createTaskResult = await createResult.json();
console.log('Create Task Result:', createTaskResult);
if (createTaskResult.taskId) {
const asyncDelay = (timeout) =>
new Promise(resolve => {
setTimeout(() => {
resolve();
}, timeout);
});
// Функция для получения результата задачи с ожиданием завершения
const getTaskResult = async (taskId) => {
const taskResult = await fetch('https://api.capmonster.cloud/getTaskResult', {
method: 'post',
body: JSON.stringify({
"clientKey":"your_API",
"taskId": taskId
})
});
const taskResponse = await taskResult.json();
console.log('Task Response:', taskResponse);
if (taskResponse.status === 'processing') {
await asyncDelay(5000);
return await getTaskResult(taskId);
}
return taskResponse;
};
// Получаем результат выполнения задачи от сервиса CapMonster.cloud
const taskRes = await getTaskResult(createTaskResult.taskId);
console.log('Task Result:', taskRes);
if (taskRes.solution) {
// Выводим токен решения в консоль
console.log('Solution Token:', taskRes.solution.token);
// Создаём функцию обратного вызова для передачи токена решения
await driver.executeScript(`
window.turnstileCallback('${taskRes.solution.token}');
`);
}
}
}
} finally {
await driver.quit();
}
})();
Иногда перехват параметров по некоторым причинам не может быть осуществлён сразу, в таком случае можно попробовать добавить перезагрузку страницы с капчей до тех пор, пока параметры не будут получены:
const { Builder } = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');
(async function example() {
const options = new chrome.Options();
options.addArguments('--auto-open-devtools-for-tabs');
const driver = await new Builder()
.forBrowser('chrome')
.setChromeOptions(options)
.build();
let params = null;
try {
while (!params) {
await driver.get('https://your_site_with_captcha.com/');
await driver.executeScript(`
window.turnstile = new Proxy(window.turnstile, {
get(target, prop) {
if (prop === 'render') {
return function(a, b) {
let p = {
type: "TurnstileTaskProxyless",
websiteKey: b.sitekey,
websiteURL: window.location.href,
data: b.cData,
pagedata: b.chlPageData,
action: b.action,
userAgent: navigator.userAgent
};
console.log(JSON.stringify(p));
window.params = p;
window.turnstileCallback = b.callback;
return target.render.apply(this, arguments);
}
}
return target[prop];
}
});
`);
params = await driver.executeAsyncScript(`
const callback = arguments[arguments.length - 1];
setTimeout(() => {
callback(window.params);
}, 5000);
`);
if (!params) {
console.log('Params not obtained, reloading page...');
await driver.sleep(3000);
}
}
console.log('Params:', params);
const data = {
clientKey: 'your_API_key',
task: {
type: 'TurnstileTaskProxyless',
websiteURL: params.websiteURL,
websiteKey: params.websiteKey,
data: params.data,
action: params.action,
cloudflareTaskType: "token",
pageAction: "managed",
pageData: params.pagedata
}
};
console.log('Data:', data);
const createResult = await fetch('https://api.capmonster.cloud/createTask', {
method: 'post',
body: JSON.stringify(data)
});
const createTaskResult = await createResult.json();
console.log('Create Task Result:', createTaskResult);
if (createTaskResult.taskId) {
const asyncDelay = (timeout) =>
new Promise(resolve => {
setTimeout(() => {
resolve();
}, timeout);
});
const getTaskResult = async (taskId) => {
const taskResult = await fetch('https://api.capmonster.cloud/getTaskResult', {
method: 'post',
body: JSON.stringify({
"clientKey":"your_API_key",
"taskId": taskId
})
});
const taskResponse = await taskResult.json();
console.log('Task Response:', taskResponse);
if (taskResponse.status === 'processing') {
await asyncDelay(5000);
return await getTaskResult(taskId);
}
return taskResponse;
};
const taskRes = await getTaskResult(createTaskResult.taskId);
console.log('Task Result:', taskRes);
if (taskRes.solution) {
console.log('Solution Token:', taskRes.solution.token);
await driver.executeScript(`
window.turnstileCallback('${taskRes.solution.token}');
`);
}
}
} finally {
await driver.quit();
}
})();
Капча, разработанная компанией Cloudflare, представляет собой сложную и надёжную технологию, которая обеспечивает защиту веб-сайтов от различных видов злоумышленной активности, включая спам, DDoS-атаки и другие формы автоматизированных атак. Однако, для некоторых задач может возникнуть необходимость решить эту защиту, например, при автоматизации процессов или интеграции с другими приложениями.
Сервис Capmonster Cloud предоставляет решение для таких ситуаций, позволяя легко решить капчу. Для этого необходимо ознакомиться с процессом формирования запроса на решение капчи, его передачи на сервер сервиса и получения результата. Подробные инструкции и примеры, приведённые в данной статье, могут стать полезным ресурсом для изучения процесса решения капчи и оптимизации его в вашем проекте. Понимание основ и практических аспектов данного процесса поможет вам успешно справиться с задачей решения капчи, минимизируя возможные трудности и ошибки в реализации.
NB: Напоминаем, что продукт используется для автоматизации тестирования на ваших собственных сайтах и на сайтах, к которым у вас есть доступ на законных основаниях.