Explainers

reCAPTCHA, Otomasyonu Nasıl Algılar ve API Çözücüler Nasıl Çalışır?

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
// 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.chrome gerçek tarayıcıda nesnedir; headless'ta tanımsız veya eksiktir
  • navigator.plugins gerçek tarayıcıda 2-5 eklenti taşır; headless'ta boş dizidir
  • navigator.permissions query() içerir; headless'ta hata verebilir veya eksiktir
  • Notification.permission beklenen "default" yerine hata verir; window.speechSynthesis boş 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

Bu makale için yorumlar devre dışı bırakılmıştır.