Cara Memecahkan CAPTCHA di hrequests (Klien TLS Python)

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

Pemecahan captcha dengan hrequests itu singkat, karena hrequests bukan bagian yang membaca CAPTCHA-nya. Ia mengirim permintaan lewat klien TLS berbasis Go sehingga handshake Anda terlihat seperti Chrome atau Firefox sungguhan, dan itu meloloskan Anda dari pemeriksaan yang berjalan sebelum challenge apa pun digambar. Ketika situsnya tetap menggambar challenge, Anda butuh sesuatu yang mengubah sitekey menjadi token. Bagian yang penting untuk dilakukan dengan benar adalah apa yang terjadi di antara keduanya: token harus dikirim balik pada sesi yang sama yang mengambil halaman itu, bukan pada sesi baru.

Apa yang Anda butuhkan

  • Python 3.10 atau lebih baru, dengan hrequests terinstal. Tambahkan extra browser hanya jika Anda memang perlu merender.
  • CapSkip yang berjalan di komputer Windows. Mode Local jika skripnya berjalan di komputer itu, mode Server jika ia berjalan di tempat lain.
  • Sitekey dan URL halamannya. Langkah 1 menarik sitekey dari halaman alih-alih menuliskannya secara hardcode.
  • Sebuah proxy, jika target peduli pada IP Anda selain pada handshake Anda. hrequests menerimanya sebagai string URL.
# 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

Dua jenis blokir berbeda, dua alat berbeda

Ini perlu dikatakan terus terang, karena keduanya terus-menerus tertukar. hrequests mereplikasi TLS fingerprint browser dan menghasilkan header yang cocok. Ia tidak melihat gambar dan tidak menghasilkan token reCAPTCHA. CapSkip menghasilkan token dan tidak menyentuh TLS fingerprint Anda. Diblokir sebelum sebuah challenge muncul adalah masalah handshake, dan panduan tentang TLS fingerprinting di Python adalah ulasan lengkap untuk hal itu. Sementara ditampilkannya sebuah challenge adalah pokok bahasan selebihnya di halaman ini.

Satu detail dari dokumentasi hrequests layak diketahui sebelum Anda memilih browser. Pembuatan sesi menerima argumen browser yang menerima firefox atau chrome, dan bagian prosa README serta tabel parameternya saling bertentangan soal mana yang Anda dapat secara default. Berikan nilainya secara eksplisit dan ambiguitas itu hilang.

Langkah 1: ambil halaman dan tarik sitekey-nya

Gunakan sesi, bukan get polos, karena sesi itulah yang mengumpulkan cookie dan yang nanti Anda pakai untuk mengirim token kembali. hrequests menyertakan parser HTML cepat pada responsnya, sehingga Anda bisa membaca sitekey dari markup alih-alih menebaknya.

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

Jika widget-nya tidak ada di HTML awal, berarti ia disuntikkan oleh JavaScript dan Anda butuh render. Namun bacalah dulu bagian browser di bawah sebelum memakainya, karena sebagian besar widget reCAPTCHA dan Turnstile ada di markup yang dikirim server dan merender berarti membayar satu proses browser tanpa alasan.

Langkah 2: pecahkan dengan CapSkip

Satu panggilan. SDK mengirim challenge-nya dan melakukan polling untuk jawabannya, mulai dari 250 milidetik lalu melambat secara bertahap, dan itulah sebabnya ia biasanya mengalahkan loop buatan tangan terhadap API mentah.

# 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

Setiap jenis lain yang didukung CapSkip berbentuk sama. Tambahkan invisible atau enterprise yang diatur ke 1, atau version yang diatur ke v3 dengan nama action. Turnstile dan GeeTest punya method-nya sendiri, dan Turnstile adalah yang catatannya perlu Anda baca, karena halaman challenge membutuhkan dua nilai tambahan dan user agent yang ikut kembali bersama token. Nilai tambahan itu dibahas di halaman pemecah Cloudflare Turnstile. Setiap parameter untuk setiap jenis tercantum di dokumentasi API CapSkip.

Langkah 3: kirim token pada sesi yang sama

Inilah langkah yang sering salah dilakukan orang, dan inilah seluruh alasan memakai hrequests daripada klien HTTP biasa. Sesi yang mengambil halaman itu punya TLS fingerprint, kumpulan header yang dihasilkan dan cookie apa pun yang diberikan situs. Kirim token lewat sesi yang sama dan pengirimannya akan tampak berasal dari klien yang sama. Kirim lewat sesi baru, atau lebih buruk lagi lewat pustaka standar, dan handshake-nya berubah di tengah alur, yang itu sendiri sudah menjadi sinyal.

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

Lakukan segera. Token reCAPTCHA berlaku sekitar dua menit, jadi apa pun yang menyela antara pemecahan dan pengiriman akan menghabiskan jatah itu. Mode kegagalannya terlihat seperti token yang ditolak tanpa alasan, dan hal itu diuraikan lengkap di tempat lain kalau Anda mengalaminya.

