API Tutorials

Как решить проблему Cloudflare с помощью API

Без прокси запрос на Cloudflare Challenge отклонится, даже не дойдя до решения задачи, — это единственное требование, которое отличает Challenge от любого другого типа CAPTCHA в CaptchaAI.

Дальше всё просто: CaptchaAI проходит полноэкранную заставку «Проверка браузера…» реальным браузерным движком и возвращает cookie qa_validation_cookie, который открывает доступ к защищённой странице. Это принципиально не то же самое, что Cloudflare Turnstile — встраиваемый виджет, который не блокирует весь запрос целиком.

  1. Прокси обязателен — решатель обращается к сайту через ваш прокси, поэтому cookie qa_validation_cookie привязывается к IP-адресу, который контролируете вы, а не CaptchaAI.
  2. API возвращает User-Agent — cookie действует только в связке с конкретной строкой User-Agent. Берите её из ответа как есть, не подставляйте свою.
  3. IP и User-Agent должны совпадать во всех запросах — если хотя бы один из двух параметров отличается от того, что использовал решатель, Cloudflare покажет проверку заново.

Ниже — рабочий процесс целиком, с кодом на Python, Node.js и PHP.

Нужен Cloudflare Turnstile? Это отдельный тип CAPTCHA со своим методом решения. Смотрите Как решить Cloudflare Turnstile через API.


Cloudflare Challenge и Cloudflare Turnstile: в чём разница

Прежде чем настраивать интеграцию, убедитесь, что перед вами именно Challenge, а не Turnstile — у них разная логика получения результата, и перепутанный метод почти всегда приводит к неудачному запросу.

Cloudflare Challenge Cloudflare Turnstile
Как выглядит Полноэкранная заставка («Проверяем браузер…») Виджет внутри формы (флажок или счётчик)
Метод API turnstile turnstile
Нужен ли прокси Да, обязательно Нет, по желанию
Что возвращает API Cookie qa_validation_cookie + User-Agent Токен Cloudflare Turnstile
Что делать с результатом Выставить cookie + User-Agent + тот же прокси на все запросы Подставить токен в поле формы и отправить
Привязка к IP Cookie привязан к IP прокси Токен к IP не привязан
Типичный сценарий Пройти защиту от DDoS перед сбором данных со страницы Отправить защищённую форму (вход, регистрация, оформление заказа)

Если у вас виджет внутри формы, а не полноэкранная заставка — вам нужен метод для Cloudflare Turnstile, не этот.


Что нужно подготовить перед стартом

  • API-ключ CaptchaAI — возьмите на captchaai.com/api.php, строка из 32 символов.
  • URL целевой страницы — полный адрес страницы, защищённой Cloudflare.
  • Рабочий прокси — HTTP, HTTPS, SOCKS4 или SOCKS5, с реальным доступом до целевого сайта.
  • Прокси, включённый в аккаунте CaptchaAI — по умолчанию отключён; включите через тикет в поддержку до первого запроса.
  • Среда выполнения — Python 3.7+ с requests или Node.js 18+ со встроенным fetch.

Инфраструктура парсера может стоять где угодно — в европейском регионе, в Казахстане или у любого другого провайдера, метод не чувствителен к привязке к конкретному облаку. Значение имеет только связка «прокси решателя = прокси всех последующих запросов», а не то, откуда физически идёт трафик.

Важно. Пока в аккаунте не включена поддержка прокси, method=turnstile вернёт ошибку. Сначала откройте заявку в поддержку CaptchaAI.


Как распознать Cloudflare Challenge

Cloudflare Challenge — это полноэкранная заставка, а не встроенный виджет формы. Признаки, что перед вами именно она:

  1. Сообщение «Проверяем браузер…» или «Минуточку…» показывается до того, как загрузится контент.
  2. URL на секунду показывает целевой путь, а затем перекидывает на страницу с заданием.
  3. В заголовках ответаcf-mitigated: challenge либо статус 403 с идентификатором Cloudflare Ray.
  4. В HTML-теле<div id="challenge-body-text"> или ссылки на /cdn-cgi/challenge-platform/.
  5. После прохождения проверки в браузере появляется cookie qa_validation_cookie.

Если вместо этого вы видите небольшой виджет с флажком или счётчиком, встроенный прямо в форму, — это Cloudflare Turnstile, другой тип CAPTCHA со своим методом решения.


Как проходит решение шаг за шагом

Identify страница Cloudflare-защиты в staging page
              ↓
  POST to in.php
    method=turnstile
    pageurl + proxy + proxytype
              ↓
       receive captcha ID
              ↓
     wait 20 seconds
              ↓
  GET res.php (action=get, id=…, json=1)
      ↓                      ↓
 CAPCHA_NOT_READY       status=1
  (wait 5s, retry)           ↓
                  extract qa_validation_cookie + user_agent
                             ↓
              set cookie + User-Agent + same proxy
                             ↓
                   access protected page

