///
Что такое Cloudflare CAPTCHA и как её решить с помощью CapMonster Cloud
Екатерина Янчук
Екатерина Янчук
Автор технических статей
7 августа 2024 г.
5 мин

Капча Cloudflare играет важную роль в обеспечении защиты различных веб-сайтов. Обычному пользователю она не доставляет хлопот, а вот при использовании скриптов могут возникнуть трудности, что и является её целью. В данной статье мы рассмотрим эффективные стратегии решения капчи Cloudflare, обращая внимание на возможности CapMonster Cloud – одного из ведущих сервисов по автоматическому решению самых разных типов капч.

robots
Начните сейчас и автоматизируйте решение reCAPTCHA v2

Что такое Cloudflare CAPTCHA и зачем она нужна

Cloudflare капча – это система защиты от автоматических запросов, которая предотвращает злоупотребление ресурсами сайта. Для большинства реальных посетителей данная капча не создаёт каких-либо неудобств, ведь она не требует выполнения определённых задач – проверка чаще всего происходит в фоновом режиме (в ином случае, максимум, что нужно сделать – это кликнуть по окну с надписью “Подтвердите, что вы человек”). 

Удачное прохождение Cloudflare капчи:

none provided

Данное сообщение может появляться в случае обнаружения системой признаков автоматических запросов: 

none provided

Существует два вида капчи от Cloudflare: Turnstile и Challenge. Оба они нацелены на то, чтобы выявлять подозрительные действия и определять, посещает веб-ресурс реальный пользователь или компьютерная программа (скрипт).

Turnstile и Challenge: чем они отличаются

Cloudflare Turnstile находится на самом сайте (виджет можно увидеть, например, ниже формы регистрации), а Cloudflare Challenge сначала вызывает отдельную страницу “Just a moment” с пятисекундной проверкой, а уже потом, в случае успешного её прохождения, открывает посетителю сам сайт.

Пример того, как выглядит обычная CF Turnstile:

none provided

Вызов страницы CF Challenge:

none provided

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

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

none provided
  • Форма с id challenge-form имеет атрибут action (не путать с action из параметров для капчи turnstile), содержащий параметр __cf_chl_f_tk=:
none provided
  • На странице находится два похожих тега <script>, которые создают новое значение в объекте window:
none provided

Капча от Cloudflare – препятствие при парсинге

Парсинг требует эффективности и непрерывности в получении данных, но порой процесс бывает осложнён препятствиями в виде капчи от Cloudflare. Подобные проверки приводят к задержкам и прерываниям. Поэтому возникает необходимость находить способы их преодоления и адаптировать свои методы парсинга  для преодоления Cloudflare CAPTCHA с сохранением необходимого уровня точности и надёжности данных. 

Разработчики и практикующие парсинг данных исследуют различные подходы, среди которых стоит отметить эффективный инструмент для реализации автоматического разгадывания капч – CapMonster Cloud. Облачный сервис облегчает обход блокировок на веб-сайтах, что способствует экономии времени пользователей и упрощает выполнение автоматических задач.

Как решить Cloudflare CAPTCHA с помощью CapMonster Cloud

CapMonster Cloud предоставляет API для решения капч на различных веб-сайтах. Для его использования вам нужно зарегистрироваться, получить API-ключ и использовать его в своем коде или программе. Хоть Cloudflare CAPTCHA и является достаточно серьёзной преградой, решить её всё же не составит труда при правильном составлении задачи для отправки на сервер и получения результата. 

Дальнейшие инструкции помогут вам избежать возможные ошибки при использовании сервиса и решении капчи от Cloudflare. 

Как найти параметры для решения Cloudflare CAPTCHA

Для решения капчи нужно передать в запросе на сервер Capmonster.cloud некоторые обязательные параметры. Для CF Turnstile таким параметром является  websiteKey – ключ капчи, он имеет примерно такой формат: 0x4AAAAAAABUYP0XeMJF0xoy. Найти его можно в коде страницы, например, во вкладке Сеть: 

