API Eğitimleri

Cloudflare Mücadelesi Sayfası Parametreleri ve Token Akışı

Cloudflare bir meydan okuma sayfası sunduğunda, ilk sayfa parametrelerinden JavaScript yürütme yoluyla son qa_session_cookie çerezine kadar karmaşık bir belirteç akışı başlar. Bu parametreleri anlamak, arızaları teşhis etmenize, otomasyon akışlarında hata ayıklamanıza ve doğru çözüm yaklaşımını seçmenize yardımcı olur.


Sayfa anatomisine meydan okuyun

Cloudflare meydan okuma sayfası (HTTP 503) birkaç temel öğe içerir:

<!DOCTYPE html>
<html>
<head>
    <title>Just a moment...</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
    <div id="challenge-stage">
        <div id="challenge-body-text">
            Checking if the site connection is secure
        </div>
        <div id="challenge-spinner">
            <!-- Loading spinner -->
        </div>
    </div>

    <div id="challenge-form" style="display:none">
        <form id="challenge-form" action="/..." method="POST">
            <!-- Hidden parameters -->
            <input type="hidden" name="md" value="...">
            <input type="hidden" name="r" value="...">
        </form>
    </div>

    <script src="/cdn-cgi/challenge-platform/h/g/orchestrate/chl_page/v1?ray=...">
    </script>
</body>
</html>

Anahtar parametreler

Meydan okuma sayfasında

Parametre İsim Amaç
ray Cloudflare Ray Kimliği Benzersiz istek tanımlayıcısı, sorgulamayı orijinal isteğe bağlar
md Meta verilere meydan okuyun Şifrelenmiş meydan okuma durumu
r Yanıt jetonu Hesaplanan yanıt (JavaScript ile doldurulmuş)
chl_opt Mücadele seçenekleri Mücadele betiği için yapılandırma
cRay Işına meydan okuyun Mücadele takibi için ikincil ışın
cZone Mücadele bölgesi Cloudflare bölge kimliği
cUPMDTk Zaman damgası Düzenleme zamanına meydan okuyun
cHash Hash'e meydan okuyun Bütünlük doğrulaması

Sınama komut dosyası URL'sinde

/cdn-cgi/challenge-platform/h/g/orchestrate/chl_page/v1?ray=ABC123
Bileşen Anlamı
/cdn-cgi/challenge-platform/ Cloudflare altyapısını zorluyor
h/g/ Mücadele versiyonu/variant
orchestrate/ Düzenleme uç noktasına meydan okuma
chl_page/v1 Mücadele sayfası sürümü
ray=ABC123 Ray ID bağlamayı talep edin

JavaScript yükünde

Sınama komut dosyası ek parametreler yükler:

// Extracted from obfuscated challenge script
window._cf_chl_opt = {
    cvId: '2',           // Challenge version
    cType: 'managed',    // Challenge type
    cNounce: '...',      // Cryptographic nonce
    cRay: '...',         // Challenge Ray ID
    cHash: '...',        // Challenge hash
    cUPMDTk: '...',      // Timestamp
    cFPWv: 'g',          // test profil yapılandırması version
    cTTimeMs: '4000',    // Minimum wait time (ms)
    cTplV: 5,            // Template version
    cLt: '...',          // Challenge lifetime
    cRq: {},             // Challenge request data
};

Mücadeleden temizliğe jeton akışı

Adım adım akış


1. CLIENT → CLOUDFLARE EDGE
   GET /protected-page
   ↓

2. CLOUDFLARE → CLIENT
   HTTP 503 + Challenge page HTML
   Sets: __cf_bm cookie (bot management tracking)
   Contains: ray ID, challenge script URL
   ↓

3. CLIENT (browser)
   Loads challenge script from /cdn-cgi/challenge-platform/...
   ↓

