Integrations

undetected-chromedriver ile CAPTCHA Çözme ve CaptchaAI Entegrasyonu

Selenium otomasyonunuz aynı sitede sürekli bir CAPTCHA duvarına mı takılıyor? İki katmanlı bir yaklaşım işi kalıcı olarak çözer: undetected-chromedriver bot algılama sinyallerini azaltarak CAPTCHA'ların daha seyrek çıkmasını sağlar, çıkanları da CaptchaAI API'ye gönderip geri dönen token'ı sayfaya enjekte edersiniz.

undetected-chromedriver, Selenium'un ChromeDriver'ını yamalayan bir Python kütüphanesidir. Chrome sürüm eşleştirmesini kendisi yönetir ve sitelerin kontrol ettiği bir dizi otomasyon işaretini temizler. Ama hiçbir yama %100 değildir; site yine de bir doğrulama gösterdiğinde, onu çözecek ikinci bir katmana ihtiyacınız olur. Bu rehber iki aracı tek bir akışta birleştirir.


undetected-chromedriver ve CaptchaAI birlikte neyi çözer?

Türkiye'deki otomasyon geliştiricileri bu ikiliye tipik olarak iki senaryoda ihtiyaç duyar. Birincisi, bir e-ticaret ekibinin kendi giriş ve ödeme adımı akışlarını düzenli olarak uçtan uca test etmesi; ikincisi, bir freelance geliştiricinin müşteri için hazırladığı yetkili veri toplama işinin oturum sayfasında sürekli CAPTCHA'yla karşılaşması. Her iki durumda da amaç aynıdır: otomasyonun kesintisiz ve tekrarlanabilir çalışması.

Tek başına undetected-chromedriver yalnızca ilk savunma hattıdır — CAPTCHA'ların ne sıklıkta tetikleneceğini düşürür, ama tetiklenenleri çözmez. CaptchaAI ise ikinci hattı kapatır ve API üzerinden şu türleri çözüp size enjekte edilebilir bir token döndürür:

  • reCAPTCHA v2 (görünür ve görünmez) ve reCAPTCHA v3
  • Cloudflare Turnstile ve Cloudflare doğrulama akışı
  • GeeTest v3 ile görüntü/OCR tabanlı CAPTCHA'lar

İki katmanı birleştirmek, uzun süren otomasyon koşularında başarısız çalışma sayısını gözle görülür biçimde azaltır. hCaptcha ise şu anda desteklenmez; kod örnekleriniz yalnızca yukarıdaki türlere dayanmalıdır.

Maliyet tarafı Türkiye'deki geliştiriciler için bir avantajdır: CaptchaAI thread tabanlı fiyatlandırır, TL kuruna değil. BASIC ($15/ay, 5 thread) tek makinede çalışan bir Selenium akışı için genellikle fazlasıyla yeterlidir; her plan thread başına sınırsız çözüm içerir.


Başlamadan önce: gereksinimler

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ıyı hazırlama

undetected-chromedriver, standart Selenium'daki webdriver.Chrome yerine geçer. 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'yi adım adım çözme

Akış üç adımdan oluşur: sitekey'i sayfadan okuyun, CaptchaAI'ye gönderip token'ı sorgulayın, ardından token'ı sayfaya enjekte edin. Adımların sırasını koruyun.

İpucu: token'ın kısa bir geçerlilik süresi vardır. Çözümü aldıktan sonra formu birkaç saniye içinde gönderin; aksi halde token süresi dolar ve enjeksiyon işe yaramaz.

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

Çoğu reCAPTCHA v2 widget'ı data-sitekey özniteliğini taşır. Öznitelik bulunamazsa fonksiyon, iframe'in src değerinden k= parametresini okumaya geçer:

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: CaptchaAI API'ye gönderin ve token'ı 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ı geldikçe kısa aralıklarla yeniden deneyin:

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'ı sayfaya enjekte edin