none provided

Для решения 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);

Список всех параметров для создания задачи на решение Cloudflare и примеры запросов

Turnstile: 

Параметр

Тип

Обязательный

Значения

type

String

да

TurnstileTaskProxyless

websiteURL

String

да

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

websiteKey

String

да

Ключ Turnstile

pageAction

String

нет

Поле action, которое можно найти в callback функции для загрузки капчи

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

https://api.capmonster.cloud/createTask

{
    "clientKey":"dce6bcbb1a728ea8d871de6d169a2057",
    "task":
    {
        "type":"TurnstileTaskProxyless",
        "websiteURL":"http://tsmanaged.zlsupport.com",
        "websiteKey":"0x4AAAAAAABUYP0XeMJF0xoy"
    }
}

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

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

Challenge (для получения токена):

Параметр

Тип

Обязательный

Значение

type

String

да

TurnstileTaskProxyless

websiteURL

String

да

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

websiteKey

String

да

Ключ Turnstile

cloudflareTaskType

String

да

token

userAgent

String

да

User-Agent браузера.

Передавайте только актуальный UA от ОС Windows. Например, на момент написания статьи последней версией является 124 версия: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36

pageAction

String

да

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

data

String

да

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

pageData

String

да

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

Прокси для получения токена передавать не обязательно.

   

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

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

Параметр

Тип

Обязательный

Значение

type

String

да

TurnstileTask

websiteURL

String

да

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

websiteKey

String

да

Ключ Turnstile(можно передать любую строку)

cloudflareTaskType

String

нет

cf_clearance

htmlPageBase64

String

да

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

userAgent

String

да

User-Agent браузера.

Передавайте только актуальный UA от ОС Windows. На момент написания статьи таковым является 124 версия: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36

proxyType

String

да

http - обычный http/https прокси

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

socks4 - socks4 прокси

socks5 - socks5 прокси

proxyAddress

String

да

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

- использование имен хостов

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

- использование прокси на локальных машинах

proxyPort

Integer

да

Порт прокси

proxyLogin

String

да

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

proxyPassword

String

да

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

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

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 с.

Свойство

Тип

Описание

cf_clearance

String

Специальные куки cloudflare, которые вы можете подставить в свой браузер

token

String

Используйте токен при вызове callback функции

Пример реализации решения Cloudflare Challenge с помощью Selenium на Node.js

// Первым шагом импортируем все необходимые зависимости: 

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(); 
  }
})();

Альтернативный вариант скрипта для решения Cloudflare Challenge

Иногда перехват параметров по некоторым причинам не может быть осуществлён сразу, в таком случае можно попробовать добавить перезагрузку страницы с капчей до тех пор, пока параметры не будут получены: 

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 предоставляет решение для таких ситуаций, позволяя легко автоматически решить капчу Cloudflare. Для этого необходимо ознакомиться с процессом формирования запроса на решение капчи, его передачи на сервер сервиса и получения результата. Подробные инструкции и примеры, приведённые в данной статье, могут стать полезным ресурсом для изучения процесса решения капчи и оптимизации его в вашем проекте. Понимание основ и практических аспектов данного процесса поможет вам успешно справиться с задачей решения капчи, минимизируя возможные трудности и ошибки в реализации. 

 

NB: Напоминаем, что продукт используется для автоматизации тестирования на ваших собственных сайтах и на сайтах, к которым у вас есть доступ на законных основаниях.

ItGuy
geear
Партнёрская программа для разработчиков софта
Зарабатывайте до 30% от трат ваших пользователей на обход капчи
✅ Заявка отправлена
Спасибо за интерес к нашей партнёрской программе! Мы свяжемся с вами в течение 7 рабочих дней.
Заявка на подключение
Заполните форму, чтобы отправить заявку на подключение к партнёрской программе