Integrations

undetected-chromedriver ile CAPTCHA Çözme ve CaptchaAI Entegrasyonu

undetected-chromedriver CAPTCHA çözmez — CAPTCHA'nın ne sıklıkta karşınıza çıkacağını düşürür. Çıkan doğrulamayı kapatmak ikinci bir katmanın işidir: sayfadaki sitekey değerini okur, CaptchaAI API'ye gönderir, dönen token'ı forma yazarsınız. Bu rehber tam olarak o ikinci katmanı, çalışan Python koduyla kuruyor.

Ayrımı baştan netleştirmekte fayda var, çünkü bu akıştaki hataların çoğu iki katmanın birbirine karıştırılmasından çıkıyor:

  • undetected-chromedriver — Selenium'un ChromeDriver'ını yamalayan ve Chrome sürüm eşleştirmesini kendisi yöneten bir Python kütüphanesi. İşi tarayıcı tarafındadır.
  • CaptchaAI — sunucu tarafında çalışır ve size sayfaya enjekte edilebilir bir token döndürür.

Birini diğerinin yerine koymaya çalışırsanız akış er ya da geç kilitlenir. İkisini doğru sırayla dizmek ise, aşağıdaki üç adımdan ibaret.


undetected-chromedriver kurulumu: üç gereksinim, tek komut

Başlamadan önce elinizde şunlar olmalı:

Gereksinim Ayrıntı
CaptchaAI API anahtarı captchaai.com
Python 3.8+
Chrome tarayıcı Sisteminizde kurulu olmalı

Bağımlılıkları kurun:

pip install undetected-chromedriver requests

Tarayıcı örneğini webdriver.Chrome yerine uc.Chrome üzerinden açarsınız. Aşağıdaki yardımcı fonksiyon temiz bir yapılandırmayla bir tarayıcı örneği döndürür; --no-sandbox ve pencere boyutu dışında özel bir ayara gerek yoktur:

import undetected_chromedriver as uc
import requests
import time


def create_stealth_browser():
    """Create an undetected Chrome browser instance."""
    options = uc.ChromeOptions()
    options.add_argument("--no-sandbox")
    options.add_argument("--window-size=1920,1080")

    driver = uc.Chrome(options=options)
    return driver

reCAPTCHA v2 çözümü: sitekey, görev, enjeksiyon

Akış üç adımdır ve sırası değişmez: sitekey'i sayfadan okuyun, CaptchaAI'ye gönderip token'ı sorgulayın, token'ı sayfaya yazın.

Zamanlama uyarısı: token'ın geçerlilik süresi kısadır. Çözüm elinize geçtikten sonra formu birkaç saniye içinde gönderin; aksi halde token'ın süresi dolar ve enjeksiyon boşa gider.

Adım 1: sitekey'i sayfadan çıkarın

reCAPTCHA v2 widget'larının çoğu data-sitekey özniteliğini taşır. Öznitelik yoksa fonksiyon yedek yola geçer ve iframe'in src değerindeki k= parametresini okur:

API_KEY = "YOUR_API_KEY"


def extract_recaptcha_sitekey(driver):
    """Extract reCAPTCHA v2 sitekey from the page."""
    try:
        element = driver.find_element("css selector", "[data-sitekey]")
        return element.get_attribute("data-sitekey")
    except Exception:
        # Try finding in iframe src
        iframes = driver.find_elements("css selector", "iframe[src*='recaptcha']")
        for iframe in iframes:
            src = iframe.get_attribute("src")
            if "k=" in src:
                return src.split("k=")[1].split("&")[0]
    return None

Adım 2: görevi gönderin ve sonucu sorgulayın

Görevi in.php uç noktasına userrecaptcha yöntemiyle gönderin, dönen görev kimliğini res.php üzerinden periyodik olarak sorgulayın. CAPCHA_NOT_READY yanıtı geldiği sürece kısa aralıklarla yeniden deneyin — ama döngüyü sonsuz bırakmayın, bir üst sınır koyun:

