Explainers

Cloudflare Turnstile Widget-Modi: Verwaltet, Nicht interaktiv, Unsichtbar

Cloudflare Turnstile wird mit drei Widget-Modi geliefert, die steuern, wie Herausforderungen präsentiert werden: verwaltet (Cloudflare entscheidet), nicht interaktiv (nur Proof-of-Work, zeigt nie die Benutzeroberfläche an) und unsichtbar (kein Widget-Container, läuft im Hintergrund). Der Modus bestimmt, was der Benutzer sieht, wie lange die Herausforderung dauert und ob das Widget jemals sichtbar wird. Für die Automatisierung erzeugen alle drei Modi die gleiche Ausgabe – ein cf-turnstile-response-Token – aber um sie zu erkennen und zu lösen, muss man die Unterschiede verstehen.


Modusvergleich

Funktion Verwaltet Nicht interaktiv Unsichtbar
Widget sichtbar? Manchmal Nie (nur Spinner) Niemals
Containerelement erforderlich? Ja Ja Ja (versteckt)
Benutzerinteraktion erforderlich? Manchmal (Kontrollkästchen) Nein Nein
Proof-of-Work-Herausforderung? Ja (kann eskalieren) Ja (immer) Ja (immer)
Interaktives Kontrollkästchen-Fallback? Ja Nein (schlägt stattdessen fehl) Nein (schlägt stattdessen fehl)
Token-Ausgabe cf-turnstile-response cf-turnstile-response cf-turnstile-response
CaptchaAI-Methode turnstile turnstile turnstile
Empfohlen für Einloggen, anmelden Reibungsarme Formen Hintergrundüberprüfung

Verwalteter Modus (Standard)

Im verwalteten Modus kann Cloudflare die Herausforderungsstufe pro Besucher festlegen. Die meisten Benutzer passieren unsichtbar. Bei verdächtigem Datenverkehr wird ein Kontrollkästchen angezeigt. Bei äußerst verdächtigem Datenverkehr stellt sich möglicherweise eine komplexere Herausforderung dar.

Umsetzung

<!-- 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>

Was die Automatisierung sieht

Der verwaltete Modus passt sich basierend auf den Signalen des Anforderers an:

Ruf Widget wird gerendert als
Hohes Vertrauen Unsichtbarer Pass (keine sichtbare Benutzeroberfläche)
Mittleres Vertrauen Kontrollkästchen-Widget (zum Bestätigen klicken)
Geringes Vertrauen Interaktive Herausforderung oder Blockierung

Für die Automatisierung ist der verwaltete Modus der gebräuchlichste und variabelste. Abhängig von den Browsersignalen ist das Widget möglicherweise sichtbar oder nicht.

Erkennung in 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

Nicht interaktiver Modus

Im nicht interaktiven Modus wird niemals ein Kontrollkästchen oder interaktives Element angezeigt. Es führt im Hintergrund eine Proof-of-Work-Herausforderung durch und zeigt nur einen Lade-Spinner an. Wenn die Herausforderung nicht nicht interaktiv abgeschlossen werden kann, schlägt sie fehl und wird nicht eskaliert.

Umsetzung

<!-- Non-interactive mode -->
<div class="cf-turnstile"
     data-sitekey="0x4AAAAAAAC3DHQhMMQ_Rxrg"
     data-appearance="interaction-only">
</div>

Oder über die JavaScript-API:

turnstile.render('#turnstile-container', {
    sitekey: '0x4AAAAAAAC3DHQhMMQ_Rxrg',
    appearance: 'interaction-only',
    callback: function(token) {
        document.getElementById('cf-turnstile-response').value = token;
    },
});

Verhalten

Page loads → Widget initializes
    ↓
Background proof-of-work runs
    ↓
Success → Token generated (no visible UI)
    OR
Failure → Widget reports error (no fallback to checkbox)

Wenn Websites nicht interaktiv sind

  • Kommentarformulare und Feedback-Widgets
  • Newsletter-Anmeldungen
  • Aktionen mit geringem Wert, bei denen die Reibung minimal sein muss
  • API-Endpunkte mit browserseitigem Schutz

Unsichtbarer Modus

Der unsichtbare Modus ist wirklich unsichtbar – im Ansichtsfenster erscheint kein Containerelement. Das Widget wird beim Laden der Seite (oder beim programmgesteuerten Auslöser) ausgeführt und erzeugt ein Token ohne visuelle Anzeige.

Umsetzung

<!-- Invisible mode — container is hidden -->
<div id="turnstile-invisible"
     class="cf-turnstile"
     data-sitekey="0x4AAAAAAAC3DHQhMMQ_Rxrg"
     data-size="invisible">
</div>

Oder komplett per 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');
    },
});

Erkennungsherausforderung

Das unsichtbare Drehkreuz ist schwerer zu erkennen, da der Container keine sichtbaren Abmessungen hat:

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 in allen Modi extrahieren