4. CHALLENGE SCRIPT EXECUTES:
   a. Collects browser test profil yapılandırması:

      - canvas QA tanılama
      - WebGL renderer
      - Screen dimensions
      - Installed fonts
      - Timezone
      - Language
   b. Runs proof-of-work:

      - Iterates hash computations
      - Must find answer matching difficulty
   c. Computes timing:

      - Enforces minimum wait (cTTimeMs)
      - Records actual timing
   d. Generates response token:

      - Combines test profil yapılandırması + PoW answer + timing
      - Encrypts with challenge nonce
   ↓

5. CLIENT → CLOUDFLARE
   POST /cdn-cgi/challenge-platform/h/g/flow/ov1/...
   Body: { r: "encrypted_response", md: "metadata", ... }
   ↓

6. CLOUDFLARE validates:
   - Proof-of-work answer correct?
   - Timing within acceptable range?
   - test profil yapılandırması consistent with real browser?
   - No replay (nonce check)?
   ↓

7. CLOUDFLARE → CLIENT
   HTTP 200 + Set-Cookie: qa_session_cookie=...; path=/; expires=...
   + HTTP redirect to original URL
   ↓

8. CLIENT → CLOUDFLARE
   GET /protected-page
   Cookie: qa_session_cookie=...
   ↓

9. CLOUDFLARE → CLIENT
   HTTP 200 + Protected content

Çerez zaman çizelgesi

Request 1: No cookies
    → Challenge page (503)
    → __cf_bm cookie set

Challenge solve:
    → qa_session_cookie cookie set

Request 2+: qa_session_cookie + __cf_bm
    → Content served (200)

After ~30 mins: qa_session_cookie expires
    → Next request triggers new challenge

Çerezlere meydan okuyun

Çerez Amaç Ömür boyu Kapsam
__cf_bm Bot yönetimi oturum takibi 30 dakika Etki alanı
qa_session_cookie Mücadele izni kanıtı 15 dakika – 24 saat (yapılandırılabilir) Etki alanı
__cflb Yük dengeleyici benzeşimi Oturum Etki alanı
_cfuvid Benzersiz ziyaretçi kimliği Oturum Etki alanı

qa_session_cookie çerezi şunlara bağlıdır:

  1. IP adresi – Sorunu çözen aynı IP'den gelmelidir
  2. Kullanıcı Aracısı – Mücadele sırasında kullanılan UA ile eşleşmelidir
  3. Alan - Yalnızca onu veren alan adı için geçerlidir
# ❌ FAILS — IP mismatch
# Solve challenge from IP A, then use qa_session_cookie from IP B

# ❌ FAILS — UA mismatch
# Solve with Chrome UA, then send requests with Firefox UA

# ✅ WORKS — Same IP + Same UA
session = requests.Session()
session.headers["User-Agent"] = "Mozilla/5.0 ... Chrome/120.0.0.0"
# Use same session for solving and subsequent requests

Mücadele parametrelerinin çıkarılması

Python

import re
import requests

def extract_challenge_params(url):
    """Extract Cloudflare doğrulama akışı page parameters."""
    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

    params = {
        "status_code": response.status_code,
        "cf_ray": response.headers.get("cf-ray", ""),
        "is_challenge": response.status_code == 503,
    }

    if not params["is_challenge"]:
        return params

    # Extract Ray ID from page
    ray_match = re.search(r"ray['\"]?\s*[:=]\s*['\"]([a-f0-9]+)['\"]", html, re.I)
    if ray_match:
        params["ray_id"] = ray_match.group(1)

    # Extract challenge script URL
    script_match = re.search(
        r'src=["\'](/cdn-cgi/challenge-platform/[^"\']+)["\']', html
    )
    if script_match:
        params["challenge_script"] = script_match.group(1)

    # Extract challenge options
    opt_match = re.search(r"_cf_chl_opt\s*=\s*\{([^}]+)\}", html)
    if opt_match:
        opt_text = opt_match.group(1)

        # Parse individual options
        for key in ["cType", "cRay", "cHash", "cTTimeMs", "cvId", "cFPWv"]:
            val_match = re.search(
                rf"{key}\s*:\s*['\"]?([^'\"', }}]+)", opt_text
            )
            if val_match:
                params[key] = val_match.group(1)

    # Extract form parameters
    md_match = re.search(r'name=["\']md["\']\s+value=["\']([^"\']+)["\']', html)
    if md_match:
        params["md"] = md_match.group(1)

    # Extract cookies from response
    params["cookies"] = {
        name: value
        for name, value in response.cookies.items()
    }

    return params