Python: полный код решения

import time
import requests

API_KEY = "YOUR_CAPTCHAAI_API_KEY"
PAGE_URL = "https://example.com/protected-page"
PROXY = "user:[email protected]:8080"
PROXY_TYPE = "HTTP"

SUBMIT_URL = "https://ocr.captchaai.com/in.php"
RESULT_URL = "https://ocr.captchaai.com/res.php"


def solve_turnstile(api_key, pageurl, proxy, proxytype):
    """Solve a страница Cloudflare-защиты в staging and return qa_validation_cookie cookie + User-Agent."""

    # Step 1: Submit the task
    submit_resp = requests.post(
        SUBMIT_URL,
        data={
            "key": api_key,
            "method": "turnstile",
            "pageurl": pageurl,
            "proxy": proxy,
            "proxytype": proxytype,
            "json": 1,
        },
        timeout=30,
    )
    submit_resp.raise_for_status()
    submit_data = submit_resp.json()

    if submit_data.get("status") != 1:
        raise RuntimeError(f"Submit failed: {submit_data}")

    captcha_id = submit_data["request"]
    print(f"Task created — captcha ID: {captcha_id}")

    # Step 2: Wait before first poll (страница Cloudflare-защиты в staging takes longer)
    time.sleep(20)

    # Step 3: Poll for result
    for _ in range(60):
        result_resp = requests.get(
            RESULT_URL,
            params={
                "key": api_key,
                "action": "get",
                "id": captcha_id,
                "json": 1,
            },
            timeout=30,
        )
        result_resp.raise_for_status()
        result_data = result_resp.json()

        if result_data.get("request") == "CAPCHA_NOT_READY":
            time.sleep(5)
            continue

        if result_data.get("status") == 1:
            return {
                "qa_validation_cookie": result_data["result"],
                "user_agent": result_data["user_agent"],
            }

        raise RuntimeError(f"Polling error: {result_data}")

    raise TimeoutError("страница Cloudflare-защиты в staging solve timed out")


# Solve the challenge
solution = solve_turnstile(API_KEY, PAGE_URL, PROXY, PROXY_TYPE)
print(f"qa_validation_cookie: {solution['qa_validation_cookie']}")
print(f"User-Agent: {solution['user_agent']}")

# Step 4: Access the protected page using the SAME proxy and User-Agent
session = requests.Session()
session.headers.update({"User-Agent": solution["user_agent"]})
session.cookies.set("qa_validation_cookie", solution["qa_validation_cookie"], domain="example.com")

proxies = {
    "http": f"http://{PROXY}",
    "https": f"http://{PROXY}",
}

response = session.get(PAGE_URL, proxies=proxies, timeout=30)
print(f"Status: {response.status_code}")
print(f"Content length: {len(response.text)} chars")

Что делает код:

  1. Отправляет задачу на in.php с method=turnstile, URL страницы и вашим прокси.
  2. Ждёт 20 секунд, затем опрашивает res.php каждые 5 секунд.
  3. Забирает значение cookie qa_validation_cookie и строку User-Agent решателя.
  4. Обращается к защищённой странице с тем же прокси, cookie и User-Agent.

Важно. Cookie qa_validation_cookie привязан одновременно к IP прокси и к User-Agent. Поменяется хоть один параметр — Cloudflare отклонит запрос и покажет проверку заново.


Node.js: полный код решения

const API_KEY = "YOUR_CAPTCHAAI_API_KEY";
const PAGE_URL = "https://example.com/protected-page";
const PROXY = "user:[email protected]:8080";
const PROXY_TYPE = "HTTP";

const SUBMIT_URL = "https://ocr.captchaai.com/in.php";
const RESULT_URL = "https://ocr.captchaai.com/res.php";