def solve_recaptcha_v2(sitekey, pageurl):
    """Submit reCAPTCHA v2 to CaptchaAI and return the token."""
    submit = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": pageurl,
        "json": 1
    }).json()

    if submit.get("status") != 1:
        raise RuntimeError(f"Submit error: {submit.get('request')}")

    task_id = submit["request"]

    time.sleep(20)
    for _ in range(30):
        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:
            return result["request"]
        if result.get("request") != "CAPCHA_NOT_READY":
            raise RuntimeError(f"Solve error: {result['request']}")
        time.sleep(5)

    raise TimeoutError("Solve timed out")

Adım 3: token'ı forma yazın

Çözülen token gizli g-recaptcha-response alanına yazılır. Bazı sayfalar bunun ardından bir callback bekler; ikinci betik ___grecaptcha_cfg üzerinden bu callback'i güvenli biçimde çağırır:

def inject_recaptcha_token(driver, token):
    """Inject the solved token into the page and submit."""
    driver.execute_script(f'''
        document.getElementById("g-recaptcha-response").innerHTML = "{token}";
        document.getElementById("g-recaptcha-response").style.display = "block";
    ''')

    # If there's a callback function, trigger it
    driver.execute_script(f'''
        if (typeof ___grecaptcha_cfg !== 'undefined') {{
            var clients = ___grecaptcha_cfg.clients;
            for (var key in clients) {{
                var client = clients[key];
                if (client && client.callback) {{
                    client.callback("{token}");
                }}
            }}
        }}
    ''')

Uçtan uca örnek: undetected-chromedriver ile CAPTCHA çözme

Aşağıdaki betik yukarıdaki parçaları tek bir çalıştırılabilir akışta topluyor:

  1. Tarayıcıyı açar ve bir QA staging giriş sayfasına gider.
  2. Form alanlarını doldurur ve sitekey'i okur.
  3. CaptchaAI ile çözer, token'ı enjekte eder ve formu gönderir.

finally bloğundaki driver.quit() çağrısını silmeyin — uzun koşularda açık kalan Chrome örnekleri makine belleğini tüketen en yaygın sebeptir.

import undetected_chromedriver as uc
import requests
import time

API_KEY = "YOUR_API_KEY"


def solve_recaptcha(sitekey, pageurl):
    submit = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY, "method": "userrecaptcha",
        "googlekey": sitekey, "pageurl": pageurl, "json": 1
    }).json()

    if submit.get("status") != 1:
        raise RuntimeError(f"Submit error: {submit.get('request')}")

    task_id = submit["request"]
    time.sleep(20)

    for _ in range(30):
        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:
            return result["request"]
        if result.get("request") != "CAPCHA_NOT_READY":
            raise RuntimeError(f"Solve error: {result['request']}")
        time.sleep(5)
    raise TimeoutError("Solve timed out")


def main():
    driver = uc.Chrome()

    try:
        # Navigate to target page
        driver.get("https://staging.example.com/qa-login")
        time.sleep(3)

        # Fill in form fields
        driver.find_element("id", "username").send_keys("user")
        driver.find_element("id", "password").send_keys("pass")

        # Extract sitekey
        element = driver.find_element("css selector", "[data-sitekey]")
        sitekey = element.get_attribute("data-sitekey")
        pageurl = driver.current_url
        print(f"Sitekey: {sitekey}")

        # Solve CAPTCHA
        token = solve_recaptcha(sitekey, pageurl)
        print(f"Token: {token[:50]}...")

        # Inject token
        driver.execute_script(
            f'document.getElementById("g-recaptcha-response").innerHTML = "{token}";'
        )

        # Submit form
        driver.find_element("id", "submit-btn").click()
        time.sleep(3)

        print(f"Current URL: {driver.current_url}")
    finally:
        driver.quit()


if __name__ == "__main__":
    main()

Aynı akışta Cloudflare Turnstile