# Usage
params = extract_challenge_params("https://protected-site.com")
if params["is_challenge"]:
    print(f"Challenge type: {params.get('cType', 'unknown')}")
    print(f"Ray ID: {params.get('ray_id', params['cf_ray'])}")
    print(f"Min wait: {params.get('cTTimeMs', '?')}ms")
    print(f"Script: {params.get('challenge_script', 'not found')}")

Node.js

const axios = require("axios");

async function extractChallengeParams(url) {
  const response = await axios.get(url, {
    headers: {
      "User-Agent": "Mozilla/5.0 Chrome/120.0.0.0",
      Accept: "text/html,*/*;q=0.8",
    },
    validateStatus: () => true,
    maxRedirects: 0,
  });

  const html = response.data;
  const params = {
    statusCode: response.status,
    cfRay: response.headers["cf-ray"] || "",
    isChallenge: response.status === 503,
  };

  if (!params.isChallenge) return params;

  // Extract challenge script URL
  const scriptMatch = html.match(
    /src=["'](\/cdn-cgi\/challenge-platform\/[^"']+)["']/
  );
  if (scriptMatch) params.challengeScript = scriptMatch[1];

  // Extract challenge type
  const typeMatch = html.match(/cType\s*:\s*['"]?(\w+)/);
  if (typeMatch) params.challengeType = typeMatch[1];

  // Extract timing
  const timeMatch = html.match(/cTTimeMs\s*:\s*['"]?(\d+)/);
  if (timeMatch) params.minWaitMs = parseInt(timeMatch[1]);

  return params;
}

extractChallengeParams("https://protected-site.com").then(console.log);

CaptchaAI ile çözme

CaptchaAI tüm jeton akışını dahili olarak yönetir; sorgulama parametrelerini manuel olarak çıkarmanıza gerek yoktur:

import requests
import time

API_KEY = "YOUR_API_KEY"

def solve_cloudflare_challenge(target_url):
    """Solve Cloudflare doğrulama akışı page — CaptchaAI handles token flow."""
    submit = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY,
        "method": "cloudflare_challenge",
        "sitekey": "managed",
        "pageurl": target_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("Challenge solve timed out")


# CaptchaAI handles the full flow:
# 1. Loads the challenge page
# 2. Executes JavaScript
# 3. Solves proof-of-work
# 4. Returns clearance token/cookies
token = solve_cloudflare_challenge("https://protected-site.com/login")

Hata ayıklama mücadelesi başarısızlıkları

Yaygın başarısızlık noktaları

Arıza noktası Belirti Kök neden
Yarışma sayfası yüklenmiyor Zaman aşımı veya boş yanıt Ağ/proxy sorunu
Komut dosyası yürütülemiyor Mücadele döngüleri Eksik JavaScript API'leri
İş kanıtı başarısız oluyor Sonsuz döndürücü Hesaplamalı zaman aşımı
Yanıt reddedildi Mücadeleye geri yönlendir Zamanlama ihlali veya test profil yapılandırması uyumsuzluğu
qa_session_cookie ayarlanmadı Çözüldükten sonra çerez eksik Yanıt ayrıştırma hatası
qa_session_cookie reddedildi sonraki talep üzerine 403 IP veya UA uyuşmazlığı

Hata ayıklama kontrol listesi

def debug_challenge_flow(url, qa_session_cookie_cookie=None, user_agent=None):
    """Debug the challenge solve flow step by step."""
    ua = user_agent or (
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
        "AppleWebKit/537.36 Chrome/120.0.0.0"
    )

    steps = []

    # Step 1: Initial request
    response = requests.get(
        url,
        headers={"User-Agent": ua, "Accept": "text/html,*/*;q=0.8"},
        timeout=15,
        allow_redirects=False,
    )
    steps.append({
        "step": "initial_request",
        "status": response.status_code,
        "is_challenge": response.status_code == 503,
        "cf_ray": response.headers.get("cf-ray", ""),
    })

    # Step 2: Test with qa_session_cookie
    if qa_session_cookie_cookie:
        session = requests.Session()
        session.cookies.set("qa_session_cookie", qa_session_cookie_cookie)
        session.headers["User-Agent"] = ua

        response2 = session.get(url, timeout=15, allow_redirects=False)
        steps.append({
            "step": "with_clearance",
            "status": response2.status_code,
            "passed": response2.status_code == 200,
        })

        if response2.status_code != 200:
            steps.append({
                "step": "diagnosis",
                "issue": "qa_session_cookie rejected",
                "possible_causes": [
                    "Cookie expired",
                    "IP address changed",
                    "User-Agent mismatch",
                    "Cookie from different domain",
                ],
            })

    return steps

Sorun giderme

Belirti Sebep Düzeltme
Mücadele türü "yönetilen" ancak çözüm başarısız oluyor Mücadele, JS meydan okumasını değil Turnstileyi gerektirir cloudflare_challenge yerine turnstile yöntemini deneyin
qa_session_cookie bir kez çalışır, sonra reddedilir IP rotasyonu IP'nizi değiştirdi Temizleme ömrü boyunca IP'yi sabitleyin
"Bir dakika..." sayfası asla çözülmüyor JavaScript engellendi veya hatalı biçimlendirildi Manuel çözüm yerine CaptchaAI kullanın
Her istekten sonra meydan okuma yeniden ortaya çıkıyor qa_session_cookie gönderilmiyor Çerezlerin oturumda kalıcı olduğundan emin olun
Farklı yollarda farklı zorluklar Yol başına WAF kuralları Her yol için ayrı ayrı çözün

Sık sorulan sorular

Çözme kanıtını, IP karmasını, UA karmasını ve son kullanma süresini içeren şifrelenmiş bir belirteçtir. Kodunu çözemez veya taklit edemezsiniz; yalnızca Cloudflare'in kenarı bunu doğrulayabilir.

Site operatörleri kullanım ömrünü yapılandırır. Varsayılan 30 dakikadır. Aralık 15 dakika ila 24 saat arasındadır. Kurumsal müşteriler özel değerler ayarlayabilir.

Bu sorunu JavaScript yürütmeden çözebilir miyim?

Hayır. Bu zorluk, iş kanıtını ve tarayıcı parmak izini hesaplamak için JavaScript'i gerektirir. CaptchaAI bunu gerçek tarayıcıları kullanarak dahili olarak yönetir.

Ray ID değişirse ne olur?

Her istek yeni bir Ray ID alır. Meydan okuma, meydan okuma sayfasındaki Ray ID'ye bağlıdır. qa_session_cookie verildikten sonra Ray ID artık geçerli değildir.

CF_clearance'ı farklı alanlarda yeniden kullanabilir miyim?

Hayır. qa_session_cookie etki alanı kapsamındadır. Her alan adı, kendi sorun çözme ve temizleme çerezine ihtiyaç duyar.


Özet

Cloudflare meydan okuma sayfaları, iş kanıtı jetonu akışını yönlendiren Ray ID'leri, meydan okuma komut dosyalarını, seçenek nesnelerini ve form parametrelerini içerir. Akış, IP'ye ve Kullanıcı Aracısına bağlı, 15 dakika ila 24 saat süreyle geçerli olan bir qa_session_cookie çerezi üretir. İleCaptchaAI, bu parametreleri manuel olarak ayrıştırmanıza gerek yoktur; çözücü akışın tamamını yönetir. Hata ayıklama için parametreleri anlamak, akışın nerede kesildiğini belirlemeye yardımcı olur.

İlgili Makaleler

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