Explications Techniques

Modes du widget Cloudflare Turnstile : géré, non interactif, invisible

Cloudflare Turnstile est livré avec trois modes de widgets qui contrôlent la façon dont les défis sont présentés : géré (Cloudflare décide), non interactif (preuve de travail uniquement, n'affiche jamais l'interface utilisateur) et invisible (pas de conteneur de widgets, s'exécute en silence). Le mode détermine ce que l'utilisateur voit, la durée du défi et si le widget devient un jour visible. Pour l’automatisation, les trois modes produisent le même résultat – un jeton cf-turnstile-response – mais les détecter et les résoudre nécessite de comprendre les différences.


Comparaison de modes

Caractéristique Géré Non interactif Invisibles
Widget visible ? Parfois Jamais (spinner uniquement) Jamais
Élément conteneur requis ? Oui Oui Oui (caché)
Interaction utilisateur nécessaire ? Parfois (case à cocher) Non Non
Défi de preuve de travail ? Oui (peut dégénérer) Oui (toujours) Oui (toujours)
** Case à cocher interactive de secours ?** Oui Non (échoue à la place) Non (échoue à la place)
Sortie de jeton cf-turnstile-response cf-turnstile-response cf-turnstile-response
Méthode CaptchaAI turnstile turnstile turnstile
Recommandé pour Connexion, inscription Formes à faible friction Vérification des antécédents

Mode géré (par défaut)

Le mode géré permet à Cloudflare de décider du niveau de défi par visiteur. La plupart des utilisateurs passent de manière invisible. Le trafic suspect voit une case à cocher. Le trafic très suspect peut être confronté à un défi plus complexe.

Mise en œuvre

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

Ce que voit l'automatisation

Le mode géré s'adapte en fonction des signaux du demandeur :

Réputation Le widget s'affiche comme
Confiance élevée Pass invisible (pas d'interface utilisateur visible)
Confiance moyenne Widget de case à cocher (cliquez pour vérifier)
Faible confiance Défi ou blocage interactif

Pour l'automatisation, le mode géré est le plus courant et le plus variable. Le widget peut être visible ou non en fonction des signaux du navigateur.

Détection en 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

Mode non interactif

Le mode non interactif n'affiche jamais de case à cocher ou d'élément interactif. Il exécute un défi de preuve de travail en arrière-plan et affiche uniquement une icône de chargement. Si le défi ne peut pas être relevé de manière non interactive, il échoue plutôt que de s’intensifier.

Mise en œuvre

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

Ou via l'API JavaScript :

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

Comportement

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

Lorsque les sites utilisent des

  • Formulaires de commentaires et widgets de commentaires
  • Inscriptions à la newsletter
  • Actions de faible valeur où la friction doit être minimale
  • Points de terminaison d'API avec protection côté navigateur

Mode invisible

Le mode invisible est véritablement invisible : aucun élément conteneur n'apparaît dans la fenêtre. Le widget s'exécute au chargement de la page (ou au déclencheur programmatique) et produit un jeton sans aucune indication visuelle.

Mise en œuvre

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

Ou entièrement via 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');
    },
});

Défi de détection

Le tourniquet invisible est plus difficile à détecter car le conteneur n'a pas de dimensions visibles :

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"}

Extraction de la clé de site dans tous les modes

Quel que soit le mode, la clé du site est requise pour la résolution. Extrayez-le depuis n'importe quel mode :

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

Résoudre les trois modes avec CaptchaAI

Les trois modes Tourniquet sont résolus de la même manière avec CaptchaAI. Le mode n'affecte pas l'appel API :

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]}...")

Noeud.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)));

Dépannage

Symptôme Parce que Corriger
Jeton valide mais le formulaire le rejette Mauvaise clé de site (différente du widget visible) Rechercher la clé de site rendue en JavaScript
Widget introuvable en HTML Mode invisible chargé après le rendu initial Attendez le chargement complet de la page, vérifiez les réponses XHR
Plusieurs widgets Tourniquet sur la page Différentes clés de site pour différents formulaires Faire correspondre la clé du site au formulaire spécifique
data-size="compact" confond la détection Compact est une variante de taille, pas un mode Compact utilise le mode géré par défaut
Attribut data-action présent Balise d'action pour l'analyse, pas un mode Inclure une action dans la résolution si nécessaire pour la validation
Le jeton expire avant la soumission Les jetons de tourniquet expirent dans 300 secondes Résoudre juste avant la soumission

Questions fréquemment posées

Le mode Tourniquet affecte-t-il la résolution de CaptchaAI ?

Non. CaptchaAI utilise la même méthode turnstile pour les trois modes. La clé du site et l'URL de la page sont les seuls paramètres obligatoires. Le mode ne modifie pas le format du jeton ni le flux de validation.

Comment savoir quel mode utilise un site ?

Vérifiez le HTML pour les attributs data-appearance ou data-size. Si data-size="invisible" est présent, c'est le mode invisible. Si data-appearance="interaction-only" est présent, il n'est pas interactif. Si aucun des deux n'est défini, il s'agit du mode géré (par défaut).

Un site peut-il changer de mode de manière dynamique ?

Oui. Certains sites utilisent le mode géré par défaut et passent en mode non interactif pour des pages ou des segments d'utilisateurs spécifiques. La clé du site reste généralement la même. Re-détectez toujours le mode lors de la navigation.

Quelle est la différence de taux de réussite entre les modes ?

CaptchaAI atteint un taux de réussite de 100 % sur tous les modes Tourniquet. Le mode n’affecte que le comportement face à l’utilisateur – le défi au niveau de l’API est identique.


Résumé

Les trois modes de widget de Cloudflare Turnstile — géré, non interactif et invisible — contrôlent l'expérience utilisateur mais produisent le même jeton cf-turnstile-response. Pour l'automatisation, tous les modes sont résolus de manière identique en utilisantSolveur de tourniquet de CaptchaAIavec un taux de réussite de 100%. La principale différence pour les développeurs est la détection : le mode géré affiche le HTML visible, tandis que le mode invisible nécessite une analyse plus approfondie de la page pour trouver la clé du site.

Articles connexes

Les commentaires sont désactivés pour cet article.