function sleep(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

async function solveCloudflareChallenge(apiKey, pageurl, proxy, proxytype) {
  // Step 1: Submit the task
  const submitResp = await fetch(SUBMIT_URL, {
    method: "POST",
    headers: { "Content-Type": "application/x-www-form-urlencoded" },
    body: new URLSearchParams({
      key: apiKey,
      method: "turnstile",
      pageurl: pageurl,
      proxy: proxy,
      proxytype: proxytype,
      json: "1",
    }),
  });

  const submitData = await submitResp.json();
  if (submitData.status !== 1) {
    throw new Error(`Submit failed: ${JSON.stringify(submitData)}`);
  }

  const captchaId = submitData.request;
  console.log(`Task created — captcha ID: ${captchaId}`);

  // Step 2: Wait before first poll
  await sleep(20_000);

  // Step 3: Poll for result
  for (let i = 0; i < 60; i++) {
    const resultResp = await fetch(
      `${RESULT_URL}?${new URLSearchParams({
        key: apiKey,
        action: "get",
        id: captchaId,
        json: "1",
      })}`
    );

    const resultData = await resultResp.json();

    if (resultData.request === "CAPCHA_NOT_READY") {
      await sleep(5_000);
      continue;
    }

    if (resultData.status === 1) {
      return {
        cfClearance: resultData.result,
        userAgent: resultData.user_agent,
      };
    }

    throw new Error(`Polling error: ${JSON.stringify(resultData)}`);
  }

  throw new Error("страница Cloudflare-защиты в staging solve timed out");
}

(async () => {
  const solution = await solveCloudflareChallenge(
    API_KEY,
    PAGE_URL,
    PROXY,
    PROXY_TYPE
  );
  console.log(`qa_validation_cookie: ${solution.cfClearance}`);
  console.log(`User-Agent: ${solution.userAgent}`);

  // Step 4: Access protected page with cookie, User-Agent, and same proxy
  // Note: Node.js fetch does not natively support proxies.
  // Use a proxy agent library like undici, https-proxy-agent, or node-fetch with proxy.
  // Example with undici:
  //
  // import { ProxyAgent } from 'undici';
  // const proxyAgent = new ProxyAgent(`http://${PROXY}`);
  //
  // const response = await fetch(PAGE_URL, {
  //   headers: {
  //     'User-Agent': solution.userAgent,
  //     'Cookie': `qa_validation_cookie=${solution.cfClearance}`,
  //   },
  //   dispatcher: proxyAgent,
  // });

  console.log("Use the qa_validation_cookie cookie and User-Agent with the same proxy for all subsequent requests.");
})();

PHP: полный код решения

<?php
$apiKey    = "YOUR_CAPTCHAAI_API_KEY";
$pageUrl   = "https://example.com/protected-page";
$proxy     = "user:[email protected]:8080";
$proxyType = "HTTP";

// Step 1: Submit the task
$submit = file_get_contents("https://ocr.captchaai.com/in.php?" . http_build_query([
    "key"       => $apiKey,
    "method"    => "turnstile",
    "pageurl"   => $pageUrl,
    "proxy"     => $proxy,
    "proxytype" => $proxyType,
    "json"      => 1,
]));

$submitData = json_decode($submit, true);
if ($submitData["status"] !== 1) {
    die("Submit failed: " . $submit);
}

$captchaId = $submitData["request"];
echo "Task created — captcha ID: $captchaId\n";

// Step 2: Wait and poll
sleep(20);

$cfClearance = null;
$userAgent   = null;

for ($i = 0; $i < 60; $i++) {
    $result = file_get_contents("https://ocr.captchaai.com/res.php?" . http_build_query([
        "key"    => $apiKey,
        "action" => "get",
        "id"     => $captchaId,
        "json"   => 1,
    ]));

    $resultData = json_decode($result, true);

    if ($resultData["request"] === "CAPCHA_NOT_READY") {
        sleep(5);
        continue;
    }

    if ($resultData["status"] === 1) {
        $cfClearance = $resultData["result"];
        $userAgent   = $resultData["user_agent"];
        echo "qa_validation_cookie: $cfClearance\n";
        echo "User-Agent: $userAgent\n";
        break;
    }

    die("Polling error: " . $result);
}

if (!$cfClearance) {
    die("Solve timed out");
}

// Step 3: Access the protected page
$ch = curl_init($pageUrl);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_PROXY          => "123.123.123.123:8080",
    CURLOPT_PROXYUSERPWD   => "user:password",
    CURLOPT_HTTPHEADER     => ["User-Agent: $userAgent"],
    CURLOPT_COOKIE         => "qa_validation_cookie=$cfClearance",
]);

$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

echo "Status: $httpCode\n";
echo "Content length: " . strlen($response) . " chars\n";

Частые ошибки при интеграции

Прокси не передан в запросе

API отклоняет запрос целиком. Добавьте proxy и proxytype — для Cloudflare Challenge они обязательны, в отличие от большинства других типов CAPTCHA.

Для последующих запросов взят другой прокси

Cloudflare отклоняет cookie qa_validation_cookie, потому что он привязан к IP решателя. Используйте ровно тот же прокси и для решения, и для доступа к защищённой странице.

Подставлен свой User-Agent вместо полученного от API

Cloudflare отклоняет запрос. Берите значение user_agent из ответа API, а не свой браузерный User-Agent.

Запрос отправлен без json=1

В ответе не будет поля user_agent. Всегда передавайте json=1 — только так в ответе окажутся и result (qa_validation_cookie), и user_agent.

Прокси не включён в аккаунте

API возвращает ошибку ещё до решения задачи. Включите использование прокси через поддержку CaptchaAI заранее, а не в момент первого запроса.

Доступ снова блокируется через какое-то время. qa_validation_cookie живёт ограниченное время — обычно 15–30 минут. Решайте заново, как только начались блокировки, вместо того чтобы отлаживать остальной код.

