Troubleshooting

Cloudflare doğrulama akışı mı, Turnstile mı? Hangisi olduğunu nasıl anlarsınız

Türü anlamanın en hızlı yolu sayfanın HTML'ine bakmaktır: tüm sayfayı kaplayan bir Just a moment... ekranı görüyorsanız bu bir Cloudflare doğrulama akışıdır; bir formun içinde küçük bir cf-turnstile widget'ı varsa bu Turnstile'dır. İkisi CaptchaAI'de farklı method değerleriyle çözülür ve türü yanlış tahmin ederseniz — örneğin doğrulama akışına turnstile gönderirseniz — istek her seferinde hatayla döner.

Neden türü doğru belirlemek önemli?

Bu iki koruma dışarıdan benzer görünür ama çözüm mantıkları temelden ayrıdır. Doğrulama akışı sizden bir oturum çerezi üretmenizi ister ve bu çerez IP'nize bağlıdır; Turnstile ise forma enjekte edilecek bir token döndürür. Yanlış yöntemi seçtiğinizde CaptchaAI size boş yere bir çözüm göndermez — istek ERROR_CAPTCHA_UNSOLVABLE veya benzeri bir hatayla geri gelir ve siz kod tarafında saatlerce boşa hata ayıklarsınız. Bu yüzden entegrasyona başlamadan önce yapılacak ilk iş, hedef sayfanın hangi koruma türünü kullandığını netleştirmektir. İyi haber şu ki bu tespit, tek bir HTTP isteğiyle otomatikleştirilebilir.

Cloudflare doğrulama akışını nasıl tanırsınız

Cloudflare doğrulama akışı, içeriğe erişimi engelleyen tam sayfa bir ara ekrandır ve asıl sayfa yüklenmeden önce belirir. Ekranda genellikle "Erişmeden önce tarayıcınız kontrol ediliyor..." mesajını, dönen bir Cloudflare yükleme animasyonunu ve "Bir dakika... / Just a moment..." başlığını görürsünüz. Adres çubuğundaki URL değişmese de gövde tümüyle Cloudflare'e aittir; yani tarayıcıda gördüğünüz içerik hedef siteye değil, araya giren doğrulama sayfasına aittir.

HTML işaretleri:

<!-- Cloudflare doğrulama akışı page indicators -->
<title>Just a moment...</title>
<div id="challenge-running">...</div>
<div class="cf-browser-verification">...</div>

Programatik algılama:

import requests

resp = requests.get("https://example.com")

is_cf_challenge = (
    resp.status_code == 403 and
    "Just a moment" in resp.text or
    "cf-browser-verification" in resp.text or
    "challenge-platform" in resp.text
)

if is_cf_challenge:
    print("Cloudflare doğrulama akışı detected — use method: cloudflare_challenge")

Bu işaretler genellikle 403 veya 503 durum koduyla birlikte gelir. İkisini aynı yanıtta görüyorsanız neredeyse kesin olarak bir doğrulama akışıyla karşı karşıyasınız.

Cloudflare Turnstile'ı nasıl tanırsınız

Turnstile, halihazırda yüklenmiş bir sayfanın içindeki gömülü bir widget'tır. Tıpkı reCAPTCHA gibi formların içinde belirir; sayfanın geri kalanı normal görünür ve engellenmez.

Görsel işaretler:

  • Form içinde küçük Cloudflare widget'ı (onay kutusu stilinde)
  • Sayfa içeriğinin geri kalanı görünür durumda
  • Widget'ta "İnsan olduğunuzu doğrulayın" ifadesi

HTML işaretleri:

<!-- Turnstile widget indicators -->
<div class="cf-turnstile" data-sitekey="0x4AAAAAAADnPIDROz1234"></div>

<!-- Or loaded via JavaScript -->
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js"></script>

Programatik algılama:

import requests

resp = requests.get("https://staging.example.com/qa-login")

is_turnstile = (
    "cf-turnstile" in resp.text or
    "challenges.cloudflare.com/turnstile" in resp.text
)

if is_turnstile:
    # Extract sitekey
    if 'data-sitekey="' in resp.text:
        start = resp.text.index('data-sitekey="') + 14
        end = resp.text.index('"', start)
        sitekey = resp.text[start:end]
        print(f"Turnstile detected — sitekey: {sitekey}")
        print("Use method: turnstile")