Unabhängig vom Modus ist zum Lösen der Sitekey erforderlich. Extrahieren Sie es aus einem beliebigen Modus:

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

Alle drei Modi mit CaptchaAI lösen

Alle drei Drehkreuzmodi werden mit CaptchaAI identisch gelöst. Der Modus hat keinen Einfluss auf den API-Aufruf:

Python

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://example.com/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://example.com/login")
  .then((token) => console.log("Token:", token.substring(0, 50)));

Fehlerbehebung

Symptom Ursache Beheben
Token gültig, aber Formular lehnt es ab Falscher Sitekey (anders als sichtbares Widget) Suchen Sie nach einem mit JavaScript gerenderten Sitekey
Widget nicht in HTML gefunden Unsichtbarer Modus, der nach dem ersten Rendern geladen wird Warten Sie, bis die Seite vollständig geladen ist, und überprüfen Sie die XHR-Antworten
Mehrere Drehkreuz-Widgets auf der Seite Verschiedene Sitekeys für verschiedene Formulare Ordnen Sie den Sitekey dem spezifischen Formular zu
data-size="compact" verwirrt die Erkennung Compact ist eine Größenvariante, kein Modus Compact verwendet standardmäßig den verwalteten Modus
data-action-Attribut vorhanden Aktions-Tag für Analysen, kein Modus Beziehen Sie die Aktion in die Lösung ein, falls dies für die Validierung erforderlich ist
Der Token läuft vor der Übermittlung ab Drehkreuzmarken verfallen in 300 Sekunden Unmittelbar vor der Abgabe lösen

Häufig gestellte Fragen

Beeinflusst der Drehkreuzmodus die Lösung von CaptchaAI?

Nein. CaptchaAI verwendet für alle drei Modi dieselbe turnstile-Methode. Der Sitekey und die Seiten-URL sind die einzigen erforderlichen Parameter. Der Modus ändert weder das Tokenformat noch den Validierungsablauf.

Woher weiß ich, welchen Modus eine Website verwendet?

Überprüfen Sie den HTML-Code auf die Attribute data-appearance oder data-size. Wenn data-size="invisible" vorhanden ist, handelt es sich um den unsichtbaren Modus. Wenn data-appearance="interaction-only" vorhanden ist, ist es nicht interaktiv. Wenn keines von beiden festgelegt ist, handelt es sich um den verwalteten Modus (Standardeinstellung).

Kann eine Site den Modus dynamisch wechseln?

Ja. Einige Websites verwenden standardmäßig den verwalteten Modus und wechseln für bestimmte Seiten oder Benutzersegmente in den nicht interaktiven Modus. Der Sitekey bleibt normalerweise gleich. Ermitteln Sie den Modus bei der Navigation immer neu.

Wie groß ist der Erfolgsratenunterschied zwischen den Modi?

CaptchaAI erreicht in allen Drehkreuzmodi eine Erfolgsquote von 100 %. Der Modus wirkt sich nur auf das Benutzerverhalten aus – die Herausforderung auf API-Ebene ist identisch.


Zusammenfassung

Die drei Widget-Modi von Cloudflare Turnstile – verwaltet, nicht interaktiv und unsichtbar – steuern die Benutzererfahrung, erzeugen jedoch das gleiche cf-turnstile-response-Token. Für die Automatisierung werden alle Modi identisch gelöst vom Turnstile-Solver von CaptchaAI mit 100 % Erfolgsquote. Der Hauptunterschied für Entwickler ist die Erkennung: Der verwaltete Modus zeigt sichtbares HTML an, während der unsichtbare Modus eine tiefere Seitenanalyse erfordert, um den Sitekey zu finden.

Verwandte Artikel

  • Cloudflare Turnstile Sitekey-Extraktion
  • GeeTest vs. reCAPTCHA Vergleich
  • Cloudflare Turnstile Fehler beheben
Kommentare sind für diesen Artikel deaktiviert.

Verwandte Beiträge

Comparisons Headless vs. Headed Chrome für CAPTCHA-Tests in eigener QA
Wann sich Headless-Chrome und wann Headed-Chrome für CAPTCHA-Tests in eigenen CI- und QA-Pipelines eignet, und welche Auswirkungen die Wahl auf Stabilität und L...

Wann sich Headless-Chrome und wann Headed-Chrome für CAPTCHA-Tests in eigenen CI- und QA-Pipelines eignet, und...

Apr 17, 2026
Comparisons WebDriver vs. Chrome DevTools Protocol in eigener CAPTCHA-QA
Vergleich von Web Driver und Chrome Dev Tools Protocol für QA-Tests gegen die eigene CAPTCHA-Integration: Stärken, Grenzen und Einsatzempfehlungen.

Vergleich von Web Driver und Chrome Dev Tools Protocol für QA-Tests gegen die eigene CAPTCHA-Integration: Stär...

Apr 17, 2026