Cloudflare Turnstile поставляется с тремя режимами виджетов, которые контролируют представление задач: управляемый (решает Cloudflare), неинтерактивный (только подтверждение работы, никогда не отображается пользовательский интерфейс) и невидимый (без контейнера виджетов, работает в автоматическом режиме). Режим определяет, что увидит пользователь, сколько времени займет выполнение задачи и станет ли виджет видимым. Для автоматизации все три режима выдают один и тот же результат — токен cf-turnstile-response — но их обнаружение и решение требует понимания различий.
Сравнение режимов
| Особенность | Удалось | Неинтерактивный | Невидимый |
|---|---|---|---|
| Виджет виден? | Иногда | Никогда (только спиннер) | Никогда |
| Требуется элемент контейнера? | Да | Да | Да (скрыто) |
| Необходимо взаимодействие с пользователем? | Иногда (флажок) | Нет | Нет |
| Проблема с доказательством работы? | Да (может обостриться) | Да (всегда) | Да (всегда) |
| Интерактивный резервный флажок? | Да | Нет (вместо этого происходит сбой) | Нет (вместо этого происходит сбой) |
| Вывод токена | cf-turnstile-response |
cf-turnstile-response |
cf-turnstile-response |
| Метод CaptchaAI | turnstile |
turnstile |
turnstile |
| Рекомендуется для | Войти, зарегистрироваться | Формы с низким коэффициентом трения | Проверка данных |
Управляемый режим (по умолчанию)
Управляемый режим позволяет Cloudflare определять уровень сложности для каждого посетителя. Большинство пользователей проходят незаметно. Подозрительный трафик видит флажок. Очень подозрительный трафик может столкнуться с более сложной проблемой.
Выполнение
<!-- Managed mode (default) -->
<div class="cf-turnstile"
data-sitekey="0x4AAAAAAAC3DHQhMMQ_Rxrg"
data-theme="light">
</div>
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
Что видит автоматизация
Управляемый режим адаптируется на основе сигналов запрашивающей стороны:
| Репутация | Виджет отображается как |
|---|---|
| Высокое доверие | Невидимый проход (без видимого пользовательского интерфейса) |
| Среднее доверие | Виджет флажка (нажмите, чтобы проверить) |
| Низкое доверие | Интерактивный вызов или блокировка |
Для автоматизации управляемый режим является наиболее распространенным и наиболее вариативным. Виджет может быть виден или не виден в зависимости от сигналов браузера.
Обнаружение в HTML
def is_managed_mode(html):
"""Check if Turnstile is using managed mode (default)."""
# Managed mode is the default — no explicit mode attribute
has_turnstile = "cf-turnstile" in html
has_explicit_mode = 'data-appearance="interaction-only"' in html or \
'data-appearance="always"' in html or \
'appearance: "interaction-only"' in html
return has_turnstile and not has_explicit_mode
Неинтерактивный режим
В неинтерактивном режиме никогда не отображаются флажки или интерактивные элементы. Он запускает проверку работоспособности в фоновом режиме и показывает только индикатор загрузки. Если задание не может быть выполнено в неинтерактивном режиме, оно скорее терпит неудачу, чем переходит в эскалацию.
Выполнение
<!-- Non-interactive mode -->
<div class="cf-turnstile"
data-sitekey="0x4AAAAAAAC3DHQhMMQ_Rxrg"
data-appearance="interaction-only">
</div>
Или через JavaScript API:
turnstile.render('#turnstile-container', {
sitekey: '0x4AAAAAAAC3DHQhMMQ_Rxrg',
appearance: 'interaction-only',
callback: function(token) {
document.getElementById('cf-turnstile-response').value = token;
},
});
Поведение
Page loads → Widget initializes
↓
Background proof-of-work runs
↓
Success → Token generated (no visible UI)
OR
Failure → Widget reports error (no fallback to checkbox)
Когда сайты используют неинтерактивный режим
- Формы комментариев и виджеты обратной связи
- Подписка на рассылку
- Малоценные действия, при которых трение должно быть минимальным
- Конечные точки API с защитой на стороне браузера
Невидимый режим
Невидимый режим действительно невидим — в окне просмотра не отображается ни один элемент контейнера. Виджет запускается при загрузке страницы (или программном триггере) и создает токен без какой-либо визуальной индикации.
Выполнение
<!-- Invisible mode — container is hidden -->
<div id="turnstile-invisible"
class="cf-turnstile"
data-sitekey="0x4AAAAAAAC3DHQhMMQ_Rxrg"
data-size="invisible">
</div>
Или полностью через JavaScript:
// Programmatic invisible Turnstile
turnstile.render('#hidden-container', {
sitekey: '0x4AAAAAAAC3DHQhMMQ_Rxrg',
size: 'invisible',
callback: function(token) {
// Token ready — submit form automatically
submitForm(token);
},
'error-callback': function() {
// Challenge failed
console.error('Invisible Turnstile failed');
},
});
Задача обнаружения
Невидимый Cloudflare Turnstile сложнее обнаружить, поскольку контейнер не имеет видимых размеров:
import re
def detect_invisible_turnstile(html):
"""Detect invisible Turnstile on a page."""
indicators = {
"script_loaded": "challenges.cloudflare.com/turnstile" in html,
"size_invisible": 'data-size="invisible"' in html or
"size: 'invisible'" in html or
'size: "invisible"' in html,
"api_render_call": "turnstile.render" in html,
"response_field": "cf-turnstile-response" in html,
}
if indicators["script_loaded"] and indicators["size_invisible"]:
return {"mode": "invisible", "confidence": "high"}
elif indicators["script_loaded"] and indicators["api_render_call"]:
return {"mode": "invisible_or_programmatic", "confidence": "medium"}
elif indicators["response_field"]:
return {"mode": "turnstile_present", "confidence": "low"}
return {"mode": "none", "confidence": "high"}
Извлечение sitekey во всех режимах
Независимо от режима, для решения требуется ключ сайта. Извлеките его из любого режима:
import re
def extract_turnstile_sitekey(html):
"""Extract Turnstile sitekey from page HTML (works for all modes)."""
# Pattern 1: data-sitekey attribute in HTML
match = re.search(r'data-sitekey=["\']([0-9x][A-Za-z0-9_-]+)["\']', html)
if match:
return match.group(1)
# Pattern 2: JavaScript render call
match = re.search(r"sitekey:\s*['\"]([0-9x][A-Za-z0-9_-]+)['\"]", html)
if match:
return match.group(1)
# Pattern 3: Turnstile config object
match = re.search(r"siteKey['\"]?\s*[:=]\s*['\"]([0-9x][A-Za-z0-9_-]+)['\"]", html)
if match:
return match.group(1)
return None
Решение всех трёх режимов с помощью CaptchaAI
Все три режима Cloudflare Turnstile решаются одинаково с помощью CaptchaAI. Режим не влияет на вызов API:
Питон
import requests
import time
API_KEY = "YOUR_API_KEY"
def solve_turnstile(sitekey, page_url):
"""Solve any Turnstile mode — managed, non-interactive, or invisible."""
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "turnstile",
"sitekey": sitekey,
"pageurl": page_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("Turnstile solve timed out")
# Use with any mode
token = solve_turnstile("0x4AAAAAAAC3DHQhMMQ_Rxrg", "https://https://staging.example.com/qa-login")
print(f"Token: {token[:50]}...")
Node.js
const axios = require("axios");
const API_KEY = "YOUR_API_KEY";
async function solveTurnstile(sitekey, pageUrl) {
const submit = await axios.post("https://ocr.captchaai.com/in.php", null, {
params: {
key: API_KEY,
method: "turnstile",
sitekey,
pageurl: pageUrl,
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("Turnstile solve timed out");
}
// Same function works for all Turnstile modes
solveTurnstile("0x4AAAAAAAC3DHQhMMQ_Rxrg", "https://https://staging.example.com/qa-login")
.then((token) => console.log("Token:", token.substring(0, 50)));
Поиск неисправностей
| Симптом | Причина | Исправить |
|---|---|---|
| Токен действителен, но форма отклоняет его | Неправильный ключ сайта (отличается от видимого виджета) | Проверьте наличие ключа сайта, отображаемого с помощью JavaScript. |
| Виджет не найден в HTML | Невидимый режим загружается после первоначального рендеринга | Дождитесь полной загрузки страницы, проверьте ответы XHR. |
| Несколько виджетов Cloudflare Turnstile на странице | Разные ключи сайта для разных форм | Сопоставьте ключ сайта с конкретной формой |
data-size="compact" сбивает с толку обнаружение |
Компактный — это размерный вариант, а не режим. | Компактный использует управляемый режим по умолчанию |
Атрибут data-action присутствует |
Тег действия для аналитики, а не режима | Включите действие в решение, если оно необходимо для проверки. |
| Срок действия токена истекает до отправки | Срок действия токенов Cloudflare Turnstile истекает через 300 секунд. | Решите непосредственно перед отправкой |
Часто задаваемые вопросы
Влияет ли режим Cloudflare Turnstile на решение CaptchaAI?
Нет. CaptchaAI использует один и тот же метод turnstile для всех трех режимов. Ключ сайта и URL-адрес страницы — единственные обязательные параметры. Режим не меняет формат токена или поток проверки.
Как узнать, какой режим использует сайт?
Проверьте HTML на наличие атрибутов data-appearance или data-size. Если присутствует data-size="invisible", это невидимый режим. Если data-appearance="interaction-only" присутствует, он неинтерактивен. Если ни один из них не установлен, это управляемый режим (по умолчанию).
Может ли сайт динамически переключать режимы?
Да. Некоторые сайты по умолчанию используют управляемый режим и переходят в неинтерактивный режим для определенных страниц или сегментов пользователей. Ключ сайта обычно остается прежним. Всегда повторно определяйте режим навигации.
Какова разница в показателях успеха между режимами?
CaptchaAI достигает 100% успеха во всех режимах Cloudflare Turnstile. Этот режим влияет только на поведение пользователя — задача на уровне API идентична.
Краткое содержание
Три режима виджетов Cloudflare Turnstile — управляемый, неинтерактивный и невидимый — контролируют взаимодействие с пользователем, но создают один и тот же токен cf-turnstile-response. Для автоматизации все режимы решаются одинаково с помощьюРешатель Cloudflare Turnstile CaptchaAIсо 100% успехом. Ключевым отличием для разработчиков является обнаружение: управляемый режим показывает видимый HTML-код, а невидимый режим требует более глубокого анализа страницы для поиска ключа сайта.