Explainers

Cloudflare doğrulama akışı (Challenge) nasıl çalışır?

Kısa yanıt: Cloudflare doğrulama akışı, korumalı bir sayfayı açmadan önce tarayıcınızı denetleyen tam sayfa bir ara doğrulama ekranıdır — ve otomasyon tarafında asıl önemli çıktısı, doğrulamayı tamamladığınızda verilen qa_session_cookie çerezidir. Bu çerez olmadan her istek yeniden aynı ekrana takılır.

Bunu, sayfaya gömülen Turnstile widget'ıyla karıştırmayın: Turnstile küçük bir onay kutusu, doğrulama akışı ise tüm sayfayı bloke eden bir kapıdır. Otomasyon açısından üç nokta önemlidir:

  • doğrulama akışı tüm sayfayı bloke eder, Turnstile etmez
  • çözümün çıktısı bir token değil, qa_session_cookie çerezidir
  • çerez IP'ye bağlı olduğundan çözüm sabit bir proxy ister

Doğrulama akışı, Turnstile ve JS Challenge farkı

Hangi katmanla karşılaştığınızı, sayfanın tam sayfa mı yoksa gömülü widget mı olduğuna bakarak anlarsınız:

Özellik CF doğrulama akışı Turnstile JS Challenge
Tür Tam sayfa ara ekran Sayfa içi widget Sessiz kontrol
Kullanıcı ne görür "Tarayıcınız kontrol ediliyor" sayfası Onay kutusu veya hiçbir şey Hiçbir şey
Sayfa erişimini engeller Evet Hayır Kısa süre
qa_session_cookie yazar Evet Bazen Evet
Çözmek için proxy gerekir Evet Hayır Yok
Site Cloudflare CDN kullanır Zorunlu İsteğe bağlı Zorunlu

Çözüm yöntemleri nasıl ayrışır?

Doğrulama akışını çerez + oturum bazlı, Turnstile'ı ise token bazlı çözersiniz; JS Challenge çoğu zaman kullanıcıdan hiçbir işlem istemez.


Adım adım nasıl işler?

Request → Cloudflare proxy → Suspicious? → Challenge page
                                              ↓
                                    Browser verification
                                              ↓
                                    qa_session_cookie cookie set
                                              ↓
                                    Original page loads
  1. İstek yakalandı — Ters proxy gelen isteği değerlendirir
  2. Risk değerlendirmesi — IP itibarı, HTTP başlıkları, TLS test profil yapılandırması ve davranış incelenir
  3. Doğrulama sayfası sunuldu — Şüpheli istekte yanıt yerine doğrulama sayfası döner
  4. Tarayıcı doğrulaması — Tarayıcıda çalıştırılan JavaScript denetimleri
  5. Çerez yazıldı — Başarıda qa_session_cookie çerezi bir TTL ile yazılır
  6. Erişim verildi — Tarayıcı sayfayı yeniden yükler ve içeriği alır

Neden ham istemci yetmez?

3 ve 4. adımlar gerçek bir tarayıcıyı hedefler: JavaScript çalıştırmayan ham bir HTTP istemcisi tam burada takılır. Bu yüzden doğrulama akışını çözmek, statik bir yanıtı ayrıştırmaktan temelde farklı bir iştir.


Doğrulama akışını ne tetikler?

  • Veri merkezi IP'si — bilinen barındırma sağlayıcılarından gelen istek
  • Eksik başlıklar — eksik veya olağandışı HTTP başlıkları
  • TLS test profil yapılandırması — JA3/JA4 imzası bilinen bot imzalarıyla eşleşiyor
  • Yüksek istek oranı — aynı IP'den çok fazla istek
  • Güvenlik düzeyi — site sahibi doğrulama eşiğini yüksek belirlemiş
  • Bot puanı — Cloudflare'in ML bot puanı çok düşük

Çoğu QA otomasyonu ilk iki madde yüzünden takılır: CI sunucuları veri merkezi IP'lerinden çıkar.


Doğrulama sonrası tarayıcı şu çerezi alır:

qa_session_cookie=abc123...; path=/; domain=.example.com; secure; HttpOnly; SameSite=None
  • Süre: 15 dakika ila 24 saat (site sahibi belirler)
  • Kapsam: belirli bir alan adına bağlı
  • Bağ: doğrulama anındaki User-Agent ve IP adresine bağlı

Önemli: IP veya User-Agent'tan birini değiştirmek çerezi anında geçersiz kılar. Bu yüzden çözüm bir proxy ister; çözüm ve sonraki istekler hep aynı proxy'den yapılır.

