Otomasyonunuz bir Cloudflare sayfasına takıldığında ilk kararınız nettir: karşınızda Managed Challenge mı var, Interactive Challenge mı? Yanıt, hangi CaptchaAI yöntemini çağıracağınızı doğrudan belirler.
Managed Challenge ziyaretçi başına riski ölçüp en az sürtünmeli doğrulamayı seçen modern davranıştır; Interactive Challenge ise herkese görünür bir CAPTCHA sunan eski davranıştır. İkisi de WAF kurallarında yapılandırılır ve aynı qa_session_cookie çerezini üretir — ama otomasyon tarafındaki deneyim tamamen farklıdır.
Hangi durumda hangi yöntem
Hızlı yanıt HTTP durum koduyla başlar:
- 503 +
challenge-platform/Turnstile → Managed Challenge;turnstileyöntemiyle çözün. - 503 + "Tarayıcınız kontrol ediliyor" → JS doğrulaması;
cloudflare_challengeyöntemine geçin. - 403 + görünür CAPTCHA → Interactive Challenge; yine
turnstileçözer. - 403, doğrulama yok → WAF bloğu; çözülmez, isteği gözden geçirin.
Managed Challenge: modern, uyarlanabilir akış
Managed Challenge, Cloudflare'in önerdiği doğrulama eylemidir. En az rahatsız edecek doğrulamayı seçmek için bir karar çerçevesi çalıştırır: iyi sinyalli istekleri sessizce geçirir, yalnızca şüpheli istekleri görünür bir widget'a yükseltir.
Karar akışı nasıl işler
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
Sayfanın HTML çıktısı
Managed Challenge sayfaları Cloudflare'in doğrulama platformunu (challenge-platform) 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>
Görünür widget çıkınca ziyaretçi ne görür
Managed Challenge'ın hangi doğrulamayı gösterdiği, ziyaretçinin sinyallerine bağlıdır:
- Normal tarayıcı, iyi IP: hiçbir şey görmez, görünmez geçer (~%90).
- Yeni tarayıcı, nötr IP: kısa bir yükleme animasyonu (~%5).
- Şüpheli sinyaller: Turnstile onay kutusu (~%4).
- Yüksek riskli sinyaller: "Tarayıcınız kontrol ediliyor..." sayfası (~%1).
Interactive Challenge: eski, her zaman görünür davranış
Interactive Challenge her ziyaretçiye görünür bir CAPTCHA sunar. Görünmez geçiş yoktur; risk sinyalleri ne olursa olsun herkes doğrulamayı görür ve tamamlamak zorundadır. Cloudflare bu davranışı birkaç nedenle önermez:
- Her zaman görünür: ziyaretçilerin tamamı doğrulamayı görür.
- Yüksek sürtünme: her ziyaretçi elle etkileşime girmek zorundadır.
- Daha yüksek hemen çıkma oranı: kullanıcılar tamamlamak yerine sayfayı terk eder.
- Risk uyarlaması yok: güvenilir olduğu bilinen ziyaretçiler bile doğrulamaya takılır.
- Erişilebilirlik sorunları: etkileşim herkes için zorunlu olur.
Akış nasıl işler
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çiler ne görür
Her ziyaretçi, Turnstile'a benzeyen bir widget içeren tam sayfa doğrulama görü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>
Hangi challenge ile karşı karşıyayım? (503 mü, 403 mü)
Doğru yöntemi seçmek için önce sayfanın hangi doğrulamayı sunduğunu ayırt edin. En hızlı ipucu durum kodudur: Managed Challenge tipik olarak 503, Interactive Challenge ise 403 döndürür. Aşağıdaki fonksiyon durum kodunu HTML imzalarıyla birlikte değerlendirir:
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']}")
Sinyallere göre algılama tablosu
| Sinyal | Managed Challenge | Interactive Challenge | 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 | ✅ | ❌ | ❌ | ❌ |
Üretimde hızlı algılama kontrol listesi
- İşleme yolunu seçmeden önce
cf-chlişaretçilerini, Turnstile kaplarını (cf-turnstile) ve callback kancalarını arayın. - Algılama sonucunu sayfa URL'si ve istek kimliğiyle günlüğe yazın; böylece hedef sitedeki değişiklikleri hızla fark edersiniz.
Her iki türü CaptchaAI ile çözme
Her iki doğrulama da CaptchaAI'nin standart gönder-ve-sorgula akışıyla çözülür; değişen tek şey seçtiğiniz method değeridir.
Managed Challenge çözme
Managed Challenge çoğunlukla Turnstile widget'ı olarak işlenir. CaptchaAI'nin turnstile yöntemini kullanın; görünür bir sitekey yoksa kod cloudflare_challenge yöntemine düşer:
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")
Interactive Challenge çözme
Interactive Challenge her zaman görünür bir widget gösterdiği için sitekey'i doğrudan sayfadan okuyabilirsiniz. Aynı turnstile yöntemiyle çözülür:
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: iki tür için tek fonksiyon
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;
}
}
Sorun giderme
| Belirti | Sebep | Düzeltme |
|---|---|---|
| Görünür widget içermeyen 503 | Managed Challenge görünmez geçti | İşlem gerekmez; zaten geçtiniz |
| "Tarayıcınız kontrol ediliyor" ile 503 | Managed, JS doğrulamasına yükseldi | cloudflare_challenge yöntemini kullanın |
| Görünür CAPTCHA'lı 403 | Interactive Challenge (eski) | turnstile yöntemini kullanın |
| Doğrulama içermeyen 403 | Doğrulama değil, WAF bloğu | IP'yi veya istek desenini değiştirin |
| Doğrulama türü isteğe göre değişiyor | Managed sinyallere uyum sağlıyor | Hem Turnstile hem JS doğrulamasını işleyin |
Bir türdeki qa_session_cookie diğerinde reddediliyor |
Aynı alan, farklı doğrulama akışları | Hangi doğrulama gelirse onu çözün |
Interactive'den Managed'a geçiş otomasyonu nasıl etkiler
Cloudflare, Interactive'den Managed Challenge'a geçmeyi önerir. Otomatikleştirdiğiniz bir site geçerse akışınızda şunlar değişir:
- Interactive → Managed: isteklerin çoğu artık görünmez geçebilir (~%90 olasılık).
- HTTP 403 → 503: durum kodu kontrollerini güncelleyin.
- Her zaman görünür → uyarlanabilir: widget HTML'de hiç bulunmayabilir.
- Aynı sitekey: CaptchaAI çözüm kodu aynı kalır.
- Aynı
qa_session_cookieçıktısı: çerez işleme mantığı değişmez.
Örnek: e-ticaret QA akışında geçişi yönetmek
İstanbul merkezli bir e-ticaret ekibinin ödeme adımını (checkout) her gece otomatik QA testinden geçirdiğini düşünün. Test paketi aylarca Interactive Challenge'a takıldı: her çalıştırmada 403 döndü ve kod widget'ı turnstile ile çözdü. Güvenlik ekibi WAF kuralını Managed Challenge'a taşıyınca testler 503 dönmeye başladı ve isteklerin çoğu widget görmeden geçti.
Yapılması gereken tek değişiklik, durum kodu kontrolünü 503'e güncellemek ve widget bulunmadığında cloudflare_challenge yöntemine düşen bir yedek yol eklemekti; kodun geri kalanı aynen kaldı. İki noktaya dikkat edin: yalnızca test yetkiniz olan sistemlerde çalışın (kişisel veri toplanıyorsa KVKK devreye girer) ve maliyeti önceden kestirin. CaptchaAI thread başına faturalandırdığı için tek bir gece paketi için BASIC ($15/ay, 5 thread) yeterlidir; aylık maliyet USD cinsinden sabit kalır.
Özet karşılaştırma tablosu
| Özellik | Managed Challenge | Interactive Challenge |
|---|---|---|
| Tanıtıldığı yıl | 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'ı hiç widget görmeden geçer) | Hayır (her zaman CAPTCHA gösterir) |
| Sunduğu doğrulama türleri | Görünmez → Turnstile → JS doğrulaması | Her zaman görünür CAPTCHA |
| Cloudflare öneriyor mu? | Evet (yeni kurallarda 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 durum kodu | 503 | 403 |
| CaptchaAI yöntemi | turnstile veya cloudflare_challenge |
turnstile |
Sık sorulan sorular
turnstile yöntemi hem Managed hem Interactive için yeterli mi?
Çoğu durumda evet. Managed Challenge ağırlıklı olarak Turnstile widget'ı ürettiği için turnstile her iki türü kapsar. Tek istisna Managed'ın tam sayfa JavaScript doğrulamasına yükselmesidir; orada cloudflare_challenge gerekir.
Cloudflare beni görünmez geçirirse token almam gerekir mi?
Hayır. Cloudflare isteği düşük riskli bulup görünür doğrulama olmadan geçirirse yanıt normal bir 200 olur ve sayfa içeriği döner. Çözülecek bir şey yoktur; CaptchaAI çağrısı gerekmez.
CaptchaAI hCaptcha veya GeeTest v4'ü de bu yöntemlerle çözer mi?
Hayır. Bu yöntemler yalnızca Cloudflare doğrulamaları içindir. CaptchaAI şu an hCaptcha ve FunCaptcha'yı desteklemez; GeeTest v4 çok yakında planlanır, henüz kullanılamaz. GeeTest'in v3 sürümü ise geetest yöntemiyle çözülür.
Bu tür bir QA akışı için hangi plan yeterli?
Tek bir gece test paketi genelde birkaç eşzamanlı istekle yetinir; bu senaryoda BASIC ($15/ay, 5 thread) çoğu ekip için yeterlidir. Daha yüksek eşzamanlılık için STANDARD ($30/ay, 15 thread) veya ADVANCE ($90/ay, 50 thread) planlarına çıkabilirsiniz. Faturalandırma thread başınadır; çözüm sayısı sınırsızdır.
Özet
Managed Challenge, ziyaretçi başına riski ölçerek doğrulama zorluğunu uyarlar — çoğu istek için görünmez, riskli istekler için tam JavaScript doğrulamasına kadar. Interactive Challenge ise her zaman görünür CAPTCHA sunan eski davranıştır. İkisi de aynı qa_session_cookie çerezini üretir ve CaptchaAI ile çözülür: çoğu doğrulama için turnstile, JavaScript doğrulama sayfaları için cloudflare_challenge yöntemini kullanın. Otomasyonda tek yapmanız gereken, durum koduna göre doğru yöntemi seçmektir.