Batas waktu permintaan pada hrequests secara default 30 detik. Itu cukup di sini, karena angka itu mencakup pengiriman formulir dan bukan pemecahannya. Pemecahan punya batas atasnya sendiri di SDK: 120 detik untuk CAPTCHA gambar dan 300 detik untuk reCAPTCHA, Turnstile dan GeeTest.

Menjalankan solver di mesin lain

Argumen host di atas adalah satu-satunya hal yang berubah ketika skrip dan pemecah tidak lagi berbagi satu komputer. CapSkip punya dua mode koneksi. Local mengikat ke 127.0.0.1 dan hanya melayani perangkat itu. Server mengikat ke alamat jaringan atau IP publik Anda, sehingga scraper di mesin lain, sebuah VPS atau sebuah container bisa menjangkau komputer Windows yang sama lewat API. Keduanya ada di bawah pengaturan koneksi, dan IP publik statis layak dimiliki jika pemanggilnya berada di luar jaringan Anda. Mode Server hanya mengubah di alamat mana pemecah mendengarkan: perangkat keras yang sama, komputer yang sama, pemecahan tanpa batas yang sama.

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 layak dibahas sedikit di sini, karena hrequests dan CapSkip menerimanya secara terpisah. Proxy yang Anda berikan ke hrequests menentukan dari mana pengambilan halaman Anda berasal. Proxy yang Anda berikan ke pemecah menentukan dari mana challenge-nya dipecahkan, dan CapSkip menerimanya untuk reCAPTCHA, Turnstile dan GeeTest tetapi tidak untuk CAPTCHA gambar. Menyamakan keduanya penting di situs yang mengikat token ke sebuah alamat, dan alasannya dijabarkan di panduan rotasi proxy CAPTCHA.

Kapan Anda benar-benar butuh browser, dan jebakan di dalamnya

hrequests bisa menyerahkan sebuah respons ke browser sungguhan lewat panggilan render, dan daya tariknya adalah cookie berpindah dua arah: sesi browser mewarisi cookie milik sesi tadi, dan menutup halaman akan menggabungkan cookie baru kembali. Itu benar-benar berguna untuk alur yang harus mengeklik sesuatu.

Inilah bagian yang membuat orang kehilangan satu sore. Engine Firefox di hrequests adalah Camoufox, yang diluncurkan langsung dari paket Python Camoufox, dan Camoufox menjalankan skrip halaman dalam scope terisolasi. Scope terisolasi bisa membaca DOM tetapi tidak bisa mengubahnya, jadi langkah yang tampak paling jelas, yaitu mengeksekusi skrip yang menulis token ke textarea respons, sama sekali tidak berpengaruh, dan diam-diam pula. hrequests hanya menyediakan evaluate polos yang menerima sebuah skrip dan satu argumen, tanpa cara untuk meminta main world.

Jalan keluarnya adalah hrequests meneruskan argumen kata kunci tambahannya langsung ke Camoufox, sehingga sakelar milik Camoufox sendiri tersedia untuk Anda. Aktifkan main world evaluation saat peluncuran, lalu beri awalan pada skripnya.

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

Ada dua cara untuk menghindari persoalan ini sama sekali. Gunakan engine Chrome, yang memakai semantik Playwright biasa, dengan mengorbankan rotasi fingerprint dan emulasi kursor manusia yang menurut hrequests hanya didukung Firefox. Atau lakukan seperti Langkah 3 dan jangan menyuntikkan sama sekali: bawa tokennya kembali ke sesi TLS dan kirim sendiri formulirnya. Untuk formulir login atau pencarian, cara itu lebih sederhana sekaligus lebih cepat, dan itulah alasan panduan ini menaruh browser di urutan terakhir. Jika Anda mengendalikan Camoufox secara langsung dan bukan lewat hrequests, perilaku scope terisolasi dan konsekuensi lainnya dibahas di panduan CAPTCHA Camoufox.

Memecahkan beberapa sekaligus

hrequests memberi Anda tiga cara untuk menumpangtindihkan permintaan, dan CapSkip memberi satu cara untuk menumpangtindihkan pemecahan. Keduanya bisa dipadukan, tetapi keduanya bukan hal yang sama.

Apa yang ingin Anda tumpangtindihkanAlat mana yang melakukannya
Beberapa pengambilan halaman, ditembakkan dulu dan dibaca kemudianBerikan nohup yang diatur ke true, lalu baca atributnya saat Anda membutuhkannya
Sebuah daftar URL dalam satu panggilanSerahkan daftarnya langsung ke method permintaan
Banyak permintaan dengan batas konkurensiBangun permintaan yang belum dikirim, lalu petakan dengan batas ukuran
Beberapa pemecahan CAPTCHA sekaligusKlien asinkron pada SDK Python, yang merupakan implementasi tersendiri dan bukan sekadar alias

Baris terakhir itu yang layak Anda dalami, karena Python adalah satu-satunya SDK CapSkip yang klien async-nya merupakan implementasi terpisah, bukan sekadar nama lain untuk kelas yang sama. Pola batching-nya diuraikan di panduan memecahkan CAPTCHA secara paralel dengan Python. Memilih antara hrequests dan klien asinkron arus utama untuk bagian pengambilannya adalah pertanyaan tersendiri, dan panduan httpx dan aiohttp menjabarkan trade-off-nya.