Sitekey data-sitekey özniteliğinde durur ve çözüm isteğinde bu değere ihtiyacınız olur; o yüzden tespit adımında hemen çıkarıp saklayın.

Tek fonksiyonla otomatik tespit

Aynı boru hattında iki türle de karşılaşan bir iş akışı yürütüyorsanız, türü elle tahmin etmek yerine tek bir yardımcı fonksiyona bağlamak daha güvenilirdir. Aşağıdaki fonksiyon önce tam sayfa doğrulama akışını, ardından gömülü Turnstile'ı kontrol eder ve doğrudan CaptchaAI isteğine verebileceğiniz method değerini döndürür:

def detect_cloudflare_type(url):
    """Detect which Cloudflare protection a URL uses."""
    resp = requests.get(url, allow_redirects=True)

    # Check for full-page Challenge
    if resp.status_code in [403, 503]:
        if any(marker in resp.text for marker in [
            "Just a moment",
            "cf-browser-verification",
            "challenge-platform",
            "challenge-running"
        ]):
            return {"type": "cloudflare_challenge", "method": "cloudflare_challenge"}

    # Check for embedded Turnstile
    if "cf-turnstile" in resp.text or "challenges.cloudflare.com/turnstile" in resp.text:
        sitekey = None
        if 'data-sitekey="' in resp.text:
            start = resp.text.index('data-sitekey="') + 14
            end = resp.text.index('"', start)
            sitekey = resp.text[start:end]
        return {"type": "turnstile", "method": "turnstile", "sitekey": sitekey}

    return {"type": "none", "method": None}


# Usage
result = detect_cloudflare_type("https://example.com")
print(f"Protection: {result['type']}")
print(f"CaptchaAI method: {result['method']}")

Kontrol sırası önemlidir: doğrulama akışı tüm sayfayı kapladığı için önce onu ele almak, ardından Turnstile'a bakmak yanlış sınıflandırmayı önler. Fonksiyon none döndürürse koruma o istekte tetiklenmemiş olabilir; bazı Cloudflare korumaları yalnızca belirli eylemlerde (POST istekleri, oturum açma denemesi) ya da bot benzeri bir User-Agent'ta devreye girer, dolayısıyla isteği o koşullarla tekrarlayın.

Her türü doğru yöntemle çözme

Türü belirledikten sonra CaptchaAI'ye gönderdiğiniz parametreler değişir. Doğrulama akışında proxy ve User-Agent zorunludur, çünkü CaptchaAI çerezi sizin bağlantı bağlamınızda üretmek zorundadır:

data = {
    "key": "YOUR_API_KEY",
    "method": "cloudflare_challenge",
    "pageurl": "https://example.com",
    "proxy": "host:port:user:pass",   # MANDATORY
    "proxytype": "HTTP",               # MANDATORY
    "userAgent": "Mozilla/5.0 ...",    # MANDATORY
    "json": 1
}
# Returns qa_session_cookie cookie — set it in your session

Turnstile tarafında ise sitekey ile pageurl yeterlidir; proxy isteğe bağlıdır:

data = {
    "key": "YOUR_API_KEY",
    "method": "turnstile",
    "sitekey": "0x4AAAAAAADnPIDROz1234",
    "pageurl": "https://staging.example.com/qa-login",
    "json": 1
}
# Returns a token — inject into cf-turnstile-response field

Doğrulama akışı, oturumunuza yerleştireceğiniz bir qa_session_cookie çerezi döndürür; Turnstile ise formun cf-turnstile-response alanına enjekte edeceğiniz bir token döndürür. Her iki tür de CaptchaAI'de genel kullanıma açıktır (GA), dolayısıyla türü doğru seçtiğiniz sürece aynı API anahtarıyla ikisini de çözersiniz.

Özet: iki koruma tek bakışta

Aşağıdaki tablo, bir sayfayla karşılaştığınızda hızlı bir kontrol listesi işlevi görür:

Özellik Cloudflare doğrulama akışı Cloudflare Turnstile
Tür Tam sayfa ara ekran (interstitial) Sayfaya gömülü widget
Görünüm Tüm sayfayı engeller, "Tarayıcınız kontrol ediliyor" Form içinde küçük onay kutusu veya görünmez widget
CaptchaAI yöntemi cloudflare_challenge turnstile
Döndürdüğü değer qa_session_cookie çerezi Token dizesi
Proxy gerekir mi Evet (zorunlu) Önerilir
User-Agent gerekir mi Evet (zorunlu) Hayır

