Cloudflare Turnstile est l’alternative CAPTCHA qui connaît la croissance la plus rapide. Pour le résoudre avec CaptchaAI, vous avez besoin de la clé du site et de l'URL de la page. Ce guide couvre toutes les manières de trouver la clé de site – des simples requêtes DOM à l'interception des appels de rendu JavaScript.
Où vivent les clés de site Turnstile
Les clés de site des tourniquets apparaissent à trois endroits :
- L'attribut
data-sitekeysur les éléments.cf-turnstile - L'appel JavaScript
turnstile.render() - L'URL iframe
srcdu tourniquet
Méthode 1 : attribut DOM
// Browser console
document.querySelectorAll('.cf-turnstile').forEach((el, i) => {
console.log(`Turnstile ${i}:`, {
sitekey: el.getAttribute('data-sitekey'),
action: el.getAttribute('data-action'),
cData: el.getAttribute('data-cdata'),
theme: el.getAttribute('data-theme'),
});
});
Python (HTML statique)
import re
import requests
html = requests.get("https://example.com/login").text
matches = re.findall(
r'class=["\'][^"\']*cf-turnstile[^"\']*["\'][^>]*data-sitekey=["\']([^"\']+)',
html
)
for sk in matches:
print(f"Sitekey: {sk}")
Python (sélénium)
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://example.com/login")
widgets = driver.find_elements(By.CSS_SELECTOR, ".cf-turnstile")
for w in widgets:
sitekey = w.get_attribute("data-sitekey")
action = w.get_attribute("data-action")
print(f"Sitekey: {sitekey}, Action: {action}")
Méthode 2 : appel de rendu JavaScript
Certains sites affichent Turnstile par programmation :
turnstile.render('#captcha-container', {
sitekey: '0x4AAAAAAAB...',
callback: function(token) {
document.getElementById('cf-token').value = token;
},
});
Extrait de la source de la page :
# Find turnstile.render calls
render_match = re.search(
r'turnstile\.render\s*\([^,]*,\s*\{([^}]+)\}',
html
)
if render_match:
config = render_match.group(1)
sk = re.search(r'sitekey\s*:\s*["\']([^"\']+)', config)
if sk:
print(f"Sitekey from render: {sk.group(1)}")
Interception du marionnettiste
// Intercept turnstile.render before page loads
await page.evaluateOnNewDocument(() => {
window.__turnstileParams = [];
const origRender = window.turnstile?.render;
Object.defineProperty(window, 'turnstile', {
set(val) {
this._turnstile = val;
const orig = val.render;
val.render = function(container, params) {
window.__turnstileParams.push(params);
console.log('Turnstile render:', JSON.stringify(params));
return orig.apply(this, arguments);
};
},
get() { return this._turnstile; }
});
});
await page.goto('https://example.com/login', { waitUntil: 'networkidle2' });
const params = await page.evaluate(() => window.__turnstileParams);
console.log('Captured Turnstile params:', params);
Méthode 3 : Iframe src
Turnstile restitue une iframe. La clé du site est dans son src :
document.querySelectorAll('iframe').forEach(iframe => {
if (iframe.src.includes('challenges.cloudflare.com')) {
console.log('Turnstile iframe:', iframe.src);
const match = iframe.src.match(/sitekey=([A-Za-z0-9_-]+)/);
if (match) console.log('Sitekey:', match[1]);
}
});
Résoudre le tourniquet avec CaptchaAI
Python
import requests
import time
API_KEY = "YOUR_API_KEY"
SITEKEY = "0x4AAAAAAAB..."
PAGE_URL = "https://example.com/login"
# Submit
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "turnstile",
"sitekey": SITEKEY,
"pageurl": PAGE_URL,
"json": "1",
}).json()
if resp["status"] != 1:
raise Exception(f"Submit error: {resp['request']}")
task_id = resp["request"]
# Poll
for _ in range(24):
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["status"] == 1:
token = result["request"]
print(f"Turnstile token: {token[:50]}...")
break
if result["request"] != "CAPCHA_NOT_READY":
raise Exception(f"Error: {result['request']}")
Javascript
const axios = require('axios');
const submit = await axios.post('https://ocr.captchaai.com/in.php', null, {
params: {
key: 'YOUR_API_KEY',
method: 'turnstile',
sitekey: '0x4AAAAAAAB...',
pageurl: 'https://example.com/login',
json: 1,
}
});
const taskId = submit.data.request;
// Poll for result
let token = null;
for (let i = 0; i < 24; i++) {
await new Promise(r => setTimeout(r, 5000));
const poll = await axios.get('https://ocr.captchaai.com/res.php', {
params: { key: 'YOUR_API_KEY', action: 'get', id: taskId, json: 1 }
});
if (poll.data.status === 1) {
token = poll.data.request;
break;
}
}
console.log(`Token: ${token.substring(0, 50)}...`);
Injection de jetons
Turnstile stocke son jeton dans une entrée cachée nommée cf-turnstile-response :
# Selenium
driver.execute_script("""
const input = document.querySelector('input[name="cf-turnstile-response"]');
if (input) input.value = arguments[0];
// Also set in the Turnstile widget's callback
const widget = document.querySelector('.cf-turnstile');
const callbackName = widget?.getAttribute('data-callback');
if (callbackName && typeof window[callbackName] === 'function') {
window[callbackName](arguments[0]);
}
""", token)
Dépannage
| Problème | Parce que | Corriger |
|---|---|---|
Aucun élément .cf-turnstile trouvé |
Rendu dynamiquement | Attendez le chargement de la page ou utilisez MutationObserver |
| Clé de site vide | Définir via l'API JavaScript | Rechercher turnstile.render dans les scripts |
| Jeton rejeté | Mauvaise clé de site ou URL de page | Vérifiez à nouveau que les deux valeurs correspondent au site cible |
Paramètre method incorrect |
Utilisation de userrecaptcha pour le tourniquet |
Utiliser method=turnstile |
FAQ
Turnstile est-il plus difficile à résoudre que reCAPTCHA ?
Non, CaptchaAI gère les deux. Le tourniquet se résout généralement en 10 à 25 secondes, comparable à reCAPTCHA v2.
Turnstile a-t-il un mode invisible ?
Turnstile a des modes « gérés » et « non interactifs » qui n'affichent pas de widget visible. Les méthodes d’extraction de clé de site fonctionnent de la même manière.
Résolvez les CAPTCHA Cloudflare Turnstile avec CaptchaAI
Obtenez votre clé API surcaptchaai.com.
Guides associés
- Extraction des paramètres reCAPTCHA de la source de la page
- Détection CAPTCHA de la console du navigateur
- Tourniquet contre hCaptcha contre reCAPTCHA