Kesalahan umum dan artinya

Apa yang Anda lihatPenyebabPerbaiki
NetworkException dari SDKCapSkip tidak berjalan, atau tidak terjangkau dari komputer iniJalankan, atau beralih ke mode Server dan atur host-nya
Token sudah ditulis tetapi widget-nya tetap belum terpecahkanScope terisolasi Camoufox membuang penulisan ke DOMLuncurkan dengan main world evaluation aktif dan beri awalan pada skripnya
MissingLibraryException pada panggilan renderhrequests diinstal tanpa extra browserInstal extra-nya, lalu jalankan perintah install milik pustaka itu
Token yang benar ditolak oleh situsPengirimannya keluar lewat sesi atau klien yang berbedaKirim lewat sesi yang mengambil halaman itu
Token yang benar ditolak setelah jeda panjangIa kedaluwarsa sebelum sempat dikirimkanPecahkan dan kirim berurutan, tanpa apa pun di antaranya
ERROR_GOOGLEKEY di responsnyaSitekey yang diurai dari halaman bukan sitekey yang ada di widgetBaca atribut data-sitekey, bukan sebuah tag script
TimeoutException setelah 300 detiksitekey dan URL halaman bukan pasangan pada widget itu, jadi pemecahannya berjalan sampai batas atas 300 detikPeriksa bahwa sitekey dan URL halamannya adalah pasangan yang benar-benar dipakai widget
Sesi browser tidak pernah dilepaskanSebuah halaman yang dibuat tanpa context manager tidak ditutupGunakan bentuk with, atau panggil close di blok finally

FAQ

Apakah hrequests memecahkan CAPTCHA dengan sendirinya?

Tidak. Ia mereplikasi TLS fingerprint browser dan menghasilkan header yang cocok, yang menghentikan banyak blokir sebelum sebuah challenge sempat digambar, dan ia bisa mengemulasi gerakan mouse serta pengetikan manusia di halaman yang dirender. Tidak satu pun dari itu membaca gambar yang terdistorsi atau menghasilkan token reCAPTCHA. Itu masalah yang terpisah dan membutuhkan sebuah pemecah.

Apakah saya benar-benar perlu extra browser?

Hanya jika Anda harus merender. Extra itu menarik seluruh tumpukan browser dan butuh perintah instalasi terpisah setelahnya, dan unduhannya besar. Untuk alur yang umum, yaitu ambil halaman, baca sitekey, pecahkan, kirim formulir, instalasi biasa sudah cukup dan semuanya berjalan sebagai permintaan HTTP. Tambahkan extra-nya ketika widget-nya memang tidak ada di markup yang dikirim server, atau ketika formulirnya hanya bisa dikirim lewat klik sungguhan.

Browser apa yang sebaiknya diakui oleh sesi itu?

Yang mana pun yang Anda sebutkan secara eksplisit. hrequests menerima firefox atau chrome dan menghasilkan header yang sesuai, dan ia sengaja tidak menyelaraskan versi di header dengan versi TLS, dengan alasan sistem deteksi jarang mengorelasikan keduanya dan sebaran tambahan itu terlihat seperti lebih banyak klien. Untuk merender, pustaka ini merekomendasikan Firefox, karena Chrome di sana tidak mendukung rotasi fingerprint maupun emulasi kursor manusia.

Bisakah pemecahnya berjalan di komputer yang berbeda dari scraper-nya?

Bisa, dan inilah penyiapan yang normal begitu scraping pindah dari laptop. Taruh CapSkip di mode Server supaya ia mendengarkan di alamat jaringan Anda atau IP publik alih-alih di alamat loopback, lalu arahkan argumen host ke sana. IP publik statis disarankan ketika pemanggilnya berada di luar jaringan Anda. Komputer Windows-nya tetap sama dan pemecahan tanpa batasnya tetap sama; hanya alamatnya yang berubah.

Versi singkatnya

Ambil halaman dengan sesi bernama supaya fingerprint dan cookie-nya stabil. Baca sitekey dari respons dengan parser bawaan. Pecahkan dengan satu panggilan SDK. Kirim token kembali lewat sesi yang sama, segera, dan gunakan browser yang dirender hanya ketika widget-nya tidak ada di markup. Kalau Anda memang merender, ingat bahwa engine Firefox-nya adalah Camoufox dan bahwa penulisan DOM dari scope terisolasi lenyap tanpa error, jadi aktifkan main world evaluation atau lewati saja penyuntikannya.

Satu hal yang layak diketahui sebelum Anda menskalakan scraper yang sering kena challenge: CapSkip melakukan bypass captcha di perangkat keras yang sudah Anda miliki dan tidak pernah menagih Anda per pemecahan, sehingga satu run yang kena sepuluh challenge dan satu run yang kena sepuluh ribu challenge berbiaya persis sama.