Cloudflare предлагает два действия по вызову, которые операторы сайта могут настроить в правилах WAF: Управляемый вызов и Интерактивный вызов. Managed Challenge — это современный адаптивный подход: Cloudflare определяет сложность каждого посетителя. Интерактивный вызов — это устаревший вариант, всегда представляющий видимую CAPTCHA. Понимание разницы определяет, какой метод CaptchaAI использовать и чего ожидать во время автоматизации.
Быстрое сравнение
| Особенность | Управляемый вызов | Интерактивный вызов |
|---|---|---|
| Представлено | 2021 год | Наследие (до 2021 г.) |
| Адаптивная? | Да (Cloudflare решает для каждого посетителя) | Нет (всегда интерактивно) |
| Возможен невидимый проход? | Да (~90% посетителей проходят незаметно) | Нет (всегда показывает CAPTCHA) |
| Используемые типы испытаний | Невидимый Cloudflare Turnstile → → JS Challenge | Всегда видимая капча |
| Рекомендуется Cloudflare? | Да (по умолчанию для новых правил) | Нет (сохранено для обратной совместимости) |
| Разногласия пользователя | Низкий (большинство проходят, ничего не видя) | Высокий (всегда требует взаимодействия) |
| HTTP-статус | 503 | 403 |
| Метод CaptchaAI | turnstile или turnstile |
turnstile |
Управляемый вызов (современный)
Управляемый вызов — это рекомендуемое действие Cloudflare. Он использует структуру принятия решений, чтобы представить наименее разрушительную задачу:
Поток решений
WAF rule triggers Managed Challenge
↓
Cloudflare evaluates visitor signals:
├─ Browser сигналы браузера quality
├─ IP reputation score
├─ TLS сигналы браузера (JA3/JA4)
├─ Request history
├─ Behavioral signals
└─ Device capabilities
↓
Risk assessment → Challenge level selected:
├─ LOW risk → Invisible pass (no visible UI)
├─ MEDIUM risk → Non-interactive Turnstile (background PoW)
├─ HIGH risk → Interactive Turnstile (checkbox/widget)
└─ VERY HIGH risk → JavaScript challenge page (5s wait)
↓
Challenge completed
↓
qa_validation_cookie cookie issued
Что испытывают посетители
| Тип посетителя | Что они видят | Процент |
|---|---|---|
| Обычный браузер, хороший IP | Ничего (невидимый проход) | ~90% |
| Новый браузер, нейтральный IP | Краткий спиннер | ~5% |
| Подозрительные сигналы | Флажок Cloudflare Turnstile | ~4% |
| Сигналы высокого риска | Страница «Проверка браузера...» | ~1% |
HTML-вывод
На страницах управляемых соревнований используется платформа соревнований Cloudflare:
<!-- Managed Challenge page (when visible) -->
<body>
<div id="challenge-stage">
<div id="challenge-body-text">
Verifying you are human. This may take a few seconds.
</div>
<!-- Turnstile widget (when rendered) -->
<div class="cf-turnstile"
data-sitekey="0x4AAAAAAAC3DHQhMMQ_Rxrg">
</div>
</div>
<!-- Challenge platform script -->
<script src="/cdn-cgi/challenge-platform/h/g/orchestrate/managed/v1?ray=...">
</script>
</body>
Интерактивный вызов (устаревший)
Интерактивный вызов всегда представляет собой видимую капчу, с которой посетитель должен взаимодействовать. Невидимого пропуска нет — каждый посетитель видит и должен выполнить задание.
Как это работает
WAF rule triggers Interactive Challenge
↓
Full-page CAPTCHA served (HTTP 403)
↓
Visitor must interact with CAPTCHA widget
↓
CAPTCHA solved
↓
qa_validation_cookie cookie issued
Что испытывают посетители
Каждый посетитель видит полностраничное задание с виджетом, похожим на Cloudflare Turnstile:
<!-- Interactive Challenge page -->
<body>
<div id="challenge-running">
<div class="main-wrapper">
<h2>Please verify you are human</h2>
<!-- Always-visible challenge widget -->
<div class="challenge-widget">
<!-- Checkbox + verification -->
</div>
</div>
</div>
</body>
Почему Cloudflare не поощряет это
| Проблема | Влияние |
|---|---|
| Всегда видно | 100% посетителей видят задачу |
| Более высокое трение | Каждый посетитель должен взаимодействовать |
| Более высокий показатель отказов | Пользователи уходят, а не завершают |
| Без адаптации к риску | Заведомо хорошие посетители тоже подвергаются испытаниям |
| Проблемы доступности | Каждый посетитель должен завершить взаимодействие |
Обнаружение: с какой проблемой я столкнулся?
import requests
import re
def identify_challenge_type(url):
"""Determine if a URL uses Managed or Interactive Challenge."""
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/120.0.0.0",
"Accept": "text/html,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
}
response = requests.get(url, headers=headers, timeout=15, allow_redirects=False)
html = response.text
status = response.status_code
result = {
"url": url,
"status": status,
"challenge_type": None,
"cf_ray": response.headers.get("cf-ray", ""),
"solve_method": None,
}
if status == 200:
# Check for inline Turnstile widget (not a challenge page)
if "cf-turnstile" in html:
result["challenge_type"] = "turnstile_widget"
result["solve_method"] = "turnstile"
else:
result["challenge_type"] = "none"
return result
if status == 503:
# 503 indicates Managed Challenge or IUAM
if "managed" in html or "challenge-platform" in html:
result["challenge_type"] = "managed_challenge"
result["solve_method"] = "turnstile" # Managed renders as Turnstile
elif "jschl" in html:
result["challenge_type"] = "iuam_js_challenge"
result["solve_method"] = "turnstile"
else:
result["challenge_type"] = "unknown_503"
return result
if status == 403:
if "challenge" in html.lower():
result["challenge_type"] = "interactive_challenge"
result["solve_method"] = "turnstile"
else:
result["challenge_type"] = "waf_block"
result["solve_method"] = None # Hard block, not solvable
return result
return result
# Usage
info = identify_challenge_type("https://protected-site.com/login")
print(f"Challenge: {info['challenge_type']}")
print(f"Solve with: {info['solve_method']}")
Таблица обнаружения
| Сигнал | Управляемый вызов | Интерактивный вызов | МУАМ | Блок WAF |
|---|---|---|---|---|
| Статус HTTP | 503 | 403 | 503 | 403 |
challenge-platform в HTML |
✅ | ✅ | ❌ | ❌ |
managed путь в скрипте |
✅ | ❌ | ❌ | ❌ |
jschl в HTML |
❌ | ❌ | ✅ | ❌ |
| Всегда показывает виджет | ❌ | ✅ | ❌ | ❌ |
| Возможен невидимый проход | ✅ | ❌ | ❌ | ❌ |
Решение каждого типа задач
Решение управляемой задачи
Управляемые испытания обычно отображаются в виде виджетов «Cloudflare Turnstile». Используйте метод turnstile CaptchaAI:
import requests
import time
API_KEY = "YOUR_API_KEY"
def solve_managed_challenge(url, sitekey=None):
"""Solve Cloudflare Managed Challenge."""
# If sitekey not provided, extract from page
if not sitekey:
import re
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/120.0.0.0",
}
page = requests.get(url, headers=headers, timeout=15)
match = re.search(
r'data-sitekey=["\']([0-9x][A-Za-z0-9_-]+)["\']', page.text
)
sitekey = match.group(1) if match else None
if not sitekey:
# No visible Turnstile — try turnstile method
return solve_js_challenge(url)
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "turnstile",
"sitekey": sitekey,
"pageurl": url,
"json": 1,
})
task_id = submit.json()["request"]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "get",
"id": task_id,
"json": 1,
}).json()
if result.get("status") == 1:
return result["request"]
raise TimeoutError("Solve timed out")
def solve_js_challenge(url):
"""Fallback to turnstile method."""
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "turnstile",
"sitekey": "managed",
"pageurl": url,
"json": 1,
})
task_id = submit.json()["request"]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "get",
"id": task_id,
"json": 1,
}).json()
if result.get("status") == 1:
return result["request"]
raise TimeoutError("Solve timed out")
Решение интерактивной задачи
Интерактивный вызов всегда показывает видимый виджет. Используйте тот же метод turnstile:
def solve_interactive_challenge(url, sitekey):
"""Solve Cloudflare Interactive Challenge (legacy)."""
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "turnstile",
"sitekey": sitekey,
"pageurl": url,
"json": 1,
})
task_id = submit.json()["request"]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "get",
"id": task_id,
"json": 1,
}).json()
if result.get("status") == 1:
return result["request"]
raise TimeoutError("Solve timed out")
Node.js (оба типа)
const axios = require("axios");
const API_KEY = "YOUR_API_KEY";
async function solveCloudflareChallenge(url, type = "managed") {
const method = type === "js_challenge" ? "turnstile" : "turnstile";
const sitekey =
type === "js_challenge" ? "managed" : await extractSitekey(url);
const submit = await axios.post("https://ocr.captchaai.com/in.php", null, {
params: {
key: API_KEY,
method,
sitekey: sitekey || "managed",
pageurl: url,
json: 1,
},
});
const taskId = submit.data.request;
for (let i = 0; i < 60; i++) {
await new Promise((r) => setTimeout(r, 5000));
const result = await axios.get("https://ocr.captchaai.com/res.php", {
params: { key: API_KEY, action: "get", id: taskId, json: 1 },
});
if (result.data.status === 1) {
return result.data.request;
}
}
throw new Error("Solve timed out");
}
async function extractSitekey(url) {
try {
const response = await axios.get(url, {
headers: { "User-Agent": "Mozilla/5.0 Chrome/120.0.0.0" },
validateStatus: () => true,
});
const match = response.data.match(
/data-sitekey=["']([0-9x][A-Za-z0-9_-]+)["']/
);
return match ? match[1] : null;
} catch {
return null;
}
}
Миграция с интерактивного на управляемый
Cloudflare рекомендует перейти с интерактивного на управляемый вызов. Если сайт, который вы автоматизируете, переключается:
| Изменять | Влияние на автоматизацию |
|---|---|
| Интерактивный → Управляемый | Может начать проходить незаметно (вероятность ~90%) |
| HTTP 403 → 503 | Обновление проверок кода состояния |
| Всегда видимый адаптивный → | Виджет может быть не в HTML. |
| Тот же ключ сайта | Код решения CaptchaAI остается прежним. |
| Тот же вывод qa_validation_cookie | Обработка файлов cookie остается прежней |
Поиск неисправностей
| Симптом | Причина | Исправить |
|---|---|---|
| 503 без видимого виджета | Управляемый вызов прошел незаметно | Никаких действий не требуется — вы прошли |
| 503 с надписью «Проверка браузера» | Управляемый уровень сложности JS | Используйте метод turnstile. |
| 403 с видимой капчей | Интерактивный вызов (устаревший) | Используйте метод turnstile. |
| 403 без проблем | Блокировка WAF, а не проблема | Изменить IP или запросить шаблон |
| Тип испытания меняется случайным образом | Управляемая задача: адаптация к сигналам | Справьтесь как с Cloudflare Turnstile, так и с задачей JS. |
| qa_validation_cookie одного типа отклонен для другого | Различные потоки задач, одна и та же область | Решите любую поставленную задачу |
Быстрый рабочий процесс детектора
- Проверьте, отображается ли на странице промежуточная страница вызова или встроен ли виджет в поток приложения.
- Прежде чем принять решение о пути обработки, обратите внимание на маркеры cf-chl, контейнеры Cloudflare Turnstile и перехватчики обратного вызова.
- Зарегистрируйте результат обнаружения с помощью URL-адреса страницы и идентификатора прокси-сервера, чтобы повторяющиеся целевые изменения были быстро видны.
Часто задаваемые вопросы
Должен ли я всегда сначала пробовать Managed Challenge?
Да. Большинство сайтов сейчас используют Managed Challenge. Начните с метода turnstile и вернитесь к turnstile, если на странице отображается запрос JavaScript (503 с надписью «Проверка браузера»).
Может ли сайт использовать оба типа на разных страницах?
Да, но это редкость. Каждое правило WAF может иметь свое действие. В одном правиле можно использовать управляемый вызов для /login и интерактивный вызов для /api/.
Нужен ли Managed Challenge файл cookie qa_validation_cookie?
Да. Оба типа задач создают один и тот же файл cookie qa_validation_cookie. Обработка файлов cookie идентична независимо от типа запроса.
Что, если Managed Challenge незаметно пройдет мимо меня?
Если Managed Challenge решает, что ваш запрос имеет низкий уровень риска, он проходит без видимой проблемы. Ваш ответ будет обычным 200 с содержимым страницы. В этом случае решение CaptchaAI не требуется.
Интерактивный вызов устарел?
Cloudflare официально не объявила его устаревшим, но они рекомендуют Managed Challenge для всех новых правил. Interactive Challenge остается для обратной совместимости. Сайты могут быть перенесены в любое время.
Краткое содержание
Управляемый вызов Cloudflare адаптивно выбирает сложность задания для каждого посетителя (невидимая по сравнению с полным вызовом JS), а интерактивный вызов всегда представляет видимую CAPTCHA. Оба создают один и тот же файл cookie qa_validation_cookie и решаются с помощьюCaptchaAI— используйте turnstile для большинства задач и turnstile для страниц задач JavaScript. Управляемый вызов — это современный вариант по умолчанию; Интерактивный вызов — это наследие.
Похожие статьи
- Проверка целостности браузера Cloudflare против Captcha
- страница Cloudflare-защиты в staging против обнаружения Cloudflare Turnstile
- Сравнение Geetest и Cloudflare Turnstile