Formunuz hata vermiyor, log'da istisna yok, ama gönderim sessizce reddediliyor — bu tablonun neredeyse tek açıklaması reCAPTCHA v3 puanının sitenin eşiğinin altında kalmasıdır. v3 ekranda hiçbir CAPTCHA doğrulaması göstermez; 0,0 (bot) ile 1,0 (insan) arasında bir sayı üretir ve kararı tamamen siteye bırakır. Yani "bir şey kırıldı" diye kod tarafında aradığınız hata çoğu zaman orada değildir.
Puanı sizin kodunuz değil, Google'ın risk modeli belirler: isteğin çıktığı IP, profilin oturum geçmişi, token'a gömülü action değeri ve token'ın ne kadar bekletildiği birlikte okunur. Aşağıda önce nedenleri etkisi en yüksek olandan başlayarak eleyeceğiz, sonra sinyal tablosuna, sahadan bir senaryoya ve CaptchaAI ile token üretimine geçeceğiz.
Düşük reCAPTCHA v3 puanının yedi tipik nedeni
Sırayı bozmadan ilerleyin: üstteki maddeler puanı en çok hareket ettirenlerdir ve düzeltmeler birikimli çalışır.
1. IP itibarı düşük
Açık ara en sık neden. Bulut sağlayıcılarının IP blokları Google tarafında veri merkezi olarak tanınır ve bu bloklardan gelen her istek baştan düşük puanla başlar. Paylaşımlı ucuz proxy havuzları da aynı sonucu verir.
Düzeltme:
- Trafiği kendi kontrol ettiğiniz çıkış noktalarına taşıyın.
- İstekleri tek bir adreste yığmak yerine birden fazla çıkışa dağıtın.
- Ücretsiz proxy listelerinden uzak durun.
2. action değeri sayfadakiyle eşleşmiyor
Her grecaptcha.execute() çağrısı bir eylem dizisi taşır ve bu dize token'ın içine gömülür. Yanlış eylem gönderdiğinizde token yine üretilir — hata almazsınız — ama sunucudaki doğrulama gömülü eylemin beklenenle eşleşmediğini görüp isteği düşürür. login yerine submit göndermek tek başına akışı bitirmeye yeter.
Düzeltme: Değeri sayfa kaynağındaki çağrıdan birebir okuyun ve API isteğinize aynen geçirin.
3. Token 2 dakikadan fazla bekletildi
reCAPTCHA v3 token'larının geçerlilik süresi 2 dakikadır. Token'ı sayfa yüklenirken üretip form gönderiminden sonra kullanan akışlar bu süreyi kolayca aşar; kuyruk kullanan mimarilerde bekleme süresi tek başına sınırı geçebilir.
Düzeltme:
- Token'ı gönderimden hemen önce isteyin, sayfa açılışında değil.
- Kuyruklu tasarımlarda token'ı kuyruğa girerken değil, kuyruktan çıkan worker'a ürettirin.
4. Tarayıcı neredeyse hiç davranış sinyali göndermiyor
Varsayılan yapılandırmayla koşan headless tarayıcılarda fare hareketi, kaydırma geçmişi ve çerez yoktur. Bu boşluğun kendisi bir işarettir: model sinyalin hiç olmamasını da düşük puanla karşılar.
Düzeltme:
- Gerçekçi bir görünüm boyutu ve kullanıcı aracısı ayarlayın.
- İşlemi tetiklemeden önce sayfada birkaç saniye kalın.
- En az bir kaydırma hareketi bırakın.
5. Profilde Google çerezi yok
Aktif Google oturumu taşıyan tarayıcılar (NID, SID, HSID çerezleri) daha yüksek puan alma eğilimindedir. Her koşuda sıfırdan açılan temiz profillerde bu geçmiş hiç oluşmaz.
Düzeltme: Kalıcı bir tarayıcı profili kullanın ve hedef sayfaya gitmeden önce profilin normal bir tarama geçmişi biriktirmesine izin verin.
6. Aynı oturumdan art arda çok fazla istek
Aynı oturumdan hızlı tekrarlanan grecaptcha.execute() çağrılarında her yeni çağrı bir öncekinden düşük puan alır. Puanın zamanla düştüğü yolundaki şikâyetlerin arkasında genellikle bu vardır.
Düzeltme: Çözümler arasına en az 15–30 saniye gecikme koyun ve oturumları dönüşümlü kullanın.
7. Eşiği yanlış varsayıyorsunuz
Bazen sorun puanda değil beklentidedir. Site 0,7 eşiği kullanıyorsa 0,5'lik bir puan da "düşük" görünür — oysa akış tasarım gereği reddediliyordur. Sayfadan v3 yerine v2 sitekey'ini çıkarmış olma ihtimalini de bu maddede eleyin.
Düzeltme: Doğrulama yanıtını loglayın; score alanını görmeden eşik tahmin etmek zaman kaybıdır.
Puanı oluşturan sinyaller
Nedenleri elerken hangi kategoriye dokunduğunuzu bilmek işe yarar. Google puan atamadan önce şunları birlikte okur:
| Sinyal kategorisi | Neye bakılıyor |
|---|---|
| IP itibarı | Veri merkezi mi, son kullanıcı bağlantısı mı; kötüye kullanım kaydı |
| Çerez ve oturum | Google çerezleri, profilin tarama geçmişi |
| Tarayıcı test profil yapılandırması | Canvas, WebGL, yazı tipleri, eklentiler |
| Fare ve kaydırma | İmleç yolu, hız, duraklamalar, sayfa kaydırma |
| Yazma temposu | Tuş vuruşu zamanlaması ve ritmi |
| Sayfa etkileşim süresi | İşlem tetiklenmeden önce sayfada geçen süre |
action eşleşmesi |
Token'a gömülü eylem, sitenin beklediğiyle aynı mı |
Hiçbir kategori tek başına belirleyici değildir; puan hepsinin bileşimidir.
Sahadan bir örnek: gece koşan ödeme adımı süiti
İstanbul'da çalışan bir e-ticaret ekibinin ödeme adımı QA otomasyonunu düşünün. Testler gece Europe/Istanbul saatiyle koşuyor; tr-TR locale ile açılan headless Chrome, tek bir bulut sunucusunda her koşuda 200 sipariş akışını deniyor. İlk hafta sorunsuz geçiyor, ikinci hafta koşuların tamamı doğrulama adımında düşüyor.
Sırayı uygularsanız neden hemen görünür: tek bulut IP'si, her seferinde sıfırlanan tek profil ve aralıksız 200 istek — yani 1, 5 ve 6 numaralı maddeler aynı anda. Düzeltme sırası da aynıdır: önce çıkış noktalarını dağıtın, sonra profilleri kalıcı hale getirin, en son istekler arasına gecikme koyun. Bunları ters sırada denerseniz her adımda "hiçbir şey değişmedi" sonucunu alırsınız.
Maliyet tarafı Türkiye'deki ekipler için ayrıca önemli: kur oynaklığı nedeniyle öngörülebilir aylık USD gider tek başına bir avantajdır. CaptchaAI planları thread tabanlıdır ve fiyatlar USD üzerinden ilerler; BASIC ($15/ay, 5 thread) küçük bir regresyon paketine yeterken, gece paralel koşan bir süit için ADVANCE ($90/ay, 50 thread) daha uygun düşer.
Son bir hatırlatma: test verisi gerçek kullanıcı bilgisi içeriyorsa KVKK kapsamına girer. QA akışlarında sahte ama geçerli biçimli veri (+90 formatlı numaralar) kullanın.
CaptchaAI ile reCAPTCHA v3 token'ı üretme
CaptchaAI, reCAPTCHA v3'ü gerçek tarayıcı ortamlarında çözer ve genellikle 0,3 civarında puanlanan token'lar üretir. Eşiği 0,3 veya altında olan sayfaların çoğu bu token'ı kabul eder; daha yüksek eşiklerde yukarıdaki sinyal düzeltmeleri hâlâ gereklidir. Puanı Google belirlediği için hiçbir servis belirli bir puan sözü veremez — bu kısıt sektörün tamamı için geçerlidir.
Görevi in.php uç noktasına gönderin, sonucu res.php üzerinden sorgulayın:
import requests
import time
response = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"version": "v3",
"googlekey": "SITE_KEY",
"action": "login",
"pageurl": "https://staging.example.com/qa-login",
"json": 1
})
task_id = response.json()["request"]
for _ in range(30):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY", "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
token = result["request"]
print(f"Token received: {token[:50]}...")
break
Node.js tarafında aynı akış:
const axios = require('axios');
async function solveV3(sitekey, pageurl, action) {
const { data } = await axios.get('https://ocr.captchaai.com/in.php', {
params: {
key: 'YOUR_API_KEY', method: 'userrecaptcha', version: 'v3',
googlekey: sitekey, action, pageurl, json: 1
}
});
const taskId = data.request;
for (let i = 0; i < 30; 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');
}
Hızlı teşhis kontrol listesi
Bir koşu düştüğünde listeyi yukarıdan aşağıya uygulayın; ilk üç satır vakaların çoğunu kapatır.
| Kontrol | Eylem |
|---|---|
action doğru mu? |
Sayfa kaynağındaki grecaptcha.execute() çağrısıyla karşılaştırın |
| Token taze mi? | Üretimden sonraki 2 dakika içinde gönderin |
| Sitekey doğru mu? | v2 değil, v3 sitekey'ini çıkardığınızı doğrulayın |
| IP türü? | Kendi çıkış noktalarınıza geçin, tek adreste yığılmayın |
| İstek hızı? | Çözümler arasına 15–30 saniye gecikme koyun |
| Google çerezleri? | Kalıcı profil kullanın, oturum geçmişini koruyun |
| Eşik biliniyor mu? | Sunucu yanıtındaki score alanını loglayın |
Sık sorulan sorular
Puanın düştüğünü nasıl anlarım, sayfada bir uyarı çıkmıyor?
Çıkmaz. v3 sessizdir; tek kanıt sunucu tarafındaki doğrulama yanıtıdır. score alanını loglamaya başlamadan önce yaptığınız her tahmin körlemedir.
Hangi puan "yeterli" sayılır?
Eşiği site belirler, tek bir doğru sayı yoktur. Düşük riskli sayfalarda 0,3, ödeme gibi kritik işlemlerde 0,7 yaygındır; varsayılan olarak 0,5 de sık görülür. Kendi hedef sitenizin değerini yanıtı loglayarak ölçün.
Düzeltmeleri uyguladım ama puan hemen yükselmedi, normal mi?
Normal. Düzeltmeler birikimli çalışır; IP itibarı gibi kalemler birkaç gün içinde oturur. Tek seferde tek değişiklik yapıp score alanını loglayarak ilerleyin.
v3 puanı düşükken sitenin gösterdiği v2 doğrulamasını çözmek daha mı mantıklı?
Çoğu zaman evet. Birçok site düşük v3 puanında v2 doğrulaması gösterir ve v2 ikili sonuç ürettiği için akış öngörülebilir hale gelir. Puan takip etmek yerine net bir kabul/ret sinyali alırsınız.
Aynı sorun Turnstile veya GeeTest v3 tarafında da yaşanır mı?
Hayır, çünkü ikisi de puan üretmez. Cloudflare Turnstile ve GeeTest v3 doğrulanabilir token döndürür; oralarda sorun giderme token tazeliği ve doğru sitekey etrafında döner.