Cara Menyiapkan Rotasi Proxy CAPTCHA di Python dan Node

captcha proxy rotation - How to Set Up CAPTCHA Proxy Rotation in Python and 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.

TipeProxy didukungMengapa
reCAPTCHA v2 dan v3, termasuk EnterpriseYaProses pemecahannya melibatkan permintaan ke Google dari proxy
Cloudflare TurnstileYaSama, terhadap Cloudflare
GeeTest v3YaSama, terhadap server API GeeTest
Gambar atau OCRTidakGambarnya 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 IP

Node 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 back

PHP 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 last

Tiga 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.

KolomNilaiBawaan
proxyIP:PORT atau login:pass@IP:PORTTidak ada
proxytypeHTTP, HTTPS, SOCKS5 atau SOCKS5HHTTP
# 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

GejalaPenyebabPerbaiki
Pemecahan berhasil, token ditolakHalaman diambil dari IP yang berbeda dengan IP tempat pemecahan dilakukanKunci satu proxy untuk pengambilan, pemecahan, dan pengiriman
ERROR_CAPTCHA_UNSOLVABLE hanya pada satu IPExit node itu diblokir oleh situs targetKeluarkan dari pool dan coba lagi dengan yang berikutnya
Timeout pada setiap job yang memakai proxyproxytype tidak cocok dengan proxy-nyaKirim kolom itu secara eksplisit, jangan pakai default HTTP
Proxy tampak tidak berpengaruhJob-nya adalah CAPTCHA gambarMemang begitu. Proxy berlaku untuk tiga keluarga lainnya
Berfungsi secara lokal, gagal di dalam containerDNS ter-resolve berbeda di dalam jaringanGunakan 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.