Без прокси запрос на Cloudflare Challenge отклонится, даже не дойдя до решения задачи, — это единственное требование, которое отличает Challenge от любого другого типа CAPTCHA в CaptchaAI.
Дальше всё просто: CaptchaAI проходит полноэкранную заставку «Проверка браузера…» реальным браузерным движком и возвращает cookie qa_validation_cookie, который открывает доступ к защищённой странице. Это принципиально не то же самое, что Cloudflare Turnstile — встраиваемый виджет, который не блокирует весь запрос целиком.
- Прокси обязателен — решатель обращается к сайту через ваш прокси, поэтому cookie
qa_validation_cookieпривязывается к IP-адресу, который контролируете вы, а не CaptchaAI. - API возвращает User-Agent — cookie действует только в связке с конкретной строкой User-Agent. Берите её из ответа как есть, не подставляйте свою.
- 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 — это полноэкранная заставка, а не встроенный виджет формы. Признаки, что перед вами именно она:
- Сообщение «Проверяем браузер…» или «Минуточку…» показывается до того, как загрузится контент.
- URL на секунду показывает целевой путь, а затем перекидывает на страницу с заданием.
- В заголовках ответа —
cf-mitigated: challengeлибо статус 403 с идентификатором Cloudflare Ray. - В HTML-теле —
<div id="challenge-body-text">или ссылки на/cdn-cgi/challenge-platform/. - После прохождения проверки в браузере появляется 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")
Что делает код:
- Отправляет задачу на
in.phpсmethod=turnstile, URL страницы и вашим прокси. - Ждёт 20 секунд, затем опрашивает
res.phpкаждые 5 секунд. - Забирает значение cookie
qa_validation_cookieи строку User-Agent решателя. - Обращается к защищённой странице с тем же прокси, 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 заранее, а не в момент первого запроса.
Cookie истёк, а повторного решения нет
Доступ снова блокируется через какое-то время. 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 не снимет остальные уровни защиты — их нужно проходить отдельными запросами.
Можно ли переиспользовать один qa_validation_cookie для нескольких страниц одного сайта?
Да, если домен и прокси совпадают. Cookie привязан к домену и к IP решателя, а не к конкретному URL — один раз решённый Challenge открывает доступ ко всем страницам этого сайта, пока cookie не истёк. Как только вы переходите на другой домен под Cloudflare, потребуется отдельное решение.
Сколько живёт cookie и как понять, что пора решать заново?
Обычно 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 →
С чего начать
- Включите поддержку прокси — через поддержку CaptchaAI, если ещё не сделано.
- Получите API-ключ — captchaai.com/api.php.
- Подготовьте прокси — HTTP/HTTPS/SOCKS4/SOCKS5, с доступом к целевому сайту.
- Возьмите код на Python, Node.js или PHP выше — подставьте свой ключ, URL и прокси.
- Используйте
qa_validation_cookie+ User-Agent + тот же прокси во всех последующих запросах.
Если что-то не сошлось, загляните в раздел диагностики выше или в полное руководство Cloudflare Challenge: ошибки и решения.