Cloudflare, site operatörlerinin WAF kurallarında yapılandırabileceği iki sorgulama eylemi sunar: Yönetilen Mücadele ve Etkileşimli Mücadele. Yönetilen Mücadele, modern ve uyarlanabilir bir yaklaşımdır; Cloudflare, ziyaretçi başına zorluğa karar verir. Etkileşimli Mücadele, her zaman görünür bir CAPTCHA sunan eski seçenektir. Farkı anlamak, hangi CaptchaAI yönteminin kullanılacağını ve otomasyon sırasında ne bekleneceğini belirler.
Hızlı karşılaştırma
| Özellik | Yönetilen Mücadele | İnteraktif Mücadele |
|---|---|---|
| Tanıtıldı | 2021 | Eski (2021 öncesi) |
| Uyarlanabilir mi? | Evet (Cloudflare ziyaretçi başına karar verir) | Hayır (her zaman etkileşimli) |
| Görünmez geçiş mümkün mü? | Evet (ziyaretçilerin ~%90'ı görünmez bir şekilde geçer) | Hayır (her zaman CAPTCHA'yı gösterir) |
| Kullanılan zorluk türleri | Görünmez → Turnstile → JS mücadelesi | Her zaman görünür CAPTCHA |
| Cloudflare tarafından mı önerildi? | Evet (yeni kurallar için varsayılan) | Hayır (geriye dönük uyumluluk için korunur) |
| Kullanıcı sürtünmesi | Düşük (çoğu hiçbir şey görmeden geçer) | Yüksek (her zaman etkileşim gerektirir) |
| HTTP durumu | 503 | 403 |
| CaptchaAI yöntemi | turnstile veya cloudflare_challenge |
turnstile |
Yönetilen Mücadele (modern)
Yönetilen Mücadele, Cloudflare'in önerilen meydan okuma eylemidir. Mümkün olan en az yıkıcı zorluğu sunmak için bir karar çerçevesi kullanır:
Karar akışı
WAF rule triggers Managed Challenge
↓
Cloudflare evaluates visitor signals:
├─ Browser test profil yapılandırması quality
├─ IP reputation score
├─ TLS test profil yapılandırması (JA3/JA4)
├─ Request history
├─ Behavioral signals
└─ Device capabilities
↓
Risk assessment → Challenge level selected:
├─ LOW risk → Invisible pass (no visible UI)
├─ MEDIUM risk → Non-interactive Turnstile (background PoW)
├─ HIGH risk → Interactive Turnstile (checkbox/widget)
└─ VERY HIGH risk → JavaScript challenge page (5s wait)
↓
Challenge completed
↓
qa_session_cookie cookie issued
Ziyaretçilerin yaşadıkları
| Ziyaretçi türü | Ne görüyorlar | Yüzde |
|---|---|---|
| Normal tarayıcı, iyi IP | Hiçbir şey (görünmez geçiş) | ~%90 |
| Yeni tarayıcı, nötr IP | Kısa döndürücü | ~%5 |
| Şüpheli sinyaller | Turnstile onay kutusu | ~%4 |
| Yüksek riskli sinyaller | "Tarayıcınız kontrol ediliyor..." sayfası | ~%1 |
HTML çıktısı
Yönetilen Mücadele sayfaları Cloudflare'in meydan okuma platformunu kullanır:
<!-- Managed Challenge page (when visible) -->
<body>
<div id="challenge-stage">
<div id="challenge-body-text">
Verifying you are human. This may take a few seconds.
</div>
<!-- Turnstile widget (when rendered) -->
<div class="cf-turnstile"
data-sitekey="0x4AAAAAAAC3DHQhMMQ_Rxrg">
</div>
</div>
<!-- Challenge platform script -->
<script src="/cdn-cgi/challenge-platform/h/g/orchestrate/managed/v1?ray=...">
</script>
</body>
İnteraktif Mücadele (eski)
İnteraktif Mücadele her zaman ziyaretçinin etkileşimde bulunması gereken görünür bir CAPTCHA sunar. Görünmez bir geçiş yoktur; her ziyaretçi görür ve bu mücadeleyi tamamlamalıdır.
Nasıl çalışır?
WAF rule triggers Interactive Challenge
↓
Full-page CAPTCHA served (HTTP 403)
↓
Visitor must interact with CAPTCHA widget
↓
CAPTCHA solved
↓
qa_session_cookie cookie issued
Ziyaretçilerin yaşadıkları
Her ziyaretçi Turnstile benzeri bir widget içeren tam sayfa bir meydan okumayla karşılaşır:
<!-- Interactive Challenge page -->
<body>
<div id="challenge-running">
<div class="main-wrapper">
<h2>Please verify you are human</h2>
<!-- Always-visible challenge widget -->
<div class="challenge-widget">
<!-- Checkbox + verification -->
</div>
</div>
</div>
</body>
Cloudflare neden bunu caydırıyor?
| Sorun | Etki |
|---|---|
| Her zaman görünür | Ziyaretçilerin %100'ü bu zorluğu görüyor |
| Daha yüksek sürtünme | Her ziyaretçi etkileşime girmelidir |
| Daha yüksek hemen çıkma oranı | Kullanıcılar tamamlamak yerine ayrılıyor |
| Risk adaptasyonu yok | İyi olduğu bilinen ziyaretçiler de zor durumda kalıyor |
| Erişilebilirlik endişeleri | Her ziyaretçi etkileşimi tamamlamalıdır |
Tespit: Hangi zorlukla karşı karşıyayım?
import requests
import re
def identify_challenge_type(url):
"""Determine if a URL uses Managed or Interactive Challenge."""
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/120.0.0.0",
"Accept": "text/html,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
}
response = requests.get(url, headers=headers, timeout=15, allow_redirects=False)
html = response.text
status = response.status_code
result = {
"url": url,
"status": status,
"challenge_type": None,
"cf_ray": response.headers.get("cf-ray", ""),
"solve_method": None,
}
if status == 200:
# Check for inline Turnstile widget (not a challenge page)
if "cf-turnstile" in html:
result["challenge_type"] = "turnstile_widget"
result["solve_method"] = "turnstile"
else:
result["challenge_type"] = "none"
return result
if status == 503:
# 503 indicates Managed Challenge or IUAM
if "managed" in html or "challenge-platform" in html:
result["challenge_type"] = "managed_challenge"
result["solve_method"] = "turnstile" # Managed renders as Turnstile
elif "jschl" in html:
result["challenge_type"] = "iuam_js_challenge"
result["solve_method"] = "cloudflare_challenge"
else:
result["challenge_type"] = "unknown_503"
return result
if status == 403:
if "challenge" in html.lower():
result["challenge_type"] = "interactive_challenge"
result["solve_method"] = "turnstile"
else:
result["challenge_type"] = "waf_block"
result["solve_method"] = None # Hard block, not solvable
return result
return result
# Usage
info = identify_challenge_type("https://protected-site.com/login")
print(f"Challenge: {info['challenge_type']}")
print(f"Solve with: {info['solve_method']}")
Algılama tablosu
| Sinyal | Yönetilen Mücadele | İnteraktif Mücadele | IUAM | WAF Bloğu |
|---|---|---|---|---|
| HTTP durumu | 503 | 403 | 503 | 403 |
HTML'de challenge-platform |
✅ | ✅ | ❌ | ❌ |
Komut dosyasındaki managed yolu |
✅ | ❌ | ❌ | ❌ |
HTML'de jschl |
❌ | ❌ | ✅ | ❌ |
| Her zaman widget'ı gösterir | ❌ | ✅ | ❌ | ❌ |
| Görünmez geçiş mümkün | ✅ | ❌ | ❌ | ❌ |
Her zorluk türünü çözme
Yönetilen Mücadeleyi Çözme
Yönetilen Mücadeleler genellikle Turnstile widget'ları olarak işlenir. CaptchaAI'nin turnstile yöntemini kullanın:
import requests
import time
API_KEY = "YOUR_API_KEY"
def solve_managed_challenge(url, sitekey=None):
"""Solve Cloudflare Managed Challenge."""
# If sitekey not provided, extract from page
if not sitekey:
import re
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/120.0.0.0",
}
page = requests.get(url, headers=headers, timeout=15)
match = re.search(
r'data-sitekey=["\']([0-9x][A-Za-z0-9_-]+)["\']', page.text
)
sitekey = match.group(1) if match else None
if not sitekey:
# No visible Turnstile — try cloudflare_challenge method
return solve_js_challenge(url)
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "turnstile",
"sitekey": sitekey,
"pageurl": 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("Solve timed out")
def solve_js_challenge(url):
"""Fallback to cloudflare_challenge method."""
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "cloudflare_challenge",
"sitekey": "managed",
"pageurl": 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("Solve timed out")
İnteraktif Mücadeleyi Çözme
İnteraktif Mücadele her zaman görünür bir widget gösterir. Aynı turnstile yöntemini kullanın:
def solve_interactive_challenge(url, sitekey):
"""Solve Cloudflare Interactive Challenge (legacy)."""
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "turnstile",
"sitekey": sitekey,
"pageurl": 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("Solve timed out")
Node.js (her iki tür)
const axios = require("axios");
const API_KEY = "YOUR_API_KEY";
async function solveCloudflareChallenge(url, type = "managed") {
const method = type === "js_challenge" ? "cloudflare_challenge" : "turnstile";
const sitekey =
type === "js_challenge" ? "managed" : await extractSitekey(url);
const submit = await axios.post("https://ocr.captchaai.com/in.php", null, {
params: {
key: API_KEY,
method,
sitekey: sitekey || "managed",
pageurl: url,
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("Solve timed out");
}
async function extractSitekey(url) {
try {
const response = await axios.get(url, {
headers: { "User-Agent": "Mozilla/5.0 Chrome/120.0.0.0" },
validateStatus: () => true,
});
const match = response.data.match(
/data-sitekey=["']([0-9x][A-Za-z0-9_-]+)["']/
);
return match ? match[1] : null;
} catch {
return null;
}
}
Etkileşimli'den Yönetilen'e Geçiş
Cloudflare, Interactive'den Managed Challenge'a geçmenizi önerir. Otomatikleştirdiğiniz bir site geçiş yapıyorsa:
| Değiştir | Otomasyon üzerindeki etkisi |
|---|---|
| Etkileşimli → Yönetilen | Görünmez bir şekilde geçmeye başlayabilir (~%90 şans) |
| HTTP 403 → 503 | Durum kodu kontrollerini güncelleyin |
| Her zaman görünür → uyarlanabilir | Widget HTML'de olmayabilir |
| Aynı site anahtarı | CaptchaAI çözüm kodu aynı kalıyor |
| Aynı qa_session_cookie çıktısı | Çerez kullanımı aynı kalıyor |
Hızlı dedektör iş akışı
- Sayfanın bir geçiş reklamı sayfası gösterip göstermediğini veya uygulama akışına bir widget katıştırıp yerleştirmediğini kontrol edin.
- İşleme yoluna karar vermeden önce cf-chl işaretleyicilerini, Turnstile kaplarını ve geri arama kancalarını arayın.
- Tekrarlanan hedef değişikliklerinin hızla görülebilmesi için algılama sonucunu sayfa URL'si ve proxy kimliğiyle günlüğe kaydedin.
Sorun giderme
| Belirti | Sebep | Düzeltme |
|---|---|---|
| Görünür widget içermeyen 503 | Yönetilen Mücadele görünmez bir şekilde geçti | Hiçbir işlem yapmanıza gerek yok; geçtiniz |
| "Tarayıcınız kontrol ediliyor" ile 503 | Yönetilen, JS mücadelesine yükseltildi | cloudflare_challenge yöntemini kullanın |
| Görünür CAPTCHA'lı 403 | İnteraktif Mücadele (eski) | turnstile yöntemini kullanın |
| 403 hiçbir meydan okuma olmadan | WAF bloğu, zorluk değil | IP'yi veya istek modelini değiştirin |
| Mücadele türü rastgele değişir | Sinyallere uyum sağlayan Yönetilen Zorluk | Hem Turnstile hem de JS sorununun üstesinden gelin |
| bir türden qa_session_cookie diğer tür için reddedildi | Farklı zorluk akışları, aynı alan | Hangi zorluk sunulursa sunulsun çözün |
Sık sorulan sorular
Her zaman önce Managed Challenge'ı denemeli miyim?
Evet. Artık çoğu site Managed Challenge'ı kullanıyor. turnstile yöntemiyle başlayın ve sayfada bir JavaScript sorgulaması gösteriliyorsa ("Tarayıcınızı kontrol etme" ile 503) cloudflare_challenge'ye geri dönün.
Bir site her iki türü de farklı sayfalarda kullanabilir mi?
Evet ama nadir görülen bir durum. Her WAF kuralının farklı bir eylemi olabilir. Bir kural, /login için Yönetilen Mücadeleyi ve /api/ için Etkileşimli Mücadeleyi kullanabilir.
Yönetilen Mücadelenin hala bir qa_session_cookie çerezine ihtiyacı var mı?
Evet. Her iki meydan okuma türü de aynı qa_session_cookie çerezini üretir. Çerezlerin işlenmesi, sorgulama türünden bağımsız olarak aynıdır.
Ya Yönetilen Mücadele beni görünmez bir şekilde geçerse?
Managed Challenge, isteğinizin düşük riskli olduğuna karar verirse isteği görünür bir itiraz olmadan iletir. Yanıtınız sayfa içeriğine göre normal 200 olacaktır. Bu durumda CaptchaAI çözümüne gerek yoktur.
İnteraktif Mücadele kullanımdan kaldırılıyor mu?
Cloudflare bu özelliği resmi olarak kaldırmadı ancak tüm yeni kurallar için Managed Challenge'ı öneriyor. Etkileşimli Mücadele geriye dönük uyumluluk için kalır. Siteler herhangi bir zamanda taşınabilir.
Özet
Cloudflare'in Yönetilen Mücadelesi, ziyaretçi başına meydan okuma zorluğunu uyarlanabilir bir şekilde seçer (tam JS mücadelesinde görünmez), İnteraktif Mücadele ise her zaman görünür bir CAPTCHA sunar. Her ikisi de aynı qa_session_cookie çerezini üretir veCaptchaAI— çoğu zorluk için turnstile'yi ve JavaScript meydan okuma sayfaları için cloudflare_challenge'yi kullanın. Yönetilen Mücadele modern varsayılandır; İnteraktif Mücadele bir mirastır.