Kısa yanıt: Turnstile token'ı Cloudflare tarafından üretildiği andan itibaren yaklaşık 300 saniye (5 dakika) geçerlidir. Testte sorunsuz çalışan bir akış, üretimde form doldurma ve ağ gecikmeleri yüzünden bu pencereyi aşınca token reddedilir — site çoğu zaman açık bir hata da vermez, sadece formu geri çevirir. Aşağıda zamanlamayı doğru kurmanın yolları var.
Turnstile Token Ömrü: 300 Saniye Ne Anlama Gelir?
Hızlı teşhis: Token testte sorunsuz çalışıp üretimde reddediliyorsa önce şunu kontrol edin: token üretimi ile gönderim arasındaki süre 300 saniyeyi aştı mı? Vakaların çoğu budur.
Turnstile token'ları oluşturulduktan yaklaşık 300 saniye (5 dakika) sonra geçersiz hale gelir. Bu, reCAPTCHA'nın ~120 saniyelik penceresinden daha geniş bir marj tanır, ama çok adımlı otomasyon akışlarında yine de yarış koşulu (race condition) riski doğurur.
| CAPTCHA türü | Token ömrü |
|---|---|
| reCAPTCHA v2/v3 | ~120 saniye |
| Cloudflare Turnstile | ~300 saniye |
| hCaptcha | ~120 saniye |
- Sayaç ne zaman başlar: Cloudflare token'ı ürettiği an — CaptchaAI'nin size döndürdüğü an değil.
- CaptchaAI'nin payı: Turnstile'ı genelde 10 saniyenin altında çözer; 300 saniyelik bütçenin kalanını form akışınız tüketir.
Yarış Koşulu Tam Olarak Nasıl Ortaya Çıkar?
Token üretimi ile gönderim arasındaki adımları saniye saniye izleyin:
Time 0:00 — You submit a Turnstile task to CaptchaAI
Time 0:15 — CaptchaAI begins solving
Time 0:20 — Token is generated (timer starts here)
Time 0:25 — CaptchaAI returns token to you
Time 0:25+ — Your code processes the token
Time ??? — Your code submits the token to the site
0:20'den itibaren sayaç işliyor; token'ı göndermek için teorik olarak 5:20'ye kadar vaktiniz var. Cömert görünür — ama gerçek bir üretim akışında neler olduğuna bakın:
Time 0:20 — Token generated
Time 0:25 — Received by your code
Time 0:30 — Fill form fields
Time 0:35 — Navigate to next page
Time 1:00 — Handle additional dialogs
Time 2:00 — Wait for page load
Time 4:00 — Network latency spike
Time 5:30 — Submit token → EXPIRED
Token süresini en sık dolduran dört senaryo şunlardır:
Senaryo 1: Çok Adımlı Formlar
Son gönderimden önce birden fazla sayfa gerektiren formlarda risk yüksektir:
Step 1: Fill personal info → Step 2: Fill address →
Step 3: Solve CAPTCHA → Step 4: Review → Step 5: Submit
CAPTCHA 3. adımda çözülüp gönderim 5. adımda gerçekleşiyorsa, aradaki gecikme kolayca 5 dakikayı geçebilir.
Senaryo 2: Toplu İşleme Kuyrukları
Token'ları önden toplu çözüp sırayla kullanmak klasik bir hata:
# DON'T: Solve all tokens first, then use them
tokens = []
for url in urls:
tokens.append(solve_turnstile(url)) # Tokens age while waiting
for url, token in zip(urls, tokens):
submit_form(url, token) # Early tokens may be expired
Senaryo 3: Eski Token'la Yeniden Deneme Döngüleri
Başarısız bir gönderimden sonra aynı token'ı yeniden denemek de aynı tuzağa düşer:
token = solve_turnstile(site_key, page_url)
for attempt in range(3):
result = submit_form(page_url, token)
if result.ok:
break
# BUG: Retrying with the same token — it may be expired OR already consumed
Senaryo 4: Türkiye E-Ticaret QA Akışında Çok Adımlı Ödeme Testi
İstanbul merkezli bir e-ticaret ekibinin QA akışını düşünün: sepet → adres → kargo → ödeme onayı adımlarında Turnstile doğrulaması adres adımında tetikleniyor, ama gönderim ödeme onayında gerçekleşiyor. Europe/Istanbul saat diliminde çalışan test script'i kargo seçeneklerini karşılaştırırken 2-3 dakika bekliyor ve token süresi dolduğu için gönderim başarısız oluyor. Çözüm aynı: CAPTCHA'yı akışın en sonuna taşıyın. Tek paralellik için BASIC ($15/ay, 5 thread) yeterli; çok adımlı senaryoları paralel koşan ekipler STANDARD ($30/ay, 15 thread) ile başlar.
Token Süresinin Dolmasını Önlemenin 3 Yolu
Yöntem 1: Tam Zamanında Çözün (Just-in-Time)
Token'ı yalnızca gönderime hazır olduğunuzda isteyin — form doldurma ve gezinme bittikten sonra:
import requests
import time
def solve_turnstile(site_key, page_url):
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": "YOUR_API_KEY",
"method": "turnstile",
"sitekey": site_key,
"pageurl": page_url,
"json": 1
})
task_id = resp.json()["request"]
for _ in range(60):
time.sleep(3)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY",
"action": "get",
"id": task_id,
"json": 1
})
data = result.json()
if data["status"] == 1:
return data["request"]
raise TimeoutError("Solve timed out")
# Complete all form steps FIRST
fill_personal_info()
fill_address()
navigate_to_review()
# THEN solve and submit immediately
token = solve_turnstile(site_key, page_url)
submit_form(token) # Submit within seconds of receiving the token
Yöntem 2: Token Yaşını Programatik Olarak Takip Edin
Zaman damgasını token ile birlikte saklayın ve her kullanımdan önce yaşını kontrol edin:
import time
class TimedToken:
def __init__(self, token, created_at=None):
self.token = token
self.created_at = created_at or time.time()
self.max_age = 270 # 4.5 min — safety margin from 5 min limit
@property
def is_valid(self):
return (time.time() - self.created_at) < self.max_age
@property
def remaining_seconds(self):
return max(0, self.max_age - (time.time() - self.created_at))
# Usage
timed_token = TimedToken(solve_turnstile(site_key, page_url))
# Check before using
if timed_token.is_valid:
submit_form(timed_token.token)
else:
# Solve a fresh token
timed_token = TimedToken(solve_turnstile(site_key, page_url))
submit_form(timed_token.token)
Yöntem 3: Her Denemede Taze Token (JavaScript)
Yeniden deneme mantığınız varsa aynı token'ı asla ikinci kez göndermeyin — her denemede yeni bir token çözün:
async function submitWithFreshToken(siteKey, pageUrl, formData) {
const maxRetries = 3;
for (let attempt = 0; attempt < maxRetries; attempt++) {
// Always solve a fresh token for each attempt
const token = await solveTurnstile(siteKey, pageUrl);
const response = await fetch(pageUrl, {
method: 'POST',
body: JSON.stringify({ ...formData, 'cf-turnstile-response': token }),
headers: { 'Content-Type': 'application/json' }
});
if (response.ok) return await response.json();
console.log(`Attempt ${attempt + 1} failed, solving fresh token...`);
}
throw new Error('All attempts failed');
}
Süresi Dolmuş Token'ı Nasıl Anlarsınız?
Site size genelde açıkça "token süresi doldu" demez. Şu sinyallere bakın:
| Sinyal | Ne anlama gelir |
|---|---|
| Token gönderildikten sonra HTTP 403 | Token geçersiz veya süresi dolmuş |
| Form sayfasına yönlendirme | Token doğrulaması başarısız oldu |
| "Doğrulama başarısız" hata mesajı | Genel hata — süre dolmuş olabilir |
| Doğrulama sayfası yeniden görünüyor | Token reddedildi, Cloudflare yeniden doğrulama istiyor |
Teşhis İçin Loglama
Token'ın yaşını her gönderimde loglayın; böylece süre dolmasını tahminden çıkarıp ölçüme çevirirsiniz:
import time
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("turnstile")
token_received_at = time.time()
token = solve_turnstile(site_key, page_url)
logger.info(f"Token received, length: {len(token)}")
# ... workflow steps ...
submit_time = time.time()
age = submit_time - token_received_at
logger.info(f"Submitting token, age: {age:.1f}s")
if age > 270:
logger.warning(f"Token may be expired (age: {age:.1f}s > 270s safety limit)")
Turnstile Widget'ı Otomatik Yenileniyor mu?
Tarayıcı tabanlı akışlarda Turnstile widget'ı, token'ların süresini doldurmadan otomatik olarak yeniler. data-expired-callback, token'ın süresi dolduğunda tetiklenir:
turnstile.render('#captcha', {
sitekey: '0x4AAAA...',
callback: (token) => {
console.log('New token:', token);
},
'expired-callback': () => {
console.log('Token expired — widget will auto-refresh');
}
});
Yalnızca API ile otomasyon yapıyorsanız (tarayıcı yok) bu otomatik yenilemeden faydalanamazsınız — token tazeliğini kendiniz yönetmek zorundasınız.
Sorun Giderme Tablosu
| Sorun | Sebep | Düzeltme |
|---|---|---|
| Token testte çalışıyor, üretimde çalışmıyor | Üretim akışı daha yavaş | Önceden değil, tam zamanında çözün |
| İlk gönderim başarılı, yeniden denemeler başarısız | Tüketilmiş token'ın yeniden kullanılması | Her denemede yeni bir token çözün |
| Uzun formlarda aralıklı hatalar | Çok adımlı akışta token süresi doluyor | CAPTCHA çözümünü son adıma taşıyın |
| Toplu işlerde yüksek hata oranı | Toplu çözülen token'lar kullanılmadan önce süresi doluyor | Token'ları toplu değil, isteğe bağlı (on-demand) çözün |
Hızlı Kontrol Listesi
- Token'ı yalnızca gönderime hazır olduğunuzda isteyin, önceden değil.
- Her yeniden denemede taze bir token çözün — tüketilmiş token'ı asla yeniden göndermeyin.
- Toplu işlerde token'ları isteğe bağlı (on-demand) çözün, önceden çözüp beklemeyin.
- Gönderim öncesi token yaşını loglayın ve 270 saniyeyi güvenlik sınırı olarak kullanın.
Sık Sorulan Sorular
Turnstile token'ının ömrünü uzatabilir miyim?
Hayır. Geçerlilik süresini Cloudflare belirler ve bu süre değiştirilemez. Süre dolduğunda tek seçeneğiniz yeni bir token çözmektir.
CaptchaAI bir Turnstile token'ını kaç saniyede üretir?
CaptchaAI, Cloudflare Turnstile'ı genelde 10 saniyenin altında çözer — 300 saniyelik bütçenin küçük bir kısmı; kalanı form ve gönderim adımlarınıza kalır.
Token süresi dolduğunda hangi hatayı görürüm?
Site genelde açık bir "süre doldu" mesajı vermez. Gönderim sonrası HTTP 403, form sayfasına geri yönlendirme veya doğrulama sayfasının yeniden görünmesi en yaygın sinyallerdir.
Toplu (batch) otomasyonda kaç thread'e ihtiyacım var?
- Paralel iş yüküne göre seçin: Gereken thread sayısı token yaşından çok eşzamanlı çalıştırdığınız test sayısına bağlıdır.
- BASIC ($15/ay, 5 thread) küçük QA koşuları için yeterli; STANDARD ($30/ay, 15 thread) çok adımlı formları paralel test eden ekipler için başlangıç noktasıdır.
İlgili Makaleler
- Cloudflare doğrulama akışı ile Turnstile algılamasının farkları
- GeeTest ve Cloudflare Turnstile karşılaştırması
- Token düzeltmesinden sonra alınan 403 hatası
Sonraki Adımlar
Turnstile token süresini bir daha üretimde sorun etmeyin — CaptchaAI API anahtarınızı alın ve tam zamanında çözümle yüksek başarı oranını iş akışınıza taşıyın.