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