Sık yapılan hatalar ve çözümleri

Hata Sonuç Düzeltme
Doğrulama akışı sayfasına turnstile göndermek ERROR_CAPTCHA_UNSOLVABLE cloudflare_challenge yöntemine geçin
Turnstile'a cloudflare_challenge göndermek Yanlış yanıt biçimi turnstile yöntemine geçin
Doğrulama akışında proxy eksikliği ERROR_PROXY_NOT_AUTHORIZED Proxy ekleyin — doğrulama akışında zorunludur
Turnstile'da sitekey eksikliği ERROR_BAD_PARAMETERS Sitekey'i sayfa HTML'inden çıkarın

Bu dört hatanın tamamı türü yanlış belirlemekten kaynaklanır; tespit adımını otomatikleştirmek dördünü de tek seferde ortadan kaldırır.

Türkiye'den bir senaryo: e-ticaret girişini test etmek

Diyelim ki bir e-ticaret ekibinin QA mühendisisiniz ve Cloudflare arkasındaki bir staging giriş formunun otomatik testlerini yazıyorsunuz. İlk istekte tam sayfa Just a moment... ekranı çıkıyorsa bu doğrulama akışıdır; formun içinde cf-turnstile görüyorsanız Turnstile — ikisi aynı akışta arka arkaya da gelebilir. Test kapsamınızı yalnızca sahip olduğunuz veya yetkilendirildiğiniz sistemlerle sınırlayın; testte gerçek kullanıcı verisi işliyorsanız bunun KVKK kapsamına girdiğini unutmayın.

Maliyet tarafında TL dalgalanması nedeniyle öngörülebilirlik önemlidir: CaptchaAI'nin thread tabanlı aylık USD planları — örneğin BASIC ($15/ay, 5 thread) — sabit bütçe planlamayı kolaylaştırır. Her planda thread başına çözüm sınırsızdır, yani çözüm başına değil eşzamanlı thread sayısıyla ölçeklenirsiniz.

Sık sorulan sorular

Turnstile sitekey'ini sayfa kaynağında bulamıyorsam ne yaparım?

Sitekey bazen HTML'de değil, JavaScript ile enjekte edilir ve ham requests yanıtında görünmez. Sayfayı headless tarayıcıyla açıp render sonrası DOM'u okuyun ya da challenges.cloudflare.com/turnstile çağrısını tarayıcının ağ sekmesinden inceleyin.

Cloudflare doğrulama akışı neden proxy ve User-Agent zorunlu kılıyor?

Doğrulama akışı, IP'ye bağlı bir qa_session_cookie çerezi döndürür; CaptchaAI'nin bu çerezi sizin IP'nizden çalışacak şekilde üretebilmesi için proxy ve tutarlı bir User-Agent gerekir. Turnstile ise IP'den bağımsız bir token döndürdüğü için bu zorunluluk yoktur.

CaptchaAI hem doğrulama akışını hem Turnstile'ı destekliyor mu?

Evet, ikisi de (cloudflare_challenge ve turnstile) genel kullanıma açıktır. Türü doğru belirlediğiniz sürece aynı API anahtarıyla her ikisini de çözebilirsiniz.

Turnstile ile reCAPTCHA'yı nasıl ayırt ederim?

İkisi de forma gömülü widget'lardır, bu yüzden görsel olarak karışabilirler. Ayrım HTML'de nettir: Turnstile cf-turnstile sınıfını ve challenges.cloudflare.com/turnstile betiğini yükler, reCAPTCHA ise g-recaptcha sınıfını ve google.com/recaptcha kaynağını kullanır.

Tespit için hangi HTTP durum kodlarına bakmalıyım?

Doğrulama akışı çoğunlukla 403 veya 503 ile döner; Turnstile ise 200 durum kodlu normal bir sayfanın gövdesinde yer alır. Bu yüzden durum kodu tek başına yeterli değildir — HTML içeriğindeki işaretlerle birlikte değerlendirin.

Cloudflare korumalarını CaptchaAI ile çözün

Hem doğrulama akışını hem Turnstile'ı tek entegrasyonla çözmek için captchaai.com üzerinden başlayın.

İlgili rehberler

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