Çözülen token'ı gizli g-recaptcha-response alanına yazın. Bazı sayfalarda ayrıca bir callback fonksiyonunun tetiklenmesi gerekir; ikinci betik bunu 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}");
                }}
            }}
        }}
    ''')

Tam örnek: reCAPTCHA korumalı girişte oturum açma

Aşağıdaki betik parçaları tek bir çalıştırılabilir akışta birleştirir: tarayıcıyı açar, bir QA staging giriş sayfasına gider, form alanlarını doldurur, sitekey'i okur, CaptchaAI ile çözer ve token'ı enjekte ederek formu gönderir.

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()

Cloudflare Turnstile'ı çözme

Site reCAPTCHA yerine Cloudflare Turnstile kullanıyorsa akış neredeyse aynıdır; yalnızca method değeri turnstile olur ve sitekey sitekey parametresiyle gönderilir. Token, cf-turnstile-response adlı gizli alana yazılır:

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}";
    ''')

Adım adım parametre ayrıntıları için reCAPTCHA v2 çözüm rehberine ve Cloudflare Turnstile çözüm rehberine bakabilirsiniz.


Sık karşılaşılan sorunlar

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

Maliyet ve ölçeklendirme

CaptchaAI thread tabanlı çalışır: 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 sunar; günlük kota ya da CAPTCHA türüne göre ek ücret yoktur. Tek bir undetected-chromedriver oturumu genellikle bir thread'i meşgul eder, dolayısıyla ihtiyacınızı paralel worker sayısı belirler:

  • BASIC ($15/ay, 5 thread) — tek makinede çalışan bir Selenium akışı için yeterli.
  • 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 sabit aylık fiyatlandırma, TL kur oynaklığına maruz kalmadan bütçe planlamayı kolaylaştırır; güncel değerler için captchaai.com üzerindeki fiyatlandırma sayfasına bakın.


Sık sorulan sorular

Chrome sürümü UC ile uyuşmuyorsa ne yapmalıyım?

En sık karşılaşılan hata budur. Chrome'u en güncel sürüme çekin; sabit bir sürüm gerekiyorsa uc.Chrome(version_main=126) gibi ana sürüm numarasını doğrudan verin. undetected-chromedriver eşleşen sürücüyü kendisi indirir.

CaptchaAI reCAPTCHA v3 ve Turnstile'ı da çözüyor mu?

Evet. reCAPTCHA v2 ve v3, Cloudflare Turnstile ile Challenge ve GeeTest v3 desteklenir; aynı in.php/res.php akışında yalnızca method değeri değişir. hCaptcha şu anda desteklenmiyor.

Token'ı enjekte ettim ama form gönderilmiyor, sebebi ne?

Genellikle sayfa, token yazıldıktan sonra bir callback bekliyordur. Adım 3'teki ikinci betik ___grecaptcha_cfg üzerinden callback'i tetikler; yine de gönderilmiyorsa gönderim düğmesinin JavaScript ile mi tetiklendiğini kontrol edin ve elemanı doğrudan tıklayın.

headless modda daha fazla CAPTCHA mı çıkıyor?

Olabilir — headless oturumlar bazı sitelerde daha fazla doğrulama tetikler. Gerekiyorsa options.add_argument("--headless=new") ile Chrome'un yeni headless modunu kullanın; görünür moda kıyasla davranış farkını her zaman ölçün.

Bunu Selenium Grid ile dağıtık olarak kullanabilir miyim?

Evet, ancak undetected-chromedriver yerel sürücü ikilisini yamalar. Dağıtık kurulumlarda her düğümdeki sürücüye önceden yama uygulayın; aksi halde bazı düğümler standart ChromeDriver'a düşer.


API anahtarınızı alın

API anahtarınızı captchaai.com üzerinden alın, örnek kodu akışınıza yapıştırın ve ilk token'ınızı dakikalar içinde görün. Görünür CAPTCHA'ları güvenilir çözümle birleştirerek otomasyonunuzu kesintisiz çalıştırın.


İlgili rehberler

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