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:
- Sayfayı yükleyin ve widget'ın render edilmesini bekleyin.
- Widget'tan
data-sitekeyözniteliğini okuyun. - API'den bir token alın ve formun içine koyun.
- 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:
- Widget bir textarea oluşturmuşsa onu yeniden kullanır.
- Sayfa oluşturmamışsa bir tane oluşturur ve forma ekler.
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
- Widget hiç görünmüyor. Bekleme süresini artırın ya da widget'ın bir iframe içinde olup olmadığını kontrol edin. Öyleyse önce
driver.switch_to.frame(...)ile çerçeveye geçin. - Form gönderiliyor ama site token'ı reddediyor. Token'ı widget'ın gösterildiği sayfaya gönderdiğinizi kontrol edin.
driver.current_url, sorgu dizesi dahil sayfanın gerçek URL'siyle eşleşmelidir. - Token süresi doldu.
solveçağrısını gönderim adımına yaklaştırın. Token yaklaşık iki dakika yaşar. - API'den zaman aşımı hatası. Betikteki gibi yaklaşık 185 saniyelik bir zaman aşımı kullanın. Yeniden deneme mantığı captcha çözücü hata yönetimi sayfasında ele alınır.
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.