Comparisons

Cloudflare Managed Challenge ve Interactive Challenge farkı

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; turnstile yöntemiyle çözün.
  • 503 + "Tarayıcınız kontrol ediliyor" → JS doğrulaması; cloudflare_challenge yö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-chl iş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.

İlgili Makaleler

Bu makale için yorumlar devre dışı bırakılmıştır.