Challenge перепутан с Turnstile

Ушёл не тот метод, решение не проходит. Challenge — полноэкранная заставка, Turnstile — встроенный виджет; оба используют метод turnstile, но разную логику получения и применения результата.


Диагностика ошибок API

Код / симптом Причина Что делать
ERROR_BAD_PROXY Прокси недоступен или помечен как нерабочий Проверьте прокси отдельно, попробуйте другой; формат — login:password@IP:PORT или IP:PORT для IP-аутентификации
ERROR_PROXY_CONNECTION_FAILED CaptchaAI не смог загрузить страницу задания через ваш прокси Прокси временно недоступен или заблокирован целевым сайтом — попробуйте другой
ERROR_CAPTCHA_UNSOLVABLE Прокси слишком медленный/нестабильный, или на сайте есть защита сверх Cloudflare Повторите запрос с новым прокси
Cookie сработал один раз и перестал Cookie истёк, либо Cloudflare обновил задание Решите заново, чтобы получить свежий qa_validation_cookie; отслеживайте долю успешных запросов и решайте проактивно
В ответе нет user_agent Запрос ушёл без json=1 Всегда передавайте json=1 для Cloudflare Challenge
Статус 403, хотя cookie установлен Прокси, User-Agent или домен cookie не совпадают с тем, что использовал решатель Проверьте все три условия; если совпадают — cookie истёк, решите задачу заново

Полный список кодов ошибок CaptchaAI — в справочнике по обработке ошибок (скоро) или в документации на docs.captchaai.com.


Вопросы и ответы

Чем прокси для Cloudflare Challenge отличается от обычного прокси для парсинга?

Технически ничем — подходит любой рабочий HTTP, HTTPS, SOCKS4 или SOCKS5 прокси. Разница не в типе прокси, а в правиле использования: один и тот же прокси должен «видеть» и решение задачи, и все последующие запросы к сайту. Ротация прокси между этими двумя этапами — самая частая причина, по которой свежий cookie qa_validation_cookie не срабатывает.

Что вернёт API, если целевой сайт защищён не только Cloudflare?

ERROR_CAPTCHA_UNSOLVABLE. CaptchaAI решает именно задание Cloudflare; если сайт дополнительно требует логин, капчу другого типа на форме или собственную JS-проверку поверх Challenge, решение cookie не снимет остальные уровни защиты — их нужно проходить отдельными запросами.

Да, если домен и прокси совпадают. Cookie привязан к домену и к IP решателя, а не к конкретному URL — один раз решённый Challenge открывает доступ ко всем страницам этого сайта, пока cookie не истёк. Как только вы переходите на другой домен под Cloudflare, потребуется отдельное решение.

Обычно 15–30 минут, но срок зависит от настроек сайта. Практический сигнал — запросы снова начали получать 403: это значит, что cookie истёк или Cloudflare обновил задание, и нужно решить его повторно, а не отлаживать остальной код.

В чём разница между Cloudflare Challenge и Cloudflare Turnstile?

Challenge — полноэкранная заставка, которая блокирует весь доступ к странице. Turnstile — встроенный в конкретную форму виджет. У Challenge прокси обязателен, у Turnstile — нет. Полное сравнение — в таблице в начале статьи.


Почему CaptchaAI справляется с Cloudflare Challenge

  • Полноценное браузерное решение — реальные экземпляры браузера проходят JavaScript-проверку Cloudflare, а не эмуляция.
  • Возвращает всё нужное сразу — cookie qa_validation_cookie и User-Agent в одном ответе, без дополнительных запросов.
  • Поддержка прокси — работает с HTTP, HTTPS, SOCKS4 и SOCKS5.
  • Единый паттерн API — тот же цикл «отправка → опрос → результат», что и у всех остальных типов CaptchaAI, минимум специфики для изучения.
  • Предсказуемая цена — потоковые тарифы от $15/месяц вместо оплаты за каждое решение.

Нужен рабочий проект целиком — с настройкой окружения, опросом, повторами и обработкой ошибок? Полный рабочий пример на GitHub →


С чего начать

  1. Включите поддержку прокси — через поддержку CaptchaAI, если ещё не сделано.
  2. Получите API-ключcaptchaai.com/api.php.
  3. Подготовьте прокси — HTTP/HTTPS/SOCKS4/SOCKS5, с доступом к целевому сайту.
  4. Возьмите код на Python, Node.js или PHP выше — подставьте свой ключ, URL и прокси.
  5. Используйте qa_validation_cookie + User-Agent + тот же прокси во всех последующих запросах.

Если что-то не сошлось, загляните в раздел диагностики выше или в полное руководство Cloudflare Challenge: ошибки и решения.

Похожие статьи

Комментарии для этой статьи отключены.