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 çerez kısıtlamaları
qa_session_cookie çerezi şunlara bağlıdır:
- IP adresi – Sorunu çözen aynı IP'den gelmelidir
- Kullanıcı Aracısı – Mücadele sırasında kullanılan UA ile eşleşmelidir
- 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
qa_session_cookie çerezinin içinde ne var?
Çö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.
qa_session_cookie ne kadar sürer?
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.