Технические разборы

Режимы виджета Cloudflare Turnstile Cloudflare: управляемый, неинтерактивный, невидимый

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-код, а невидимый режим требует более глубокого анализа страницы для поиска ключа сайта.

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

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