Python ve Node'da CAPTCHA Proxy Rotasyonu Nasıl Kurulur

CAPTCHA proxy rotasyonu, kendi kodunuzda kurduğunuz bir şeydir. Çözücü iş başına tek bir proxy alır ve onu yalnızca o iş için kullanır; dolayısıyla havuz, rotasyon politikası ve yeniden deneme mantığı tamamen sizin tarafınızda kalır. İşin çoğunu iki kural halleder: her çağrıda rotasyon yapmak yerine tek bir IP'yi tek bir oturuma sabitleyin ve yalnızca bir başarısızlıktan sonra rotasyon yapın. Bu rehber, her SDK'daki tam proxy yapısını, arkasındaki ham API alan çiftini ve proxy'nin sessizce yok sayıldığı tek CAPTCHA türünü kapsar.
Proxy'ler dört CAPTCHA ailesinin hepsine değil, üçüne uygulanır
Önce kısıtlamayı söyleyelim, çünkü bu sizi bir öğleden sonra sürecek hata ayıklamadan kurtarır. CapSkip dört CAPTCHA ailesini çözer ve proxy bunların üçünde çalışır: reCAPTCHA, Turnstile ve GeeTest. Görsel CAPTCHA'lar proxy almaz.
reCAPTCHA burada tek sayılır. v2 onay kutusu, Invisible, Enterprise ve v3 ayrı türler değil, aynı çözüm çağrısının seçenekleridir; bu yüzden proxy konusunda hepsi aynı şekilde davranır.
| Tür | Proxy destekleniyor | Neden |
|---|---|---|
| reCAPTCHA v2 ve v3, Enterprise dahil | Evet | Çözüm, proxy üzerinden Google'a yapılan bir istek içerir |
| Cloudflare Turnstile | Evet | Aynı, Cloudflare'e karşı |
| GeeTest v3 | Evet | Aynı, GeeTest API sunucusuna karşı |
| Görsel veya OCR | Hayır | Görüntü zaten elde olduğu için dışarıya hiçbir istek yapılmaz |
Bir görsel işine proxy geçirmek hata vermez. Kabul edilir ve yok sayılır; bu daha kötüdür, çünkü oradaki bir rotasyon hatası hiçbir sinyal üretmez. Eğer görsel CAPTCHA'ları diğer her şeyle aynı sarmalayıcı üzerinden geçiriyorsanız, o yolda proxy argümanını atlayın.
Her SDK'da proxy yapısı
Her SDK aynı iki alanlı nesneyi alır: bir tür ve bir URI. URI ya host ve port'tan oluşur ya da kimlik bilgilerinin ardından gelen host ve port'tan.
# 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 ise aynı nesneyi bir options argümanı olarak alır.
// 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 bunu options dizisinde bir proxy anahtarı olarak iç içe koyar; .NET ise aynı iki değerden oluşturulmuş bir Proxy nesnesi geçirir. İzin verilen dört tür değeri her yerde aynıdır: HTTP, HTTPS, SOCKS5 ve SOCKS5H. SOCKS5H, DNS'i yerelde değil proxy tarafında çözer; hedef bölgeye göre farklı çözümleniyorsa isteyeceğiniz şey budur.
İstek başına değil, oturum başına tek bir proxy sabitleyin
İlk içgüdü, her çözüm için yeni bir IP çekmektir. Bu yanlış bir varsayılandır ve oturumların işaretlenmesine yol açan da tam olarak budur.
Korumalı bir sayfa, token'ı verildiği bağlama bağlar. Crawler'ınız sayfayı bir IP'den yüklerken token başka bir IP'den çözülürse, site gezinme oturumu ile doğrulama arasında bir uyumsuzluk görür. Bazı siteler bunu yok sayar. Cloudflare ve reCAPTCHA Enterprise saymaz; token düşük kaliteli olarak doğrulanır ya da doğrudan başarısız olur.
Yani rotasyon birimi çağrı değil, oturumdur. Tek bir proxy sayfayı alır, CAPTCHA'yı çözer ve formu gönderir. Sonraki oturum sıradaki proxy'yi alır.
# 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)Burada round-robin, rastgele seçimi tek bir nedenle geride bırakır: küçük bir havuzdan rastgele örnekleme aynı IP'yi kayda değer sıklıkta arka arkaya tekrarlar ve tek bir çıkış düğümünden gelen arka arkaya istekler, hız sınırlayıcıların tam olarak gözlediği örüntüdür.
Zamanlayıcıyla değil, başarısızlıkta rotasyon yapın
İkinci kural, ne zaman devam edileceğidir. Her N istekte bir rotasyon yapmak, çalışan IP'leri çöpe atar ve bozuk olanları N çağrı daha dolaşımda tutar. Bunun yerine kanıta dayanarak rotasyon yapın.
# 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Çoğu havuz için doğru üst sınır üç denemedir. Bir sitekey üç ayrı IP'de başarısız oluyorsa sorun proxy değildir: sitekey eskimiştir, sayfa URL'si yanlıştır ya da site doğrulamasını değiştirmiştir. Dördüncü kez denemek, bunu doğrulamak için çözüm kapasitesi harcamaktan başka işe yaramaz.
Hangi istisnayı yakaladığınız, ne olduğunu size söyler. NetworkException, çözücüye ulaşılamadığı ya da işin hazır olmadan sorgulandığı anlamına gelir. TimeoutException, sorgulama penceresinin dolduğu anlamına gelir. ApiException ise dönen bir hata kodu taşır; kırk proxy'lik bir havuzdaki tek ölü çıkış düğümünü ancak böyle bulacağınız için, proxy bilgisiyle birlikte kaydedilmeye değer olan da budur.
Ham API: proxy ve proxytype
SDK olmadan aynı şey, gönderim çağrısına eklenen iki form alanından ibarettir. SDK nesnesi doğrudan bunlara karşılık gelir.
| Alan | Değer | Varsayılan |
|---|---|---|
| proxy | IP:PORT veya login:pass@IP:PORT | Yok |
| proxytype | HTTP, HTTPS, SOCKS5 veya 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
proxytype varsayılanı HTTP'dir; bu yüzden bu alan gönderilmeden verilen bir HTTPS veya SOCKS5 proxy'si düz HTTP olarak çağrılır ve başarısız olur. Varsayılanın havuzunuza uymasına güvenmek yerine alanı her seferinde gönderin.
Host'u değiştirin, aynı çağrı paylaşılan bir örnekte de çalışır. CapSkip varsayılan olarak Local modda 127.0.0.1 adresini dinler ve uygulamadaki bağlantı ayarları ayrıca Server modunu da sunar; bu modda CapSkip ağınızı veya genel IP'nizi dinler, böylece diğer makineler API'ye erişebilir. Onu bir VPS'e koyun, tek bir çözücü tarama filonuzdaki her worker'a hizmet etsin. Proxy yönetimi değişmez: proxy yine iş başına uygulanır ve havuz yine kendi kodunuzda kalır.
Sık görülen hatalar ve anlamları
| Belirti | Neden | Düzeltme |
|---|---|---|
| Çözümler başarılı, token'lar reddediliyor | Sayfa, çözümün yapıldığı IP'den farklı bir IP'den alındı | Alma, çözme ve gönderme boyunca tek bir proxy'yi sabitleyin |
ERROR_CAPTCHA_UNSOLVABLE yalnızca tek bir IP'de | O çıkış düğümü hedef tarafından engellenmiş | Onu havuzdan çıkarın ve sıradakiyle yeniden deneyin |
| Proxy'li her işte zaman aşımı | proxytype, proxy ile eşleşmiyor | Alanı HTTP varsayılanına bırakmadan açıkça gönderin |
| Proxy hiçbir işe yaramıyor gibi görünüyor | İş bir görsel CAPTCHA | Beklenen durum. Proxy'ler diğer üç aileye uygulanır |
| Yerelde çalışıyor, konteynerde başarısız oluyor | DNS ağın içinde farklı çözümleniyor | Ana makine adını proxy'nin çözmesi için SOCKS5H kullanın |
Her tür için tüm parametre ayrıntılarını şurada bulabilirsiniz: API dokümantasyonu.
FAQ
CAPTCHA çözmek için gerçekten bir proxy'ye ihtiyacım var mı?
Hayır. Proxy'siz çözüm çoğu sitede işe yarar ve hareketli parça sayısını bir azaltır. Proxy'yi; hedef coğrafi olarak kısıtlıysa, IP'ye göre hız sınırlaması uyguluyorsa ya da sorunsuz çözülmesine rağmen token'lar reddedilmeye başlıyorsa ekleyin. Proxy'siz başlayın ve onu, gözlemlenen bir soruna çözüm olarak ekleyin.
Konut (residential) proxy mi, veri merkezi proxy'si mi?
Veri merkezi IP'leri daha hızlı ve daha ucuzdur; yalnızca hız sınırlaması uygulayan sitelerde sorun çıkarmaz. Konut IP'leri, hedef ağın kendisini puanladığında önem kazanır; bu da Cloudflare korumalı sayfalarda ve reCAPTCHA Enterprise'da yaygındır. İkisini tek bir havuzda karıştırmak işe yarar: önce veri merkezini deneyin, başarısız olursa konut IP'sine geçin.
SOCKS5 ile SOCKS5H arasındaki fark nedir?
SOCKS5, ana makine adını sizin makinenizde çözer ve elde edilen IP'yi proxy'ye gönderir. SOCKS5H ise ana makine adını gönderir ve çözme işini proxy'ye bırakır. Site bölgeye göre farklı adresler döndürüyorsa ya da yerel çözümleyiciniz hedefi hiç göremiyorsa SOCKS5H kullanın.
Proxy çözümü yavaşlatır mı?
Biraz, ve bu çözücüden çok çıkış düğümüne bağlıdır. Sorgulamanın kendisi etkilenmez: SDK'lar 250 milisaniyeden başlar ve pollingInterval üst sınırına kadar geri çekilir; dolayısıyla hızlı bir çözüm yine hızlı döner. Yavaş bir proxy, ekstra sorgulama yükü olarak değil, ilk başarılı sorgulamaya kadar geçen sürenin uzaması olarak kendini gösterir.
Kısa özet
Oturum başına tek bir proxy sabitleyin, bir takvime göre değil bir çözüm başarısız olduğunda rotasyon yapın, proxytype'ı her zaman gönderin ve görsel işlerde proxy'yi tamamen atlayın. Çözme işleminin kendisi yerel olarak çalıştığı için, yani sınırsız captcha çözücü, yeniden denemenin proxy bant genişliği dışında bir maliyeti olmaz; bu da başarısızlıkta rotasyonu varsayılan yapacak kadar ucuza gelir. Bunun içinde yer aldığı daha geniş akış için bkz. web scraping için CAPTCHA çözme, bu yazı oturum yönetimini baştan sona ele alır. Python entegrasyon rehberi istemci tarafı kurulumunu içerir.