Çerez neye kilitlenir?

  1. IP adresi — çözüm, kullanacağınız IP ile aynı IP'den gelmelidir
  2. User-Agent — çözümdeki User-Agent isteklerinizle eşleşmelidir
  3. TLS test profil yapılandırması — bazı yapılandırmalar TLS özelliklerini de denetler

CaptchaAI ile doğrulama akışını çözme

CaptchaAI, doğrulama akışını cloudflare_challenge yöntemiyle çözer; çerez IP'ye bağlı olduğu için istekte proxy zorunludur.

Python

import requests
import time

API_KEY = "YOUR_API_KEY"

# Submit task — proxy is REQUIRED
response = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": API_KEY,
    "method": "cloudflare_challenge",
    "pageurl": "https://example.com/protected-page",
    "proxy": "username:password@proxy.example.com:8080",
    "proxytype": "HTTP",
    "json": 1
})

task_id = response.json()["request"]

# Poll for result
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:
        solution = result["request"]
        # solution contains qa_session_cookie cookie + user_agent
        print(f"qa_session_cookie: {solution}")
        break

Node.js

const axios = require('axios');

async function solveCloudflareChallenge(pageurl, proxy) {
  const { data } = await axios.get('https://ocr.captchaai.com/in.php', {
    params: {
      key: 'YOUR_API_KEY',
      method: 'cloudflare_challenge',
      pageurl,
      proxy,
      proxytype: 'HTTP',
      json: 1
    }
  });

  const taskId = data.request;

  for (let i = 0; i < 60; i++) {
    await new Promise(r => setTimeout(r, 5000));
    const res = await axios.get('https://ocr.captchaai.com/res.php', {
      params: { key: 'YOUR_API_KEY', action: 'get', id: taskId, json: 1 }
    });
    if (res.data.status === 1) return res.data.request;
  }
  throw new Error('Timeout');
}

Dönen çerezi kullanma

# After getting the solution
qa_session_cookie = solution["qa_session_cookie"]
user_agent = solution["user_agent"]

# Use the SAME proxy and user agent for subsequent requests
session = requests.Session()
session.cookies.set("qa_session_cookie", qa_session_cookie, domain=".example.com")
session.headers["User-Agent"] = user_agent
session.proxies = {"https": "http://username:password@proxy.example.com:8080"}

# Now access the protected page
page = session.get("https://example.com/protected-page")
print(f"Status: {page.status_code}")

Örnek senaryo: e-ticaret akışının QA testi

Cloudflare arkasındaki bir e-ticaret satın alma akışını test ettiğinizi düşünün. Gece çalışan smoke testleriniz veri merkezi IP'lerinden çıktığı için doğrulama akışına takılıp 403 ile düşer. Çözüm; akışı CaptchaAI ile çözüp dönen qa_session_cookie çerezini sabit bir proxy üzerinden test istemcinize taşımaktır. USD ve thread bazlı fiyatlandırma, TL oynaklığından bağımsız öngörülebilir bir maliyet sağlar. Yalnızca yetkiniz olan sistemleri test edin; toplanan kişisel veriler KVKK kapsamına girer.

Paralel QA worker'ları için thread sayısı belirleyicidir: her eşzamanlı çözüm bir thread tutar, çözüm bitince thread serbest kalır. Onlarca akışı aynı anda test eden ekipler daha yüksek thread'li planlara geçerek gece test pencerelerini kısaltır.


Sık sorulan sorular

CaptchaAI hangi Cloudflare doğrulama tiplerini çözer?

CaptchaAI iki Cloudflare tipini de çözer:

  • Cloudflare doğrulama akışı (cloudflare_challenge) — çerez + oturum döndürür
  • Cloudflare Turnstile (turnstile) — bir token döndürür

Doğrulama akışı çözümü hangi CaptchaAI planına dahil?

Ayrı bir "Cloudflare paketi" yoktur; tüm planlar thread bazlıdır ve sınırsız çözüm içerir:

  • BASIC ($15/ay, 5 thread) — düşük hacimli QA testleri
  • ADVANCE ($90/ay, 50 thread) — çok sayıda paralel akış

Ham bir HTTP istemcisiyle doğrulama akışını çözebilir miyim?

Hayır. Akış, JavaScript çalıştıran gerçek bir tarayıcı ortamı ister; ham requests veya axios çağrıları doğrulama sayfasında takılır. Çözümü CaptchaAI'ye devredip dönen çerezi HTTP istemcinize taşırsınız.

Hayır. Çerez şu ikisine bağlıdır ve biri değişirse yeni bir çözüm gerekir:

  • doğrulama anındaki IP adresi
  • doğrulama anındaki User-Agent

İlgili kılavuzlar

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