Site reCAPTCHA yerine Cloudflare Turnstile kullanıyorsa iskelet aynı kalır; yalnızca üç ayrıntı değişir:

reCAPTCHA v2 Cloudflare Turnstile
method değeri userrecaptcha turnstile
sitekey parametresi googlekey sitekey
Token'ın yazıldığı alan g-recaptcha-response cf-turnstile-response

Turnstile tipik olarak daha hızlı döndüğü için ilk beklemeyi de kısa tutabilirsiniz:

def solve_turnstile(sitekey, pageurl):
    submit = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY, "method": "turnstile",
        "sitekey": sitekey, "pageurl": pageurl, "json": 1
    }).json()

    if submit.get("status") != 1:
        raise RuntimeError(f"Submit error: {submit.get('request')}")

    task_id = submit["request"]
    time.sleep(10)

    for _ in range(30):
        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:
            return result["request"]
        if result.get("request") != "CAPCHA_NOT_READY":
            raise RuntimeError(f"Solve error: {result['request']}")
        time.sleep(5)
    raise TimeoutError("Solve timed out")


# Inject Turnstile token
def inject_turnstile_token(driver, token):
    driver.execute_script(f'''
        var input = document.querySelector('[name="cf-turnstile-response"]');
        if (input) input.value = "{token}";
    ''')

Parametrelerin tam listesi ve uç durumlar için reCAPTCHA v2 çözüm rehberine ve Cloudflare Turnstile çözüm rehberine bakabilirsiniz.


Akış bozulduğunda: sorun giderme tablosu

Bu entegrasyonda hataların çoğu iki yerden çıkar: Chrome/sürücü sürüm eşleşmesi ve token'ın sayfaya yazıldığı an. Aşağıdaki tablo, üretimde en sık gördüğümüz beş durumu ve doğrudan çözümlerini veriyor.

Sorun Sebep Çözüm
Chrome sürüm uyuşmazlığı UC eşleşen sürücüyü bulamıyor Chrome'u güncelleyin ya da uc.Chrome() içinde version_main değerini verin
CAPTCHA hâlâ görünüyor Site gelişmiş test profil yapılandırması kullanıyor Bu beklenen bir durumdur; CaptchaAI ile çözün
Token enjeksiyonu işe yaramıyor Yanlış öğe kimliği veya callback Sayfanın reCAPTCHA uygulamasını kontrol edin
WebDriverException Chrome çöktü --no-sandbox ve --disable-dev-shm-usage argümanlarını ekleyin
Sorgulama zaman aşımına düşüyor Yoğun saatlerde çözüm süresi uzadı Döngü üst sınırını artırın, hatayı yutmayın ve görevi kuyruğa geri koyun

Uzun koşularda ayrıca finally bloğundaki driver.quit() çağrısını silmeyin; açık kalan Chrome örnekleri makine belleğini tüketen en yaygın sebeptir.


Bu ikili Türkiye'de nerede kuruluyor?

Karşımıza en sık çıkan iki profil, düzenli aralıklarla çalışan test ve veri işleri etrafında toplanıyor:

Senaryo Ne oluyor Entegrasyonun katkısı
Gece çalışan e-ticaret QA'sı İstanbul'daki ekip giriş ve ödeme adımı akışını her gece uçtan uca test eder; test kullanıcısı gerçek müşteri gibi davranmadığı için form düzenli olarak reCAPTCHA gösterir ve koşu sessizce kırmızıya döner undetected-chromedriver tetiklenme sıklığını düşürür, CaptchaAI tetiklenenleri çözer; işi Europe/Istanbul dilimine kurarsanız rapor 09:00 toplantısından önce hazırdır
Freelance otomasyon teslimi Bionluk ya da Upwork üzerinden iş alan geliştirici, müşterinin kendi paneline ait yetkili veri toplama akışını teslim eder Token dönüşü akışı ayakta tutar, teslim tarihi kaymaz

