Cara Menyiapkan Rotasi Proxy CAPTCHA di Python dan Node

Rotasi proxy CAPTCHA adalah sesuatu yang Anda bangun di kode Anda sendiri. Pemecah CAPTCHA menerima satu proxy per job dan memakainya hanya untuk job itu, jadi pool, kebijakan rotasi, dan logika percobaan ulang semuanya ada di sisi Anda. Dua aturan sudah menyelesaikan sebagian besar pekerjaan: kunci satu IP untuk satu sesi alih-alih merotasi pada setiap panggilan, dan lakukan rotasi hanya setelah terjadi kegagalan. Panduan ini membahas bentuk objek proxy yang tepat di setiap SDK, pasangan API mentah di baliknya, dan satu-satunya jenis CAPTCHA yang diam-diam mengabaikan proxy.
Proxy berlaku untuk tiga keluarga CAPTCHA, bukan keempatnya
Mulailah dari batasannya, karena hal ini menghemat satu sore penuh debugging. CapSkip memecahkan empat keluarga CAPTCHA, dan proxy berfungsi pada tiga di antaranya: reCAPTCHA, Turnstile, dan GeeTest. CAPTCHA gambar tidak menerima proxy.
reCAPTCHA hanya dihitung sekali di sini. v2 checkbox, Invisible, Enterprise, dan v3 adalah opsi pada panggilan solve yang sama, bukan jenis terpisah, jadi semuanya berperilaku sama terhadap proxy.
| Tipe | Proxy didukung | Mengapa |
|---|---|---|
| reCAPTCHA v2 dan v3, termasuk Enterprise | Ya | Proses pemecahannya melibatkan permintaan ke Google dari proxy |
| Cloudflare Turnstile | Ya | Sama, terhadap Cloudflare |
| GeeTest v3 | Ya | Sama, terhadap server API GeeTest |
| Gambar atau OCR | Tidak | Gambarnya sudah ada di tangan, jadi tidak ada permintaan keluar yang dibuat |
Memberikan proxy pada job gambar bukanlah sebuah kesalahan. Proxy itu diterima lalu diabaikan, dan itu justru lebih buruk, karena bug rotasi di sana sama sekali tidak menghasilkan sinyal. Jika Anda merutekan CAPTCHA gambar melalui wrapper yang sama dengan yang lain, lewati argumen proxy pada jalur itu.
Bentuk objek proxy di setiap SDK
Setiap SDK menerima objek dua kolom yang sama: sebuah type dan sebuah URI. URI-nya bisa berupa host dan port, atau kredensial yang diikuti host dan port.
# pip install capskip
from capskip import CapSkip
solver = CapSkip(host="127.0.0.1", port=8080)
# The proxy applies to this one solve, nothing is remembered.
result = solver.recaptcha(
sitekey="YOUR_SITEKEY",
url="https://example.com/page-with-recaptcha",
proxy={"type": "HTTPS", "uri": "user:[email protected]:3128"},
)
print(result["code"]) # token, solved through that IPNode menerima objek yang sama sebagai argumen options.
// npm install capskip
const { CapSkip } = require('capskip');
const solver = new CapSkip({ host: '127.0.0.1', port: 8080 });
const result = await solver.turnstile(
'YOUR_SITEKEY',
'https://example.com/page-with-turnstile',
{ proxy: { type: 'SOCKS5', uri: '1.2.3.4:1080' } },
);
console.log(result.code, result.userAgent); // send both backPHP menyarangkannya di dalam array options sebagai key proxy, dan .NET meneruskan objek Proxy yang dibangun dari dua nilai yang sama. Empat nilai type yang diizinkan sama di mana pun: HTTP, HTTPS, SOCKS5, dan SOCKS5H. SOCKS5H me-resolve DNS di sisi proxy, bukan di komputer lokal, dan itulah yang Anda butuhkan ketika target ter-resolve berbeda menurut wilayah.
Kunci satu proxy per sesi, bukan per permintaan
Naluri pertama biasanya adalah mengambil IP baru untuk setiap pemecahan. Itu default yang salah dan justru itulah yang membuat sesi Anda ditandai.
Halaman yang terproteksi mengikat token ke konteks tempat token itu diterbitkan. Jika crawler Anda memuat halaman dari satu IP sementara token dipecahkan dari IP lain, situs akan melihat ketidaksesuaian antara sesi penjelajahan dan verifikasinya. Sebagian situs mengabaikannya. Cloudflare dan reCAPTCHA Enterprise tidak, dan token akan tervalidasi sebagai berkualitas rendah atau langsung gagal.
Jadi unit rotasinya adalah sesi, bukan panggilan. Satu proxy mengambil halaman, memecahkan CAPTCHA, dan mengirim formulirnya. Sesi berikutnya memakai proxy berikutnya.
# pip install capskip
import itertools
# One entry per exit IP. Round-robin, not random:
# random picks repeat, and a repeat is what a rate limiter sees.
POOL = [
{"type": "HTTPS", "uri": "user:[email protected]:3128"},
{"type": "HTTPS", "uri": "user:[email protected]:3128"},
{"type": "SOCKS5H", "uri": "user:[email protected]:1080"},
]
pool = itertools.cycle(POOL)
def new_session():
"""Hand the same proxy to the HTTP client and the solver."""
return next(pool)Round-robin mengalahkan pemilihan acak di sini karena satu alasan: pengambilan acak dari pool kecil cukup sering mengulang IP yang sama secara beruntun sampai hal itu menjadi masalah, dan permintaan beruntun dari satu exit node persis merupakan pola yang diawasi pembatas laju.
Rotasi saat gagal, bukan berdasarkan timer
Aturan kedua adalah soal kapan harus berpindah. Merotasi setiap N permintaan membuang IP yang masih berfungsi dan membiarkan IP yang rusak tetap beredar hingga N panggilan berikutnya. Rotasilah berdasarkan bukti.
# pip install capskip
from capskip import CapSkip
from capskip import ApiException, NetworkException, TimeoutException
solver = CapSkip(host="127.0.0.1", port=8080)
def solve_with_retry(sitekey, url, attempts=3):
last = None
for _ in range(attempts):
proxy = new_session()
try:
return solver.recaptcha(sitekey=sitekey, url=url, proxy=proxy)
except (ApiException, NetworkException, TimeoutException) as err:
# Burn this IP for the run and take the next one.
last = err
raise lastTiga percobaan adalah batas atas yang tepat untuk sebagian besar pool. Jika sebuah sitekey gagal di tiga IP yang berbeda, masalahnya bukan pada proxy: sitekey-nya sudah usang, URL halamannya salah, atau situs mengubah challenge-nya. Mencoba untuk keempat kalinya hanya menghabiskan kapasitas pemecahan untuk memastikan hal itu.
Exception mana yang Anda tangkap memberi tahu apa yang sebenarnya terjadi. NetworkException berarti pemecah CAPTCHA tidak terjangkau atau job di-polling sebelum siap. TimeoutException berarti jendela polling sudah habis. ApiException membawa kode kesalahan yang dikembalikan, dan itulah yang layak dicatat bersama proxy-nya, karena begitulah Anda menemukan satu exit node mati di dalam pool berisi empat puluh.
API mentah: proxy dan proxytype
Tanpa SDK, hal yang sama menjadi dua kolom form tambahan pada panggilan submit. Objek SDK-nya memetakan langsung ke kedua kolom itu.
| Kolom | Nilai | Bawaan |
|---|---|---|
| proxy | IP:PORT atau login:pass@IP:PORT | Tidak ada |
| proxytype | HTTP, HTTPS, SOCKS5 atau SOCKS5H | HTTP |
# No install step. curl is already on your machine. curl -X POST http://127.0.0.1:8080/in.php \ -d "key=YOUR_API_KEY" \ -d "method=userrecaptcha" \ -d "googlekey=YOUR_SITEKEY" \ -d "pageurl=https://example.com/page-with-recaptcha" \ -d "proxy=user:[email protected]:3128" \ -d "proxytype=HTTPS" OK|2122988149 # submitted, and it will solve through that IP
Nilai default proxytype adalah HTTP, jadi proxy HTTPS atau SOCKS5 yang dikirim tanpa kolom ini akan dihubungi sebagai HTTP biasa dan gagal. Kirim kolom itu setiap kali, jangan mengandalkan nilai default yang kebetulan cocok dengan pool Anda.
Tukar host-nya dan panggilan yang sama akan bekerja pada instance bersama. Secara default CapSkip mendengarkan di 127.0.0.1 dalam mode Local, dan pengaturan koneksi juga menawarkan mode Server, yang membuat CapSkip mendengarkan di jaringan Anda atau IP publik sehingga mesin lain dapat menjangkau API-nya. Tempatkan di sebuah VPS dan satu pemecah melayani setiap worker di armada crawler Anda. Penanganan proxy tidak berubah: proxy tetap berlaku per job, dan pool tetap berada di kode Anda sendiri.
Kesalahan umum dan artinya
| Gejala | Penyebab | Perbaiki |
|---|---|---|
| Pemecahan berhasil, token ditolak | Halaman diambil dari IP yang berbeda dengan IP tempat pemecahan dilakukan | Kunci satu proxy untuk pengambilan, pemecahan, dan pengiriman |
ERROR_CAPTCHA_UNSOLVABLE hanya pada satu IP | Exit node itu diblokir oleh situs target | Keluarkan dari pool dan coba lagi dengan yang berikutnya |
| Timeout pada setiap job yang memakai proxy | proxytype tidak cocok dengan proxy-nya | Kirim kolom itu secara eksplisit, jangan pakai default HTTP |
| Proxy tampak tidak berpengaruh | Job-nya adalah CAPTCHA gambar | Memang begitu. Proxy berlaku untuk tiga keluarga lainnya |
| Berfungsi secara lokal, gagal di dalam container | DNS ter-resolve berbeda di dalam jaringan | Gunakan SOCKS5H agar proxy yang me-resolve hostname-nya |
Detail lengkap parameter untuk tiap jenis ada di dokumentasi API.
FAQ
Apakah saya benar-benar perlu proxy untuk memecahkan CAPTCHA?
Tidak. Pemecahan tanpa proxy berfungsi untuk sebagian besar situs dan berarti satu komponen lebih sedikit. Tambahkan proxy ketika target dibatasi secara geografis, ketika situs menerapkan pembatasan laju berdasarkan IP, atau ketika token mulai ditolak meskipun pemecahannya bersih. Mulailah tanpa proxy dan tambahkan sebagai solusi atas masalah yang benar-benar Anda amati.
Proxy residensial atau datacenter?
IP datacenter lebih cepat dan lebih murah, dan cukup memadai pada situs yang hanya menerapkan pembatasan laju. IP residensial menjadi penting ketika target menilai jaringannya sendiri, yang umum terjadi pada halaman yang dilindungi Cloudflare dan pada reCAPTCHA Enterprise. Mencampur keduanya dalam satu pool juga berhasil: coba datacenter dulu, lalu beralih ke residensial saat gagal.
Apa perbedaan antara SOCKS5 dan SOCKS5H?
SOCKS5 me-resolve hostname di komputer Anda lalu mengirim IP hasilnya ke proxy. SOCKS5H mengirim hostname-nya dan membiarkan proxy yang me-resolve. Gunakan SOCKS5H ketika situs mengembalikan alamat yang berbeda menurut wilayah, atau ketika resolver lokal Anda sama sekali tidak dapat melihat target.
Apakah proxy memperlambat pemecahan?
Sedikit, dan itu tergantung pada exit node-nya, bukan pada pemecah CAPTCHA. Polling-nya sendiri tidak terpengaruh: SDK memulai dari 250 milidetik lalu melambat sampai batas pollingInterval, jadi pemecahan yang cepat tetap dikembalikan dengan cepat. Proxy yang lambat terlihat sebagai waktu yang lebih lama menuju polling sukses pertama, bukan sebagai overhead polling tambahan.
Versi singkatnya
Kunci satu proxy per sesi, lakukan rotasi ketika sebuah pemecahan gagal alih-alih menurut jadwal, selalu kirim proxytype, dan lewati proxy sepenuhnya pada job gambar. Karena proses pemecahannya sendiri berjalan secara lokal sebagai pemecah captcha tanpa batas, percobaan ulang tidak memakan biaya apa pun selain bandwidth proxy, sehingga rotasi-saat-gagal cukup murah untuk dijadikan default. Untuk pipeline yang lebih luas tempat semua ini berada, lihat pemecahan CAPTCHA untuk web scraping, yang membahas penanganan sesi dari awal sampai akhir. Sementara itu, panduan integrasi Python berisi penyiapan di sisi klien.
