Selenium betiğiniz sayfayı açar açmaz reCAPTCHA v3 puanınız 0,1'e düşüyorsa, sorun tıkladığınız onay kutusu değildir: reCAPTCHA, siz daha hiçbir şeye dokunmadan tarayıcınızı profillemiş ve otomasyon sinyallerini toplamıştır. Görünür onay kutusunun çok ötesinde, birbirini besleyen beş algılama katmanı çalışır. Aşağıda bu katmanları tek tek açıyor, ardından CaptchaAI gibi API çözücülerin katmanları neden hiç tetiklemeden geçerli bir token döndürdüğünü gösteriyoruz.
Beş algılama katmanına genel bakış
Her satır, o katmanın incelediği yüzeyi ve otomasyonu ele veren tipik sinyali özetler:
| Katman | Neyi inceler | Tipik bot sinyali |
|---|---|---|
| 1. JavaScript ortam taraması | Tarayıcı API'leri ve nesneleri | ChromeDriver bayrağı, eksik window.chrome |
| 2. Canvas / WebGL | Grafik oluşturma çıktısı | SwiftShader, boş piksel verisi |
| 3. Davranış analizi | Fare, klavye, zamanlama | Düz çizgi hareket, sabit ritim |
| 4. Ağ / IP itibarı | IP, TLS, HTTP başlıkları | Veri merkezi IP'si, uyumsuz TLS imzası |
| 5. Oturumlar arası korelasyon | Oturum ve site geneli kalıplar | Çerezsiz tekrarlı oturumlar |
Katman 1: JavaScript ile ortam taraması
reCAPTCHA, headless tarayıcıları yakalamak için sayfada bir dizi JavaScript denetimi (prob) çalıştırır. Bu denetimler üç hedefe bakar:
- ChromeDriver gibi araçların otomatik ayarladığı otomasyon bayrakları
- Gerçek Chrome'da bulunan ama headless ortamda eksik kalan tarayıcı API'leri
- Otomasyon araçlarının gizlenmek için değiştirdiği yerel fonksiyonlar
navigator.userAgent otomasyon bayrağı
// Selenium/Puppeteer set this automatically
navigator.userAgent === true // → Automation detected
// Real browser
navigator.userAgent === undefined // or false → Normal browser
Eksik veya farklı tarayıcı API'leri
// Probes reCAPTCHA performs (simplified)
const checks = {
// Chrome-specific object
hasChrome: !!window.chrome,
hasChromeRuntime: !!(window.chrome && window.chrome.runtime),
// Plugin and MIME type arrays
pluginCount: navigator.plugins.length,
mimeTypeCount: navigator.mimeTypes.length,
// Notification permission
notificationPermission: Notification.permission,
// Speech synthesis voices
speechVoices: window.speechSynthesis.getVoices().length,
// Performance observer
hasPerformanceObserver: typeof PerformanceObserver !== "undefined",
};
window.chromegerçek tarayıcıda nesnedir; headless'ta tanımsız veya eksiktirnavigator.pluginsgerçek tarayıcıda 2-5 eklenti taşır; headless'ta boş dizidirnavigator.permissionsquery()içerir; headless'ta hata verebilir veya eksiktirNotification.permissionbeklenen "default" yerine hata verir;window.speechSynthesisboş kalır
Prototip zincirinde oynama tespiti
// reCAPTCHA may check if native functions were modified
const nativeToString = Function.prototype.toString;
const pluginsToString = navigator.plugins.toString();
// Overridden functions have different toString output:
// Native: "function get plugins() { [native code] }"
// Overridden: "function () { return [...fakePlugins] }"
Katman 2: Canvas ve WebGL ile ortam kimliği
reCAPTCHA bir canvas üzerine görünmez öğeler çizip piksel verisini geri okur; sonuç OS, GPU ve yazı tipi motoruna göre değişir:
// Simplified canvas test profil yapılandırması
const canvas = document.createElement("canvas");
const ctx = canvas.getContext("2d");
ctx.textBaseline = "alphabetic";
ctx.font = "14px Arial";
ctx.fillStyle = "#f60";
ctx.fillRect(125, 1, 62, 20);
ctx.fillStyle = "#069";
ctx.fillText("CaptchaTest,!", 2, 15);
const test profil yapılandırması = canvas.toDataURL();
// Unique per browser/OS/GPU combination
| Gözlem | Anlamı |
|---|---|
| Farklı OS/tarayıcı bildiren oturumlarda aynı çıktı | Sahtecilik işareti |
| Canvas işlemleri tekdüze/boş veri döndürüyor | Headless ortam |
| Çıktı bilinen headless Chrome kalıbıyla eşleşiyor | Otomasyon işaretlenir |
const gl = document.createElement("canvas").getContext("webgl");
const debugInfo = gl.getExtension("WEBGL_debug_renderer_info");
const vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);
const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
// Real browser: "ANGLE (NVIDIA GeForce RTX 3060 Direct3D11 vs_5_0 ps_5_0)"
// Headless Chrome: "Google Inc. (Google SwiftShader)" ← Strong bot signal
Katman 3: Davranış analizi — en belirleyici katman
Bu, reCAPTCHA'nın en güçlü algılama katmanıdır. Sayfa yüklenmesinden form gönderimine kadar davranışı sürekli izler ve insan ile botu şu eksenlerde ayırır:
| Eksen | İnsan kalıbı | Bot kalıbı |
|---|---|---|
| Fare | Eğri yol, değişken hız, doğal sapma | Düz çizgi, sabit hız, kusursuz hedefleme |
| Klavye | Değişken aralık, ara sıra hata ve düzeltme | Sabit aralık veya anlık giriş, sıfır hata |
| Zamanlama | Sayfayı okuyan kademeli etkileşim | Yüklenmeden saniyeler içinde işlem |
Fare hareketi analizi
reCAPTCHA records:
├─ Mouse coordinates at ~60fps intervals
├─ Velocity and acceleration at each point
├─ Trajectories between clickable elements
├─ Hover patterns over links and buttons
├─ Micro-movements while "stationary"
└─ Natural overshoot when targeting elements
Human pattern:
- Curved paths with variable speed
- Natural acceleration/deceleration (Fitts's Law)
- Random micro-jitter during hovering
- Occasional overshoot and correction
Bot pattern:
- Zero mouse events (no mouse simulation)
- Straight lines at constant speed
- Perfect targeting (no overshoot)
- Identical patterns across sessions
Klavye ritmi analizi
reCAPTCHA records:
├─ Inter-key interval for each key pair
├─ Key hold duration (keydown to keyup)
├─ Error rate (backspace frequency)
├─ Typing rhythm consistency
└─ Input method (keyboard vs paste vs JavaScript)
Human pattern:
- Variable intervals (80-300ms typical)
- Faster for common character pairs
- Occasional errors and corrections
- keydown → keypress → keyup sequence
Bot pattern:
- Constant intervals or instant input
- No keypress events (value set via JS)
- Zero errors
- All characters appear simultaneously
Zamanlama ve etkileşim sırası
reCAPTCHA records:
├─ Time from page load to first interaction
├─ Time from CAPTCHA rendering to click
├─ Scroll events and depths
├─ Focus/blur events on form fields
└─ Tab between fields vs click between fields
Suspicious patterns:
- First interaction < 1 second after page load
- CAPTCHA clicked immediately after rendering
- No scroll events before interacting with below-fold content
- All form fields filled in <500ms
Katman 4: Ağ ve IP itibarı
Google, gelen isteğin IP'sini geniş bir istihbarat veritabanına göre değerlendirir:
| Kategori | Örnek / not |
|---|---|
| Veri merkezi aralıkları | AWS (52.x.x.x, 54.x.x.x), GCP, Azure, DigitalOcean |
| Proxy/VPN sağlayıcıları | NordVPN, ExpressVPN, ticari proxy servisleri |
| Tor çıkış düğümleri | Düzenli güncellenen genel liste |
| Kötüye kullanım geçmişi | Spam, kazıma veya CAPTCHA çiftçiliğine karışmış IP'ler |
IP'nin yanında ağ imzası da denetlenir. Her HTTP istemcisi benzersiz bir TLS el sıkışma imzası (JA3/JA4) üretir:
Chrome 120: JA3 = 771,4865-4866-4867-49195-49199-49196..
Python/requests: JA3 = 771,4866-4867-4865-49196-49200..
curl/libcurl: JA3 = 771,49196-49200-159-52393-52392..
reCAPTCHA, TLS imzasının bildirilen User-Agent ile uyuştuğunu ve HTTP başlıklarının gerçek Chrome ile tutarlı olduğunu doğrular. Python TLS imzasına sahip bir Chrome User-Agent otomasyon olarak işaretlenir.
Real Chrome headers:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,...
Accept-Language: en-US,en;q=0.9
Accept-Encoding: gzip, deflate, br
Sec-CH-UA: "Not_A Brand";v="8", "Chromium";v="120"
Sec-CH-UA-Platform: "Windows"
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Automation headers (missing or different):
- Missing Sec-CH-UA headers
- Missing Accept-Language
- Non-standard Accept header
- Missing Sec-Fetch-* headers
Katman 5: Oturumlar arası korelasyon
reCAPTCHA tek bir oturumla sınırlı kalmaz; birden fazla oturum ve site genelinde kalıpları izler:
| Sinyal | Ne gösterir |
|---|---|
| Oturum kimliği korelasyonu | Birçok sitede hızlı istek yapan aynı tarayıcı imzası |
| Çözüm kalıbı analizi | Tutarlı aralıklarla doğru yanıtlar (insan süreleri değişkendir) |
| Sorgu-yanıt korelasyonu | Aynı sorunları saniyeler içinde çözen çok sayıda oturum |
| Çerez zaman çizelgesi | Çerez kalıcılığı olmadan aynı IP'den açılan oturumlar |
Türkiye'den bir senaryo: e-ticaret checkout QA'sı
Diyelim ki İstanbul'da freelance çalışan bir otomasyon geliştiricisiniz ve bir e-ticaret müşterisinin ödeme adımını (checkout) test eden bir QA paketi yazıyorsunuz. Test ortamınız staging.example.com/qa-login üzerinde reCAPTCHA v2 ile korunuyor. Selenium betiğiniz ilk koşuda çalışır görünse de birkaç denemeden sonra reCAPTCHA sizi sürekli görüntü sorusuna düşürüyor — çünkü katmanlar aynı ChromeDriver imzasını ve düz çizgi fare hareketlerini fark etti. Çözümü API'ye devretmek, tarayıcı yapılandırmasını elle ayarlamaktan daha kararlı bir yoldur. Ayrıca unutmayın: işlediğiniz her kişisel veri Türkiye'de KVKK kapsamındadır; API tabanlı çözümü yalnızca yetkiniz olan QA ve veri toplama iş akışlarında kullanın.
API tabanlı çözücüler bu katmanları nasıl ele alır?
CaptchaAI gibi API tabanlı çözücüler algılamayı ayrı bir ortama taşır. Otomasyonunuz reCAPTCHA ile karşılaşmaz; yalnızca sitekey ve pageurl değerlerini çıkarıp API'ye gönderir. Çözüm, her katmandan temiz geçecek biçimde yapılandırılmış ayrı bir ortamda üretilir:
Your automation:
Extracts sitekey + pageurl from target page
↓
Sends to CaptchaAI API (HTTPS request to ocr.captchaai.com)
↓
CaptchaAI's solver environment:
├─ Real browser with genuine test profil yapılandırması (not headless)
├─ Human-like behavioral patterns
├─ Clean residential IP
├─ Valid cookies and session history
├─ Matching TLS/header fingerprints
└─ Solves the challenge with human-like behavior
↓
Returns valid g-recaptcha-response token
↓
Your automation:
Submits token to target website
↓
Target website validates token with Google
→ Google sees a legitimate solve from a trusted environment
→ Token validated: success = true
Buradaki önemli noktalar:
- Otomasyonunuz reCAPTCHA ile hiç etkileşime girmez; katmanların denetlediği yüzey artık kodunuz olmaz.
- Davranış üretimi ve sorgulama, katmanları geçecek biçimde optimize edilmiş çözücü ortamında yapılır.
- Kodunuzun tek görevi, dönen token'ı hedef sitenin formuna göndermektir.
Python örneği
import requests
import time
API_KEY = "YOUR_API_KEY"
# Your automation only needs sitekey and pageurl
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": "6LcR_RsTAAAAAN_r0GEkGBfq3L7KmU5JbPHJtwNp",
"pageurl": "https://staging.example.com/qa-login",
"json": 1,
})
task_id = submit.json()["request"]
# Poll for token
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:
token = result["request"]
# Submit this token to the target site's form
print("Token received — submit to target form")
break
Node.js örneği
const axios = require("axios");
async function solveRecaptcha(sitekey, pageurl) {
const API_KEY = "YOUR_API_KEY";
const { data: submit } = await axios.post(
"https://ocr.captchaai.com/in.php",
new URLSearchParams({
key: API_KEY,
method: "userrecaptcha",
googlekey: sitekey,
pageurl: pageurl,
json: 1,
})
);
const taskId = submit.request;
for (let i = 0; i < 60; i++) {
await new Promise(r => setTimeout(r, 5000));
const { data: result } = await axios.get(
"https://ocr.captchaai.com/res.php",
{ params: { key: API_KEY, action: "get", id: taskId, json: 1 } }
);
if (result.status === 1) return result.request;
}
throw new Error("Timeout");
}
Sık sorulan sorular
reCAPTCHA neden ben daha tıklamadan puanımı düşürüyor?
Çünkü reCAPTCHA onay kutusuna dokunmanızı beklemez; sayfa yüklenir yüklenmez ortam taramasını ve davranış sinyallerini toplar. ChromeDriver bayrağı, eksik tarayıcı API'leri veya düz çizgi fare hareketleri, siz hiçbir şey yapmadan puanınızı 0,1 seviyesine indirebilir.
Headless modu kapatmak algılamayı önler mi?
Hayır. Headless'ı kapatmak yalnızca birinci katmanın bir kısmını hafifletir; canvas/WebGL, davranış analizi, TLS imzası ve IP itibarı katmanları çalışmaya devam eder. Görünür bir Chrome penceresi bile ChromeDriver imzasıyla yakalanır.
reCAPTCHA v3 puanım sürekli düşükse ne yapmalıyım?
Puanı doğrudan yükseltmenin kesin bir yolu yoktur; puan Google'ın risk analizine bağlıdır. Üretimde daha kararlı yaklaşım, CAPTCHA çözümünü tarayıcınızın dışına ayrı bir çözücü ortamına taşımaktır.
API çözücü kullanmak KVKK açısından sorun oluşturur mu?
CAPTCHA çözmenin kendisi kişisel veri işlemez. Ancak işlediğiniz kişisel veriler Türkiye'de KVKK kapsamına girer; API tabanlı çözümü yalnızca yetkiniz olan QA ve veri toplama akışlarında kullanın.
CaptchaAI hangi reCAPTCHA türlerini çözüyor?
CaptchaAI, reCAPTCHA'nın ana varyantlarını çözer: reCAPTCHA v2, görünmez v2, v2 callback, reCAPTCHA v2/v3 Enterprise ve reCAPTCHA v3 — tümü userrecaptcha yöntemiyle. hCaptcha ise CaptchaAI tarafından desteklenmiyor.
Özet
reCAPTCHA otomasyonu beş katmanda algılar: JavaScript ortam taraması, canvas/WebGL, davranış analizi, ağ/IP itibarı ve oturumlar arası korelasyon. CaptchaAI gibi API tabanlı çözücüler bu katmanların tamamını ayrı ve optimize edilmiş bir ortamda ele alır ve geçerli bir token döndürür. Kodunuz reCAPTCHA ile doğrudan etkileşime girmediği için, algılama sistemi sizin trafiğinizi değil çözücünün ortamını denetler.
İlgili Makaleler
- API ile reCAPTCHA v2 callback sorununu çözme
- Aynı sayfada reCAPTCHA v2 ve Turnstile'ı birlikte ele alma
- reCAPTCHA Enterprise değerlendirme API'sine ayrıntılı bakış