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

hrequests captcha - How to Solve CAPTCHAs in hrequests (Python TLS Client)

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 session

Bu 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 istiyorsunuzBunu hangi araç yapar
Birkaç sayfa getirme, gönderilip sonra okunannohup değerini true olarak geçirin, sonra ihtiyacınız olduğunda bir özniteliği okuyun
Tek çağrıda bir URL listesiListeyi doğrudan istek yöntemine verin
Eşzamanlılık sınırıyla çok sayıda istekGö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üzNedenDüzeltme
SDK'dan NetworkExceptionCapSkip çalışmıyor ya da bu makineden erişilebilir değilBaşlatın ya da Server moduna geçip host değerini ayarlayın
Token yazılıyor ama widget çözülmemiş kalıyorCamoufox’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 MissingLibraryExceptionhrequests, browser ekstrası olmadan kurulmuşEkstrayı kurun, ardından hrequests’in kurulum komutunu çalıştırın
Doğru bir token site tarafından reddediliyorGönderim farklı bir oturum veya istemci üzerinden çıktıSayfayı getiren oturum üzerinden gönderin
Doğru bir token uzun bir aradan sonra reddediliyorGönderilmeden önce süresi dolduÇözün ve arada hiçbir şey olmadan art arda gönderin
Yanıtta ERROR_GOOGLEKEYSayfadan ayrıştırılan sitekey, widget'ın içindekiyle aynı değilBir script etiketi yerine data-sitekey özniteliğini okuyun
300 saniye sonra TimeoutExceptionsitekey ile sayfa URL'si o widget'taki çift değil, bu yüzden çözüm 300 saniyelik tavana kadar sürerSitekey ile sayfa URL'sinin, widget'ın gerçekten kullandığı çift olduğunu kontrol edin
Tarayıcı oturumu hiç serbest bırakılmıyorBağ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.

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.