Cloudflare korumalı bir sayfaya erişimin anahtarı tek bir çerezdir: qa_session_cookie. Doğrulama akışı bir kez tamamlandığında tarayıcı bu çerezi alır ve aynı oturumdaki sonraki istekler yeniden doğrulanmadan geçer. Bu rehber çerezin neye bağlı olduğunu, akışın arkasında ne olduğunu ve CaptchaAI API'siyle token'ı alıp çereze nasıl dönüştüreceğinizi gösterir.
Kısa kural:
qa_session_cookieçerezi; çözümün yapıldığı IP adresine, User-Agent değerine ve çoğu zaman TLS profiline bağlıdır. Bu üçlüyü sabit tuttuğunuz sürece çerez taşınabilir, birini değiştirdiğinizde istek büyük olasılıkla yeniden doğrulamaya düşer.
qa_session_cookie çerezi neye bağlıdır?
Çerez, doğrulama akışının çıktısıdır; ama tek başına taşınabilir bir anahtar değildir. Cloudflare onu, çözümün yapıldığı ortamın birkaç özelliğine bağlar. Bu bağların hangileri olduğunu bilmeden çerezi başka bir istemciye taşırsanız istek büyük olasılıkla yeniden doğrulamaya düşer.
| Özellik | Değer |
|---|---|
| Ad | qa_session_cookie |
| Etki alanı | Hedef site alanı (ör. .example.com) |
| Yol | / |
| Ömür | Tipik olarak 30 dakika – 24 saat |
| HttpOnly | Evet |
| Secure | Evet (yalnızca HTTPS) |
| SameSite | None |
Çerezin geçerliliği şu üç etkene bağlıdır:
- IP adresi — Çerezi farklı bir IP'den kullanmak çoğu zaman başarısız olur; Cloudflare çerezi çözümün yapıldığı kaynak IP'ye bağlar.
- User-Agent — Çözüm sırasında kullanılan User-Agent dizesiyle birebir eşleşmelidir.
- TLS test profil yapılandırması — Bazı yapılandırmalar çerezi TLS ClientHello imzasına da bağlar.
Kısacası çözüm oturumu ile sonradan yaptığınız istek oturumu aynı IP, aynı User-Agent ve mümkünse aynı TLS profilini paylaşmalıdır. Bu üçlü tutarlılık, çerezin neden bazen "geçerli görünüp" yine de reddedildiğini açıklar.
Çerezi başka bir istemciye taşırken
- Çözüm ve sonraki istekler için aynı çıkış IP'sini (aynı proxy) kullanın.
- User-Agent dizesini çözüm oturumundan birebir kopyalayın.
- Mümkünse aynı istemci kütüphanesiyle çalışarak TLS profilini koruyun.
Cloudflare doğrulama akışı adım adım nasıl işler?
Cloudflare bir ziyaretçiyi riskli olarak işaretlediğinde araya bir doğrulama sayfası girer. Sıra şöyle ilerler:
- İstemci, Cloudflare korumalı bir sayfayı ister.
- Cloudflare risk sinyallerini değerlendirir (IP itibarı, HTTP başlıkları, TLS test profil yapılandırması).
- İşaretlenirse Cloudflare, JavaScript tabanlı bir doğrulama sayfasıyla birlikte 403 ya da 503 döndürür.
- Doğrulama sayfası tarayıcı kontrollerini çalıştırır ve gerektiğinde bir Turnstile widget'ı sunar.
- Doğrulama başarılıysa Cloudflare
qa_session_cookie'yi ayarlar ve isteği orijinal URL'ye yönlendirir. - Çerez taşındığı sürece sonraki istekler yeniden doğrulanmadan geçer.
Otomasyon açısından kritik nokta 4. ve 5. adımlardır: Turnstile widget'ı çözülmeden çerez üretilmez, çerez üretilmeden de korumalı içeriğe ulaşamazsınız.
Doğrulama türleri
Cloudflare tek tip bir sayfa göstermez; risk seviyesine göre farklı zorlukta doğrulamalar sunar. Hangisiyle karşılaştığınızı bilmek, akışı doğru kurgulamanıza yardımcı olur.
| Doğrulama türü | Yanıt kodu | Kullanıcı etkileşimi | Açıklama |
|---|---|---|---|
| JS doğrulaması | 503 | Yok | Yalnızca JavaScript yürütmesi |
| Yönetilen doğrulama | 403 | Belki | Cloudflare karar verir — Turnstile gösterebilir veya sessizce geçebilir |
| İnteraktif doğrulama | 403 | Evet | Her zaman bir Turnstile widget'ı gösterir |
CaptchaAI bu üç türü de Cloudflare doğrulama akışı çözücüsü üzerinden çözer; Cloudflare Turnstile ve Cloudflare doğrulama akışı, kararlı (GA) olarak desteklenen türler arasındadır.
Pratikte en sık karşılaşılan tür yönetilen doğrulamadır; Turnstile widget'ını yalnızca gerektiğinde gösterir. Bu yüzden akışınızı her zaman bir widget çıkabilecekmiş gibi kurgulamak en güvenli yaklaşımdır.
CaptchaAI ile doğrulama akışını çözme
Akışın API tarafı iki adımdan oluşur: görevi in.php'ye gönderir, sonucu res.php'den sorgularsınız. Aşağıdaki örneklerde method olarak turnstile kullanılır; sitekey Cloudflare doğrulaması için genelde jenerik bir değerdir.
Python
import requests
import time
API_KEY = "YOUR_API_KEY"
TARGET_URL = "https://example.com/protected-page"
# Submit Cloudflare doğrulama akışı task
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "turnstile",
"sitekey": "0x0000000000000000000000", # may be generic for CF challenge
"pageurl": TARGET_URL,
"json": "1",
}).json()
if resp["status"] != 1:
raise Exception(f"Submit error: {resp['request']}")
task_id = resp["request"]
print(f"Task ID: {task_id}")
# Poll for result
for _ in range(30):
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["status"] == 1:
token = result["request"]
print(f"Token received: {token[:50]}...")
break
if result["request"] != "CAPCHA_NOT_READY":
raise Exception(f"Error: {result['request']}")
JavaScript
const axios = require('axios');
const API_KEY = 'YOUR_API_KEY';
const TARGET_URL = 'https://example.com/protected-page';
const submit = await axios.post('https://ocr.captchaai.com/in.php', null, {
params: {
key: API_KEY,
method: 'turnstile',
sitekey: '0x0000000000000000000000',
pageurl: TARGET_URL,
json: 1,
}
});
const taskId = submit.data.request;
// Poll
let token = null;
for (let i = 0; i < 30; i++) {
await new Promise(r => setTimeout(r, 5000));
const poll = await axios.get('https://ocr.captchaai.com/res.php', {
params: { key: API_KEY, action: 'get', id: taskId, json: 1 }
});
if (poll.data.status === 1) {
token = poll.data.request;
break;
}
}
console.log(`Token: ${token.substring(0, 50)}...`);
Çözülen token'ı çereze dönüştürme
API'den dönen token tek başına yeterli değildir; onu doğrulama sayfasındaki Turnstile yanıt alanına enjekte etmeniz gerekir. Enjeksiyon başarılıysa Cloudflare formu kabul eder ve qa_session_cookie'yi çıktı olarak verir.
# With Selenium
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(TARGET_URL) # Load the challenge page
# Inject token into Turnstile response field
driver.execute_script("""
const input = document.querySelector('input[name="cf-turnstile-response"]');
if (input) input.value = arguments[0];
// Trigger form submit or callback
const form = document.querySelector('form');
if (form) form.submit();
""", token)
# Wait for redirect and extract cookies
import time
time.sleep(3)
cookies = driver.get_cookies()
qa_session_cookie = next(
(c for c in cookies if c['name'] == 'qa_session_cookie'), None
)
if qa_session_cookie:
print(f"qa_session_cookie: {qa_session_cookie['value'][:30]}...")
Çerezi yeniden kullanma
Çerezi elde ettikten sonra tarayıcıya ihtiyaç kalmaz; onu doğrudan bir requests oturumuna taşıyabilirsiniz. Yukarıdaki bağımlılık kuralı burada da geçerli: User-Agent değerini çözüm oturumundakiyle aynı tutun.
session = requests.Session()
session.cookies.set("qa_session_cookie", qa_session_cookie["value"], domain=".example.com")
session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
})
# Now access protected pages
resp = session.get("https://example.com/api/data")
print(resp.status_code) # 200
Çerez ömrü ve otomatik yenileme
qa_session_cookie'nin süresi dolar; uzun süren iş akışlarında yeniden çözümü baştan planlayın. Aşağıdaki yardımcı, çerez geçerliyse mevcut değeri döndürür, değilse yeniden çözüm tetikler. expiry değerine 60 saniyelik tampon eklemek, tam sınırda yapılan isteklerin araya sıkışmasını önler.
import datetime
def is_cookie_valid(cookie):
if not cookie:
return False
expiry = cookie.get("expiry", 0)
return datetime.datetime.now().timestamp() < expiry - 60 # 60s buffer
def get_or_refresh_clearance(driver, target_url, solve_func):
cookies = driver.get_cookies()
cf = next((c for c in cookies if c["name"] == "qa_session_cookie"), None)
if is_cookie_valid(cf):
return cf["value"]
# Re-solve
token = solve_func(target_url)
# ... inject and extract new cookie
Yaygın sorunlar ve çözümleri
Doğrulama akışında karşılaşılan hataların çoğu, çözüm ve istek oturumları arasındaki tutarsızlıktan kaynaklanır.
| Sorun | Sebep | Çözüm |
|---|---|---|
| Çerez çözümden sonra reddedildi | IP uyuşmazlığı | Çözüm ve istekler için aynı proxy'yi kullanın |
| Çerezin süresi çok hızlı doluyor | Site tarafından belirlenmiş kısa TTL | Süre dolmadan yeniden çözün; expiry alanını izleyin |
| Geçerli çereze rağmen 403 | User-Agent uyuşmazlığı | Çözüm ve istek oturumlarında User-Agent'ı eşitleyin |
| Doğrulama sayfası yüklenmiyor | JavaScript devre dışı | Tam işlevli bir tarayıcı kullanın (Selenium, Puppeteer) |
Maliyet ve uyumluluk notu
CaptchaAI thread tabanlı ücretlendirir: her plan belirli sayıda eşzamanlı thread içerir ve o thread'lerin ay boyunca çözdüğü CAPTCHA sayısında üst sınır yoktur. Giriş planı BASIC ($15/ay, 5 thread) düzenli bir doğrulama iş yükü için başlangıç noktasıdır; USD üzerinden sabit aylık maliyet, TL kuru dalgalanmasıyla uğraşan Türkiye'deki ekipler için öngörülebilir bir gider anlamına gelir. Çözüm başına değil, eşzamanlı thread başına ödediğiniz için gerçek maliyeti belirleyen şey, akışınızın kaç doğrulamayı aynı anda kuyruğa aldığıdır.
Bir uyumluluk hatırlatması: Cloudflare korumalı sayfalardan toplanan veriler kişisel veri içeriyorsa KVKK kapsamına girebilir. Doğrulama akışını yalnızca erişim yetkiniz olan sistemlerde, QA ve veri toplama süreçlerinizin izinli sınırları içinde kullanın.
Sık sorulan sorular
Cloudflare doğrulama akışını çözmek için proxy şart mı?
Zorunlu değil ama şiddetle önerilir. Çerez kaynak IP'ye bağlandığı için, çözüm ve sonraki istekleri aynı IP üzerinden yapmak reddedilme riskini belirgin biçimde düşürür.
CaptchaAI hangi Cloudflare doğrulama türlerini destekler?
JS doğrulaması, yönetilen doğrulama ve interaktif doğrulama olmak üzere üç türü de Cloudflare doğrulama akışı çözücüsü üzerinden çözer.
qa_session_cookie'yi Selenium olmadan kullanabilir miyim?
Evet. Çerezi bir kez elde ettikten sonra onu bir requests.Session nesnesine taşıyıp korumalı isteklerinizi tarayıcısız yapabilirsiniz; yeter ki User-Agent değerini çözüm anındakiyle aynı tutun.
Token geçerli görünüyor ama site hâlâ 403 dönüyorsa ne yapmalıyım?
Çoğu durumda sebep User-Agent ya da IP uyuşmazlığıdır. Çözüm oturumu ile istek oturumunun User-Agent dizesini ve çıkış IP'sini eşitleyin; sorun sürerse çerezin süresinin dolup dolmadığını expiry alanından kontrol edin.
Aynı çerezi birden fazla makinede kullanabilir miyim?
Yalnızca makineler aynı çıkış IP'sini paylaşıyor ve aynı User-Agent'ı kullanıyorsa. Cloudflare çerezi tipik olarak kaynak IP'ye bağladığından, farklı bir ağdan gönderilen istek büyük olasılıkla yeniden doğrulamaya düşer.
Cloudflare doğrulama akışını CaptchaAI ile çözün
API anahtarınızı şu adresten alın: captchaai.com. İlk görevinizi gönderdikten sonra token'ı çereze dönüştürmek yukarıdaki birkaç satırlık iş.