Scarnox · Blog

Python ile Selenium captcha çözücü: çalışan örnek (2026)

Selenium gerçek bir tarayıcı çalıştırır; sayfa render edilir ve betikleri bir insanın göreceği gibi çalışır. Selenium'un yapamadığı tek adım PopularCaptcha widget'ını çözmektir. Bu rehber o adımı ekler: sitekey'i render edilmiş sayfadan okuyun, tek bir API çağrısıyla bir token alın, token'ı forma yazın ve gönderin.

Captcha'yı proxysiz bir PopularCaptcha çözümüyle ele alır; Scarnox bugün bunu çözer. Ücretsiz deneme kredisiyle başlayın, kart gerekmez ve betiği önce bir test formunda deneyin.

Selenium'un yapması gerekenler

Akışın dört parçası vardır:

  1. Sayfayı yükleyin ve widget'ın render edilmesini bekleyin.
  2. Widget'tan data-sitekey özniteliğini okuyun.
  3. API'den bir token alın ve formun içine koyun.
  4. Token süresi dolmadan formu gönderin.

Captcha'ya dokunan tek adım üçüncüsüdür. Geri kalan her şey normal Selenium işidir.

Paketleri kurun

pip install selenium requests

Selenium 4.6 ve sonrası uyumlu bir ChromeDriver'ı kendisi bulur; driver'ı elle indirmeniz gerekmez.

Tam betik

import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait

API_KEY = "scarnox_YOURAPIKEY"
API_URL = "https://api.scarnox.com/api/tasks/create"
PAGE_URL = "https://example.com/signup"


def solve(sitekey: str, page_url: str, invisible: bool = False) -> str:
    body = {
        "captcha_type": "PopularCaptchaTaskProxyless",
        "site_key": sitekey,
        "site_url": page_url,
    }
    if invisible:
        body["is_invisible"] = True

    r = requests.post(
        API_URL,
        headers={"Authorization": f"Bearer {API_KEY}"},
        json=body,
        timeout=185,  # token hazır olana kadar bloklar
    )
    data = r.json()
    if data.get("errorId") != 0:
        raise RuntimeError(f"{data.get('errorCode')}: {data.get('errorDescription')}")
    return data["solution"]["token"]


INJECT_TOKEN_JS = """
const token = arguments[0];
let field = document.querySelector('[name="h-captcha-response"]');
if (!field) {
    field = document.createElement("textarea");
    field.name = "h-captcha-response";
    field.style.display = "none";
    document.querySelector("form").appendChild(field);
}
field.value = token;
let extra = document.querySelector('[name="g-recaptcha-response"]');
if (!extra) {
    extra = document.createElement("textarea");
    extra.name = "g-recaptcha-response";
    extra.style.display = "none";
    document.querySelector("form").appendChild(extra);
}
extra.value = token;
"""


def main() -> None:
    driver = webdriver.Chrome()
    try:
        driver.get(PAGE_URL)

        widget = WebDriverWait(driver, 15).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, "[data-sitekey]"))
        )
        sitekey = widget.get_attribute("data-sitekey")
        invisible = widget.get_attribute("data-size") == "invisible"

        token = solve(sitekey, driver.current_url, invisible=invisible)

        # Önce formun diğer alanlarını doldurun, sonra token'ı gönderimden hemen önce yazın,
        # çünkü token yaklaşık iki dakika sonra sona erer.
        driver.find_element(By.NAME, "email").send_keys("you@example.com")
        driver.execute_script(INJECT_TOKEN_JS, token)

        driver.find_element(By.CSS_SELECTOR, "form button[type=submit]").click()
        WebDriverWait(driver, 15).until(EC.url_changes(PAGE_URL))
        print("Submitted. Now at:", driver.current_url)
    finally:
        driver.quit()


if __name__ == "__main__":
    main()

Proxysiz bir PopularCaptcha çözümü için betiğin proxy'ye ihtiyacı yoktur. Proxy alanını çıkarın ve sitenin normal bağlantınızı görmesine izin verin.

Işlem sırası, en sık yanlış giden kısımdır. Önce formun geri kalanını doldurun, sonra çözün, sonra token'ı yazın, sonra tıklayın. Yavaş bir sayfa ya da yavaş bir form yüzünden çözümle diğer alanları yazmanız arasında uzun süre geçerse, gönderim token'ın ömrünü aşabilir. Çözüm ile tıklama arasındaki boşluğu olabildiğince kısa tutun ve doğrulamadan önce sonuç sayfasında bir hata olup olmadığını kontrol edin.

Token neden JavaScript ile yazılır?

Çoğu PopularCaptcha widget'ı bir insan çözdüğünde token'ı h-captcha-response adlı gizli bir textarea'ya yazar. Selenium bir insanı görmediği için betik aynı alanı kendisi yazar. INJECT_TOKEN_JS parçası iki şey yapar:

Ayrıca g-recaptcha-response alanını da doldurur, çünkü birçok site uyumluluk için bu adı okur.

Görünmez widget'lar

Görünmez bir widget'ta onay kutusu yoktur. Arka planda çalışır ve genellikle form gönderildiğinde tetiklenir. Betik data-size="invisible" değerini kontrol eder ve gördüğünde is_invisible: true gönderir. Bazı siteler widget'a bir JavaScript callback'i de bağlar. Token'ı yazdıktan sonra form yerinde kalıyorsa, bir data-callback özniteliği arayın ve o fonksiyonu token ile çağırın. Bu durum için görünmez captcha rehberimize bakın.

Testlerde kullanmak

Selenium, uçtan uca testler için de yaygın olarak kullanılan araçtır. Kendi staging sitenizde bir captcha çıkıyorsa, aynı kod bir testin onu geçmesini sağlar. Test ortamını üretimden ayrı tutun ve sahibi olmadığınız sitelerde çalıştırmayın. Test paketleri için kurulum testlerde captcha sayfasındadır.

Yaygın sorunlar

Fiyatlandırma

Başarılı çözüm başına ödeme yaparsınız; başarısız çözümler ücretlendirilmez. Oranlar için güncel fiyatlandırma sayfasına bakın ve ücretsiz deneme kredisiyle başlayın, kart gerekmez.

Sonraki adımlar