hrequests'te CAPTCHA Nasıl Çözülür (Python TLS İstemcisi)

Bir hrequests captcha çözümü kısadır, çünkü CAPTCHA'yı okuyan kısım hrequests değildir. İstekleri bir Go TLS istemcisi üzerinden gönderir; böylece el sıkışmanız gerçek bir Chrome veya Firefox gibi görünür ve bu da, herhangi bir doğrulama çizilmeden önce tetiklenen kontrolü geçmenizi sağlar. Site yine de bir doğrulama çizdiğinde, bir sitekey'i token'a dönüştüren bir şeye ihtiyacınız olur. Doğru yapmaya değen kısım ikisinin arasında olup bitendir: token, yeni bir oturumda değil, sayfayı getiren oturumun üzerinde geri gitmelidir.
Neye ihtiyacınız var
- Python 3.10 veya daha yenisi, hrequests kurulu olarak. Browser ekstrasını yalnızca gerçekten render etmeniz gerekiyorsa ekleyin.
- Bir Windows makinesinde çalışan CapSkip. Betik o makinede çalışıyorsa Local modu, başka bir yerde çalışıyorsa Server modu.
- Sitekey ve sayfa URL'si. Adım 1, sitekey'i sabit kodlamak yerine sayfadan çeker.
- Hedef, el sıkışmanızın yanı sıra IP'nizi de önemsiyorsa bir proxy. hrequests bunu bir URL dizesi olarak alır.
# pip install capskip pip install -U hrequests capskip # Only if you need the browser. It downloads a browser build. pip install -U hrequests[all] python -m hrequests install
İki farklı engel, iki farklı araç
Bu konuda açık sözlü olmakta fayda var, çünkü ikisi sürekli karıştırılıyor. hrequests, tarayıcı TLS parmak izlerini kopyalar ve bunlara uyan başlıklar üretir. Bir görüntüye bakmaz ve bir reCAPTCHA token'ı üretmez. CapSkip token üretir ve TLS parmak izinize dokunmaz. Bir doğrulama daha ortaya çıkmadan engellenmek bir el sıkışma sorunudur ve Python'da TLS parmak izi başlıklı yazı bunu ele alır. Bir doğrulamanın gösterilmesi ise bu sayfanın geri kalanının konusudur.
Bir tarayıcı seçmeden önce hrequests belgelerindeki bir ayrıntıyı bilmekte fayda var. Oturum oluşturma, firefox veya chrome kabul eden bir browser argümanı alır ve README’deki düz metin ile parametre tablosu, varsayılan olarak hangisini aldığınız konusunda birbiriyle çelişir. Bunu açıkça geçin, belirsizlik ortadan kalksın.
Adım 1: sayfayı getirin ve sitekey'i çekin
Çıplak bir get yerine bir oturum kullanın, çünkü çerezleri biriktiren ve token'ı içinden geri göndereceğiniz şey oturumdur. hrequests, yanıtın üzerinde hızlı bir HTML ayrıştırıcısı sunar; böylece sitekey'i tahmin etmek yerine işaretlemenin içinden okuyabilirsiniz.
# pip install hrequests
import hrequests
SITE = "https://example.com/page-with-recaptcha"
# Name the browser. Headers are generated to match it and the OS.
session = hrequests.Session(browser="chrome", os="win")
resp = session.get(SITE)
# The parser is selectolax under the hood, so this is cheap.
widget = resp.html.find(".g-recaptcha")
sitekey = widget.attrs["data-sitekey"]
print(resp.status_code, sitekey)Widget ilk HTML'de yoksa, JavaScript tarafından enjekte ediliyordur ve bir render'a ihtiyacınız vardır. Yine de birine uzanmadan önce aşağıdaki tarayıcı bölümüne atlayın, çünkü çoğu reCAPTCHA ve Turnstile widget'ı sunulan işaretlemenin içindedir ve render etmek size boşuna bir tarayıcı süreci maliyeti çıkarır.
Adım 2: CapSkip ile çözün
Tek çağrı. SDK, doğrulamayı gönderir ve yanıtı yoklar; 250 milisaniyede başlayıp geri çekilir ve bu yüzden genellikle ham API'ye karşı elle yazılmış bir döngüyü geride bırakır.
# pip install capskip from capskip import CapSkip # 127.0.0.1 only if this script runs on the solver machine. solver = CapSkip(host="127.0.0.1", port=8080) result = solver.recaptcha(sitekey=sitekey, url=SITE) token = result["code"] # the g-recaptcha-response value
CapSkip'in desteklediği diğer her tür de aynı biçimdedir. invisible veya enterprise değerini 1 yapın ya da version değerini bir action adıyla birlikte v3 yapın. Turnstile ve GeeTest'in kendi method değerleri vardır ve notlarını okumanız gereken Turnstile'dır, çünkü bir doğrulama sayfası iki ek değere ve token ile birlikte geri gelen user agent'a ihtiyaç duyar. Bu ek değerler şurada ele alınır: Cloudflare Turnstile çözücü sayfasını. Her tür için her parametre şurada listelenir: CapSkip API dokümantasyonu.
Adım 3: token'ı aynı oturumda gönderin
İnsanların yanlış yaptığı adım budur ve düz bir HTTP istemcisi yerine hrequests kullanmanın bütün nedeni de budur. Sayfayı getiren oturumun bir TLS parmak izi, üretilmiş bir başlık kümesi ve sitenin verdiği çerezler vardır. Token'ı aynı oturum üzerinden gönderin, gönderim aynı istemciden gelmiş gibi görünsün. Yeni bir oturum üzerinden ya da daha kötüsü standart kütüphane üzerinden gönderirseniz, el sıkışma akışın ortasında değişir; bu da başlı başına bir sinyaldir.
# Same session object, so the fingerprint, headers and cookies
# are the ones the site already saw on the GET.
posted = session.post(
SITE,
data={
"username": "YOUR_USERNAME",
"g-recaptcha-response": token,
},
timeout=30,
)
print(posted.status_code)
session.close()Bunu hemen yapın. Bir reCAPTCHA token'ı yaklaşık iki dakika geçerlidir; dolayısıyla çözüm ile gönderim arasına giren her şey o bütçeyi harcar. Hata biçimi, sebepsiz yere reddedilmiş bir token gibi görünür ve bununla karşılaşırsanız başka bir yerde tüm ayrıntısıyla yazılmıştır.
hrequests'te istek zaman aşımı varsayılan olarak 30 saniyedir. Burada bu yeterlidir, çünkü çözümü değil form gönderimini kapsar. Çözümün SDK içinde kendi tavanı vardır: görüntü CAPTCHA'ları için 120 saniye, reCAPTCHA, Turnstile ve GeeTest için 300 saniye.
Çözücüyü başka bir makinede çalıştırmak
Yukarıdaki host argümanı, betik ile çözücü aynı makineyi paylaşmayı bıraktığında değişen tek şeydir. CapSkip'in iki bağlantı modu vardır. Local modu 127.0.0.1'e bağlanır ve yalnızca o cihaza hizmet eder. Server modu ağ adresinize veya genel IP'nize bağlanır; böylece başka bir makinedeki bir kazıyıcı, bir VPS veya bir konteyner aynı Windows makinesine API üzerinden ulaşabilir. Her ikisi de şu bölümün altındadır: bağlantı ayarları. Çağıran ağınızın dışındaysa statik bir genel IP edinmeye değer. Server modu yalnızca çözücünün hangi adreste dinlediğini değiştirir: aynı donanım, aynı makine, aynı sayaçsız çözüm.
import os
from capskip import CapSkip
# Same script on a laptop and on a scraping box. The env var
# decides; CAPSKIP_HOST and CAPSKIP_PORT are read by the SDK too.
solver = CapSkip(
host=os.environ.get("CAPSKIP_HOST", "127.0.0.1"),
port=8080,
)Proxy'ler burada bir iki söz etmeye değer, çünkü hrequests ve CapSkip onları ayrı ayrı alır. hrequests'e verdiğiniz proxy, sayfa getirmenizin nereden geldiğine karar verir. Çözücüye verdiğiniz proxy ise doğrulamanın nereden çözüldüğüne karar verir ve CapSkip bunu reCAPTCHA, Turnstile ve GeeTest için kabul eder, görüntü CAPTCHA'ları için etmez. İkisini eşleştirmek, bir token'ı bir adrese bağlayan sitelerde önemlidir ve gerekçesi şurada anlatılır: CAPTCHA proxy rotasyonu kılavuzu.
Tarayıcıya gerçekten ne zaman ihtiyacınız olur ve içindeki tuzak
hrequests, bir render çağrısıyla bir yanıtı gerçek bir tarayıcıya devredebilir ve cazibesi, çerezlerin her iki yönde de aktarılmasıdır: tarayıcı oturumu, hrequests’in oturum çerezlerini devralır ve sayfayı kapatmak yenilerini geri birleştirir. Bu, bir şeye tıklaması gereken bir akış için gerçekten kullanışlıdır.
İşte insanlara bir öğleden sonrasına mal olan kısım. hrequests'teki Firefox motoru Camoufox'tur, doğrudan Camoufox Python paketinden başlatılır ve Camoufox sayfa betiklerini yalıtılmış bir kapsamda çalıştırır. Yalıtılmış bir kapsam DOM'u okuyabilir ama değiştiremez; dolayısıyla token'ı yanıt textarea'sına yazan bir betiği çalıştırmak gibi bariz bir hamle sessizce hiçbir şey yapmaz. hrequests, bir betik ve bir argüman alan düz bir evaluate sunar; main world istemenin bir yolu yoktur.
Çıkış yolu şudur: hrequests, fazladan anahtar kelime argümanlarını doğrudan Camoufox'a iletir; böylece Camoufox’un kendi anahtarı size açıktır. Başlatma sırasında main world değerlendirmesini açın, ardından betiğe ön ek koyun.
import hrequests
# The kwargs go through to Camoufox. Without main_world_eval the
# write below is discarded and nothing tells you.
page = hrequests.BrowserSession(headless=True, main_world_eval=True)
page.goto(SITE)
SCRIPT = (
"mw:(t) => { "
"document.getElementById('g-recaptcha-response').value = t; }"
)
# The second argument arrives as t inside the function.
page.evaluate(SCRIPT, token)
page.click("#submit")
page.close() # merges cookies back into the sessionBu sorunun tamamından kaçınmanın iki yolu var. Sıradan Playwright semantiğine sahip olan Chrome motorunu kullanın; bunun bedeli, hrequests'in yalnızca Firefox'un desteklediğini söylediği parmak izi rotasyonu ve insan imleci taklididir. Ya da Adım 3'ün yaptığını yapın ve hiç enjekte etmeyin: token'ı TLS oturumuna geri götürün ve formu kendiniz gönderin. Bir giriş ya da arama formu için bu hem daha basit hem daha hızlıdır ve bu kılavuzun tarayıcıyı en sona koymasının nedeni de budur. Camoufox'u hrequests üzerinden değil doğrudan sürüyorsanız, yalıtılmış kapsam davranışı ve diğer sonuçları şurada ele alınır: Camoufox CAPTCHA kılavuzu.
Aynı anda birkaç tanesini çözme
hrequests size istekleri üst üste bindirmenin üç yolunu verir, CapSkip ise çözümleri üst üste bindirmenin bir yolunu. Bunlar birlikte çalışır ama aynı şey değildir.
| Neyi üst üste bindirmek istiyorsunuz | Bunu hangi araç yapar |
|---|---|
| Birkaç sayfa getirme, gönderilip sonra okunan | nohup değerini true olarak geçirin, sonra ihtiyacınız olduğunda bir özniteliği okuyun |
| Tek çağrıda bir URL listesi | Listeyi doğrudan istek yöntemine verin |
| Eşzamanlılık sınırıyla çok sayıda istek | Gönderilmemiş istekler oluşturun, sonra bir boyut sınırıyla eşleyin |
| Aynı anda birkaç CAPTCHA çözümü | Python SDK’sının, bir takma ad değil gerçek bir uygulama olan asenkron istemcisi |
Okumaya değen satır sonuncusudur, çünkü Python, asenkron istemcinin aynı sınıfın başka bir adı değil ayrı bir uygulama olduğu tek CapSkip SDK'sıdır. Toplu işleme deseni şurada anlatılır: Python ile CAPTCHA’ları paralel çözme kılavuzu. Getirme yarısı için hrequests ile yaygın bir asenkron istemci arasında seçim yapmak ayrı bir sorudur ve httpx ve aiohttp kılavuzu ödünleşimleri ortaya koyar.
Sık görülen hatalar ve anlamları
| Gördüğünüz | Neden | Düzeltme |
|---|---|---|
| SDK'dan NetworkException | CapSkip çalışmıyor ya da bu makineden erişilebilir değil | Başlatın ya da Server moduna geçip host değerini ayarlayın |
| Token yazılıyor ama widget çözülmemiş kalıyor | Camoufox’un yalıtılmış kapsamı DOM yazma işlemini attı | main world değerlendirmesi açık olarak başlatın ve betiğe ön ek koyun |
| Bir render çağrısında MissingLibraryException | hrequests, browser ekstrası olmadan kurulmuş | Ekstrayı kurun, ardından hrequests’in kurulum komutunu çalıştırın |
| Doğru bir token site tarafından reddediliyor | Gönderim farklı bir oturum veya istemci üzerinden çıktı | Sayfayı getiren oturum üzerinden gönderin |
| Doğru bir token uzun bir aradan sonra reddediliyor | Gönderilmeden önce süresi doldu | Çözün ve arada hiçbir şey olmadan art arda gönderin |
| Yanıtta ERROR_GOOGLEKEY | Sayfadan ayrıştırılan sitekey, widget'ın içindekiyle aynı değil | Bir script etiketi yerine data-sitekey özniteliğini okuyun |
| 300 saniye sonra TimeoutException | sitekey ile sayfa URL'si o widget'taki çift değil, bu yüzden çözüm 300 saniyelik tavana kadar sürer | Sitekey ile sayfa URL'sinin, widget'ın gerçekten kullandığı çift olduğunu kontrol edin |
| Tarayıcı oturumu hiç serbest bırakılmıyor | Bağlam yöneticisi olmadan oluşturulan bir sayfa kapatılmadı | with biçimini kullanın ya da bir finally bloğunda close çağırın |
FAQ
hrequests CAPTCHA'ları kendi başına çözer mi?
Hayır. Tarayıcı TLS parmak izlerini kopyalar ve eşleşen başlıklar üretir; bu da bir doğrulama daha çizilmeden önce birçok engellemeyi durdurur, ayrıca render edilmiş bir sayfada insan fare hareketini ve yazmayı taklit edebilir. Bunların hiçbiri bozuk bir görüntüyü okumaz ya da bir reCAPTCHA token'ı üretmez. Bunlar ayrı sorunlardır ve bir çözücüye ihtiyaç duyarlar.
Browser ekstrasına gerçekten ihtiyacım var mı?
Yalnızca render etmeniz gerekiyorsa. Ekstra, tarayıcı yığınını getirir, sonrasında ayrı bir kurulum komutu ister ve büyük bir indirmedir. Yaygın akış için, yani sayfayı getir, sitekey'i oku, çöz, formu gönder akışı için düz kurulum yeterlidir ve her şey HTTP istekleri olarak çalışır. Widget gerçekten sunulan işaretlemede yoksa ya da form yalnızca gerçek tıklamalarla gönderiliyorsa ekstrayı ekleyin.
Oturum hangi tarayıcı olduğunu iddia etmeli?
Hangisini açıkça adlandırırsanız o. hrequests firefox veya chrome kabul eder ve bunlara uyan başlıklar üretir; başlık sürümünü TLS sürümüyle kasten aynı hizada tutmaz, çünkü algılama sistemlerinin ikisini nadiren ilişkilendirdiğini ve fazladan yayılmanın daha çok istemci varmış gibi göründüğünü savunur. Render için kütüphane Firefox'u önerir, çünkü oradaki Chrome ne parmak izi rotasyonunu ne de insan imleci taklidini destekler.
Çözücü, kazıyıcıdan farklı bir makinede çalışabilir mi?
Evet ve kazıma bir dizüstü bilgisayardan çıktığında normal kurulum budur. CapSkip'i Server moduna alın, böylece loopback adresi yerine ağ adresinizde veya bir genel IP'de dinlesin; sonra host argümanını ona yöneltin. Çağıran ağınızın dışındaysa statik bir genel IP önerilir. Aynı sayaçsız çözümü yapan aynı Windows makinesidir; yalnızca adres değişir.
Kısa özet
Parmak izi ve çerezler kararlı kalsın diye adlandırılmış bir oturumla getirin. Sitekey'i yanıttan yerleşik ayrıştırıcıyla okuyun. Tek bir SDK çağrısıyla çözün. Token'ı aynı oturum üzerinden hemen geri gönderin ve yalnızca widget işaretlemede yokken render edilmiş bir tarayıcıya uzanın. Render ediyorsanız, Firefox motorunun Camoufox olduğunu ve yalıtılmış bir kapsamdan yapılan bir DOM yazmasının hatasız biçimde kaybolduğunu unutmayın; bu yüzden ya main world değerlendirmesini açın ya da enjeksiyonu tamamen atlayın.
- Python SDK’sının kendisi şurada anlatılıyor: Python CAPTCHA çözücü sayfası.
- Onay kutusu doğrulaması şurada anlatılıyor: reCAPTCHA v2 çözücü sayfası.
Sık sık doğrulamayla karşılaşan bir kazıyıcıyı ölçeklendirmeden önce bilinmeye değer bir şey: CapSkip bunu captcha atlatma zaten sahip olduğunuz donanımda yapar ve size asla çözüm başına ücret çıkarmaz; dolayısıyla on doğrulamayla karşılaşan bir çalıştırma ile on bin doğrulamayla karşılaşan bir çalıştırma tam olarak aynı maliyettedir.