İkinci senaryoda iki kural işin kapsamına dahildir: veri toplama yalnızca müşterinin erişim yetkisi bulunan kaynaklarda yapılır ve kişisel veri söz konusuysa KVKK yükümlülükleri geçerlidir. Bunları teklif aşamasında yazılı hale getirmek, teslimden sonra tartışma çıkmasını önler.


Maliyet: kaç thread gerekir?

CaptchaAI thread tabanlı fiyatlandırır, çözüm başına değil. Her plan aylık sabit bir ücret karşılığında belirli sayıda eşzamanlı thread ve thread başına sınırsız çözüm içerir; günlük kota ya da CAPTCHA türüne göre ek ücret yoktur. Ölçüt basittir: tek bir undetected-chromedriver oturumu çözüm sırasında bir thread'i meşgul eder, dolayısıyla ihtiyacınızı paralel worker sayınız belirler.

Plan Fiyat Thread Tipik kurulum
BASIC $15/ay 5 thread Tek makinede çalışan bir Selenium akışı
STANDARD $30/ay 15 thread Birkaç paralel worker'lı orta ölçekli QA işleri
ADVANCE $90/ay 50 thread Yoğun paralel toplu işlemler

USD üzerinden sabit aylık fiyatlandırma, TL kur oynaklığından bağımsız bir bütçe planlaması demektir: worker sayınızı artırmadığınız sürece aylık gideriniz değişmez. Güncel değerler için captchaai.com üzerindeki fiyatlandırma sayfasına bakın.

Kod yazmadan önce tür matrisini de kontrol edin. Bu akışta çözülebilen türler: reCAPTCHA v2 (görünür ve görünmez), reCAPTCHA v3, Cloudflare Turnstile ve Cloudflare doğrulama akışı, GeeTest v3, görüntü/OCR ve grid tabanlı CAPTCHA'lar ile BLS. CaptchaFox (beta), Friendly Captcha (beta) ve Lemin (beta) ise beta aşamasındadır. hCaptcha ve FunCaptcha desteklenmiyor; GeeTest v4 için yalnızca "çok yakında" bilgisi var. Hedef sitedeki widget bu listede yoksa, entegrasyonu kurmadan önce türü doğrulayın.


Sık sorulan sorular

CAPCHA_NOT_READY yanıtı bir hata mı?

Hayır, normal akışın parçası. Görevin henüz tamamlanmadığı anlamına gelir; birkaç saniye bekleyip yeniden sorgulayın. Yanıt bundan farklı bir metinse gerçek bir hata kodudur ve döngüyü orada kırmanız gerekir.

Aynı betikte hem reCAPTCHA hem Turnstile'ı yönetebilir miyim?

Evet. Sayfada hangi widget'ın bulunduğuna bakıp method değerini userrecaptcha veya turnstile olarak seçin; sorgulama döngüsü ve token yazma mantığı ortaktır, yalnızca hedef alan adı (g-recaptcha-response ya da cf-turnstile-response) değişir.

CaptchaAI hCaptcha'yı çözüyor mu?

Hayır. hCaptcha ve FunCaptcha şu anda desteklenmiyor. Desteklenen türler reCAPTCHA v2/v3, Cloudflare Turnstile ve doğrulama akışı, GeeTest v3, görüntü/OCR, grid ve BLS'tir; CaptchaFox, Friendly Captcha ve Lemin beta aşamasındadır.

Sunucuda görünür Chrome yoksa ne yapmalıyım?

Linux sunucularda --headless=new ile Chrome'un yeni headless modunu kullanın; alternatif olarak xvfb altında görünür modda çalıştırabilirsiniz. İki seçenek arasında CAPTCHA tetiklenme sıklığı farklı olabilir, bu yüzden kendi hedefinizde ölçüp karar verin.


API anahtarınızı alın

API anahtarınızı captchaai.com üzerinden alın, yukarıdaki çözüm fonksiyonunu mevcut Selenium akışınıza ekleyin ve ilk token'ınızı dakikalar içinde üretin.


İlgili rehberler

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