Cloudflare Turnstile, zorlukların nasıl sunulacağını kontrol eden üç widget moduyla birlikte gelir: yönetilen (Cloudflare karar verir), etkileşimli olmayan (yalnızca iş kanıtı, hiçbir zaman kullanıcı arayüzünü göstermez) ve görünmez (widget kapsayıcısı yoktur, sessizce çalışır). Mod, kullanıcının ne göreceğini, mücadelenin ne kadar süreceğini ve widget'in görünür olup olmayacağını belirler. Otomasyon için, üç modun tümü aynı çıktıyı (bir cf-turnstile-response belirteci) üretir, ancak bunları tespit etmek ve çözmek, farklılıkların anlaşılmasını gerektirir.
Mod karşılaştırması
| Özellik | Yönetilen | Etkileşimli değil | Görünmez |
|---|---|---|---|
| Widget görünüyor mu? | Bazen | Asla (yalnızca döndürücü) | Asla |
| Kapsayıcı öğesi gerekli mi? | Evet | Evet | Evet (gizli) |
| Kullanıcı etkileşimi gerekli mi? | Bazen (onay kutusu) | Hayır | Hayır |
| İş kanıtı mücadelesi mi? | Evet (yükselebilir) | Evet (her zaman) | Evet (her zaman) |
| Etkileşimli onay kutusu geri dönüşü? | Evet | Hayır (bunun yerine başarısız olur) | Hayır (bunun yerine başarısız olur) |
| Jeton çıkışı | cf-turnstile-response |
cf-turnstile-response |
cf-turnstile-response |
| CaptchaAI yöntemi | turnstile |
turnstile |
turnstile |
| Şunlar için önerilir | Giriş yap, kayıt ol | Düşük sürtünmeli formlar | Arka planda doğrulama |
Yönetilen mod (varsayılan)
Yönetilen mod, Cloudflare'in ziyaretçi başına zorluk seviyesine karar vermesine olanak tanır. Çoğu kullanıcı görünmez bir şekilde geçer. Şüpheli trafik bir onay kutusu görür. Son derece şüpheli trafik daha karmaşık bir sorunla karşılaşabilir.
Uygulama
<!-- 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>
Otomasyonun gördüğü şey
Yönetilen mod, istekte bulunanın sinyallerine göre uyarlanır:
| İtibar | Widget şu şekilde oluşturulur: |
|---|---|
| Yüksek güven | Görünmez geçiş (görünür kullanıcı arayüzü yok) |
| Orta güven | Onay kutusu widget'ı (doğrulamak için tıklayın) |
| Düşük güven | İnteraktif meydan okuma veya blok |
Otomasyon için yönetilen mod en yaygın ve en değişken olanıdır. Widget, tarayıcı sinyallerine bağlı olarak görünür olabilir veya olmayabilir.
HTML'de algılama
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
Etkileşimsiz mod
Etkileşimli olmayan mod hiçbir zaman bir onay kutusu veya etkileşimli öğe göstermez. Arka planda bir iş kanıtı sorgulaması çalıştırır ve yalnızca yüklenen bir döndürücüyü gösterir. Eğer meydan okuma etkileşimli olmayan bir şekilde tamamlanamazsa, tırmanmak yerine başarısız olur.
Uygulama
<!-- Non-interactive mode -->
<div class="cf-turnstile"
data-sitekey="0x4AAAAAAAC3DHQhMMQ_Rxrg"
data-appearance="interaction-only">
</div>
Veya JavaScript API'si aracılığıyla:
turnstile.render('#turnstile-container', {
sitekey: '0x4AAAAAAAC3DHQhMMQ_Rxrg',
appearance: 'interaction-only',
callback: function(token) {
document.getElementById('cf-turnstile-response').value = token;
},
});
Davranış
Page loads → Widget initializes
↓
Background proof-of-work runs
↓
Success → Token generated (no visible UI)
OR
Failure → Widget reports error (no fallback to checkbox)
Siteler etkileşimli olmayan kullandığında
- Yorum formları ve geri bildirim widget'ları
- Bülten kayıtları
- Sürtünmenin minimum düzeyde olması gereken düşük değerli eylemler
- Tarayıcı tarafı korumalı API uç noktaları
Görünmez mod
Görünmez mod gerçekten görünmezdir; görünüm alanında hiçbir kapsayıcı öğe görünmez. Widget, sayfa yüklendiğinde (veya programatik tetikleyicide) çalışır ve herhangi bir görsel gösterge olmaksızın bir belirteç üretir.
Uygulama
<!-- Invisible mode — container is hidden -->
<div id="turnstile-invisible"
class="cf-turnstile"
data-sitekey="0x4AAAAAAAC3DHQhMMQ_Rxrg"
data-size="invisible">
</div>
Veya tamamen JavaScript aracılığıyla:
// 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');
},
});
Tespit zorluğu
Görünmez Turnstilenin algılanması zordur çünkü konteynerin görünür boyutları yoktur:
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"}
Tüm modlarda site anahtarını çıkarma
Moddan bağımsız olarak, çözüm için site anahtarı gereklidir. Herhangi bir moddan çıkarın:
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 ile üç modun tamamını çözme
Her üç Turnstile modu da CaptchaAI ile aynı şekilde çözülür. Mod, API çağrısını etkilemez:
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://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://staging.example.com/qa-login")
.then((token) => console.log("Token:", token.substring(0, 50)));
Sorun giderme
| Belirti | Sebep | Düzeltme |
|---|---|---|
| Belirteç geçerli ancak form bunu reddediyor | Yanlış site anahtarı (görünür widget'tan farklı) | JavaScript ile oluşturulan site anahtarını kontrol edin |
| Widget HTML'de bulunamadı | İlk oluşturma işleminden sonra görünmez mod yüklendi | Tam sayfanın yüklenmesini bekleyin, XHR yanıtlarını kontrol edin |
| Sayfada birden fazla Turnstile widget'ı | Farklı formlar için farklı site anahtarları | Site anahtarını belirli bir formla eşleştirin |
data-size="compact" algılamayı karıştırıyor |
Kompakt bir mod değil, bir boyut çeşididir | Kompakt, varsayılan olarak yönetilen modu kullanır |
data-action özelliği mevcut |
Bir mod değil, analitik için eylem etiketi | Doğrulama için gerekiyorsa çözüme eylemi dahil edin |
| Token'ın süresi gönderilmeden önce dolar | Turnstile jetonlarının geçerliliği 300 saniye içinde sona erer | Göndermeden hemen önce çözün |
Sık sorulan sorular
Turnstile modu CaptchaAI'nin çözümünü etkiler mi?
Hayır. CaptchaAI, üç modun tümü için aynı turnstile yöntemini kullanır. Gerekli parametreler yalnızca site anahtarı ve sayfa URL'sidir. Mod, belirteç biçimini veya doğrulama akışını değiştirmez.
Bir sitenin hangi modu kullandığını nasıl bilebilirim?
data-appearance veya data-size nitelikleri için HTML'yi kontrol edin. data-size="invisible" mevcutsa görünmez moddur. data-appearance="interaction-only" mevcutsa etkileşimli değildir. İkisi de ayarlanmamışsa, yönetilen moddur (varsayılan).
Bir site modları dinamik olarak değiştirebilir mi?
Evet. Bazı siteler varsayılan olarak yönetilen modu kullanır ve belirli sayfalar veya kullanıcı segmentleri için etkileşimli olmayan moda geçer. Site anahtarı genellikle aynı kalır. Navigasyonda modu her zaman yeniden tespit edin.
Modlar arasındaki başarı oranı farkı nedir?
CaptchaAI tüm Turnstile modlarında %100 başarı oranına ulaşır. Mod yalnızca kullanıcıya yönelik davranışı etkiler; API düzeyindeki zorluk aynıdır.
Özet
Cloudflare Turnstile'nin üç widget modu (yönetilen, etkileşimli olmayan ve görünmez) kullanıcı deneyimini kontrol eder ancak aynı cf-turnstile-response jetonunu üretir. Otomasyon için tüm modlar aynı şekilde çözülür.CaptchaAI'nin Turnstile çözücüsü%100 başarı oranıyla. Geliştiriciler için temel fark algılamadır: Yönetilen mod görünür HTML'yi gösterirken görünmez mod, site anahtarını bulmak için daha derin sayfa analizi gerektirir.