cURL ve ham HTTP API ile CAPTCHA nasıl çözülür

SDK'ya ihtiyacınız yok. CapSkip API'si 2captcha uyumludur, bu yüzden curl ile CAPTCHA çözmek tam iki çağrı sürer: görevi POST ile şuraya gönderin: /in.php ve bir ID alın, ardından şunu yoklayın: /res.php cevap gelene kadar. Her şey şurada çalışır: 127.0.0.1:8080, yani uzak bir uç nokta yok ve çözüm başına ücret alınmıyor. Bu rehberde her CAPTCHA türü için tam parametreler, JSON yanıt biçimleri ve doğrudan terminale yapıştırabileceğiniz bir betik var.
Neye ihtiyacınız var
- Yerel servisi başlatılmış, çalışan CapSkip uygulaması. Port ve anahtar ayarları şurada anlatılıyor: kurulum kılavuzu.
curl. macOS, her Linux dağıtımı ve Windows 10 build 1803 ve sonrasıyla birlikte gelir.jqJSON yanıtlarından alan çekmek istiyorsanız. İsteğe bağlı, ama örnekleri tek satıra indiriyor.
Anahtar doğrulaması varsayılan olarak kapalıdır, bu yüzden şu alanda boş olmayan herhangi bir dize işe yarar: key. Hiçbir şey göndermektense bir şey gönderin: boş anahtar şunu döndürür: ERROR_WRONG_USER_KEY.
Bağımlılık listesi bu kadar, çünkü API'nin tamamı iki uç noktadan ibaret:
| Uç nokta | Ne yapar | Döndürdüğü |
|---|---|---|
/in.php | Bir görev gönderir | Sayısal bir CAPTCHA ID'si |
/res.php | O ID'nin bitip bitmediğini sorar | Cevap ya da CAPCHA_NOT_READY |
İkisi de GET veya POST kabul eder. POST daha iyi bir alışkanlık, çünkü içinde sorgu parametresi olan bir sayfa URL'si GET isteğini ilk kodlanmamış ve işaretinde sessizce keser.
Adım 1: görevi gönderin
En kısa örnek reCAPTCHA v2. Görevi iki değer tanımlar: sayfadaki sitekey ve üzerinde durduğu sayfanın URL'si.
# 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" OK|2122988149 # the number after the pipe is your captcha ID
Parametre adına dikkat edin. reCAPTCHA şunu kullanır: googlekey. Turnstile şunu kullanır: sitekey. Şunu göndermek: sitekey şuraya userrecaptcha şu yanıtı almanın açık ara en yaygın nedenidir: ERROR_GOOGLEKEY .
Adım 2: sonucu yoklayın
Önce bekleyin, sonra sorun. Hemen yoklamak sadece bir isteği harcar ve size şunu verir: CAPCHA_NOT_READY.
sleep 15 curl -X POST http://127.0.0.1:8080/res.php \ -d "key=YOUR_API_KEY" \ -d "action=get" \ -d "id=2122988149" OK|03AGdBq26... # the token, ready to inject into the form
Şu uç nokta hakkında iki şey /res.php insanları yanıltıyor. Şunu döndürür: CAPCHA_NOT_READY görev hâlâ çalışırken; bu bir hata değil, yoklamaya devam edin demek. Ve her sonuç yalnızca bir kez okunabilir, bu yüzden cevabı geldiği anda saklayın. Aynı ID'yi ikinci kez okumak boş döner.
İlk yoklamadan önce ne kadar bekleyeceğiniz türe bağlı:
| Tür | İlk yoklama şu kadar sonra |
|---|---|
| Görsel | 1 saniye |
| reCAPTCHA v2 | 15 ila 20 saniye |
| reCAPTCHA v3 | 10 ila 15 saniye |
| GeeTest v3 | yaklaşık 5 saniye |
Yanıtı ayrıştırabilmek için json=1 ekleyin
Düz metin biçimi terminaldeki bir insan için iyi, bir betik için hantaldır. Şunu ekleyin: json=1 iki uç noktadan birine; yerine kararlı bir nesne alırsınız.
// in.php with json=1
{"status": 1, "request": "2122988149"}
// res.php with json=1, once it is solved
{"status": 1, "request": "03AGdBq26..."}
// res.php with json=1, still working
{"status": 0, "request": "CAPCHA_NOT_READY"}status başarıda 1, diğer her durumda 0 olur ve ilgilendiğiniz değer her zaman şurada durur: request. Böylece tüm iş iki jq ifadesine iner.
Tüm metotlar tek tabloda
Dokuz CAPTCHA türü, beş method değeri. Varyantlar ek parametredir, yeni uç nokta değil.
| Tür | method | Zorunlu parametreler |
|---|---|---|
| Görsel, yüklenen dosya | post | file |
| Görsel, base64 | base64 | body |
| reCAPTCHA v2 | userrecaptcha | googlekey, pageurl |
| reCAPTCHA v2 Invisible | userrecaptcha | artı invisible=1 |
| reCAPTCHA Enterprise | userrecaptcha | artı enterprise=1 |
| reCAPTCHA v3 | userrecaptcha | artı version=v3, action |
| Turnstile widget'ı | turnstile | sitekey, pageurl |
| Turnstile challenge sayfası | turnstile | artı data, pagedata |
| GeeTest v3 | geetest | gt, challenge, pageurl |
Bir görsel ya form yüklemesi olarak ya da gövdede base64 olarak gider:
# File upload. Note the @ in front of the path. Use -F for every # field here: curl refuses to mix -F and -d in one request. curl -X POST http://127.0.0.1:8080/in.php \ -F "key=YOUR_API_KEY" -F "method=post" -F "[email protected]" # Or send the bytes inline, already base64 encoded. curl -X POST http://127.0.0.1:8080/in.php \ -d "key=YOUR_API_KEY" \ -d "method=base64" \ --data-urlencode "body=$(base64 < captcha.png | tr -d '\n')"
Kullan --data-urlencode şunları içeren her şey için: +, / veya =. Base64 verisi üçünü de içerir ve düz -d onları bozar.
Turnstile bir de user agent döndürür
Cloudflare token'ı onu üreten tarayıcı parmak izine bağlar, bu yüzden farklı bir user agent ile gönderilen token, kendisi tamamen geçerli olsa bile reddedilir. Ham API kullanılan değeri iki yerde verir:
- Şununla:
json=1, yanıtta şu alan olarak:userAgent. - Düz metin modunda şu yanıt başlığı olarak:
X-Turnstile-User-Agentyanıt header'ı.
# -i prints the headers, which is where the user agent lives # when you are not using json=1. curl -i -X POST http://127.0.0.1:8080/res.php \ -d "key=YOUR_API_KEY" -d "action=get" -d "id=2122988149" X-Turnstile-User-Agent: Mozilla/5.0 ... OK|0.abc123...
Tam sayfa challenge'lar ayrıca şunlara ihtiyaç duyar: data (cData değeri) ve pagedata (chlPageData), göndermeden hemen önce sayfadan okunur. Widget modunda ikisi de gerekmez. Turnstile çözücü sayfası farkı daha ayrıntılı anlatıyor.
GeeTest cevabı tek değil, üç alandır
GeeTest tek bir token döndürmez. JSON isteyin, sitenin kendi ön yüzünün geri göndereceği üç değeri alın.
{
"status": 1,
"request": {
"geetest_challenge": "...",
"geetest_validate": "...",
"geetest_seccode": "..."
}
}The gt değeri site başına sabittir. challenge değeri tek kullanımlıktır ve yaklaşık bir dakikada ölür, bu yüzden onu göndermeden hemen önce alın, uzun bir betiğin başında değil.
Çözümü proxy üzerinden yönlendirme
Aynı /in.php çağrısına eklenen iki parametre:
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=login:[email protected]:3128" \ -d "proxytype=HTTPS"
proxytype HTTP, HTTPS, SOCKS5 veya SOCKS5H alır. Proxy'ler yalnızca reCAPTCHA, Turnstile ve GeeTest için geçerlidir. Görsel çözme zaten elinizde olan pikselleri okur ve hedef siteye hiç dokunmaz, orada proxy bir işe yaramaz.
Tam bir betik
Gönder, üst sınırla yokla, token'ı yazdır. Yirmi satır kadar, şunun dışında bağımlılık yok: curl.
#!/usr/bin/env bash
set -euo pipefail
API="http://127.0.0.1:8080"
KEY="YOUR_API_KEY"
# Submit and keep only the part after the pipe.
ID=$(curl -s -X POST "$API/in.php" \
-d "key=$KEY" -d "method=userrecaptcha" \
-d "googlekey=YOUR_SITEKEY" \
-d "pageurl=https://example.com/page-with-recaptcha" | cut -d'|' -f2)
sleep 15
# Poll every 5s, give up after 20 tries so this cannot hang forever.
for _ in $(seq 20); do
R=$(curl -s -X POST "$API/res.php" -d "key=$KEY" -d "action=get" -d "id=$ID")
[ "$R" = "CAPCHA_NOT_READY" ] || { echo "${R#OK|}"; exit 0; }
sleep 5
done
echo "timed out waiting for $ID" >&2; exit 1The || { ...; exit 0; } dalı şuna eşit olmayan her şeyde çalışır: CAPCHA_NOT_READY, hata kodları dahil. Bu bilinçli: hata dur demektir, yoklamaya devam et değil.
Bu katmanda karşılaşacağınız hatalar
| Kod | Anlamı | Düzeltme |
|---|---|---|
ERROR_WRONG_USER_KEY | Anahtar eksikti ya da boştu | Boş olmayan herhangi bir değer gönderin: key |
ERROR_WRONG_METHOD | Hatalı method veya action | Yazımı yukarıdaki tabloyla karşılaştırın |
ERROR_BAD_PARAMETERS | Zorunlu bir parametre eksik | Yukarıdaki zorunlu parametre sütunuyla karşılaştırın |
ERROR_GOOGLEKEY | The googlekey değeri reddedildi | Muhtemelen şunu gönderdiniz: sitekey onun yerine |
ERROR_PAGEURL | The pageurl değeri reddedildi | Şemayı ekleyin ve GET yerine POST kullanın |
CAPCHA_NOT_READY | Hâlâ çalışıyor | Hata değil. Aynı ID'yi yoklamaya devam edin |
| Boş yanıt | Zaten okundu ya da böyle bir ID yok | Sonuçlar bir kez okunur. İlkini saklayın |
API'nin döndürebileceği her kodun tam ifadesi şurada: API dokümantasyonu.
curl'ü ne zaman bırakmalı
Ham HTTP; hızlı bir deneme, bir shell hattı ya da resmi istemcisi olmayan bir dil için mükemmeldir. Uygulama kodu içinse CapSkip SDKs bağımlılığa değer, hepsinden önce tek bir nedenle: sabit aralıkla yoklamazlar. 250 ms'de başlar ve şuna kadar geri çekilirler: pollingInterval, bu yüzden bir çözüm genelde yukarıdaki elle yazılmış döngüden daha erken döner; o döngü her seferinde tam 15 saniyeyi bekleyerek geçirir.
Ayrıca hata dizelerini türlü istisnalara çevirir, Turnstile user agent'ını ve GeeTest'in üç alanlı cevabını sizin yerinize halleder. Resmi istemciler Python, Node.js, PHP ve .NET için mevcut.
Sık sorulan sorular
POST yerine GET kullanabilir miyim?
Evet, iki uç nokta da kabul eder. Sorun şu ki kendi sorgu dizesini taşıyan bir pageurl ilk kodlanmamış ve işaretinde kesilir ve şunu alırsınız: ERROR_PAGEURL ya da yanlış sayfa için bir çözüm. GET şart ise URL'yi önce şundan geçirin: --data-urlencode .
Hangi API anahtarını göndermeliyim?
Boş olmayan herhangi bir dize. Servis yalnızca localhost'u dinlediği için anahtar doğrulaması varsayılan olarak kapalıdır, yani key=capskip gayet iyi çalışır. Yine de bulunması gerekir: atlarsanız çözüm yerine ERROR_WRONG_USER_KEY alırsınız.
Bu, Windows PowerShell'de çalışır mı?
Kullan curl.exe komutunu açıkça kullanın. PowerShell'de curl şunun takma adıdır: Invoke-WebRequest, ve o da -d parametresini anlamaz; API sorunu gibi görünen bir parametre hatası fırlatır. Şunu yazmak: curl.exe takma adı devre dışı bırakır.
Aynı anda birkaç çözüm çalıştırabilir miyim?
Evet. İstediğiniz kadar görev gönderin ve her ID'yi bağımsız yoklayın. Hiçbir şey onları sıraya sokmaz ve dakikalık kota yoktur, çünkü iş paylaşılan bir kuyrukta değil kendi donanımınızda yapılır.
Özet
Görevi POST ile şuraya gönderin: /in.php, ID'yi saklayın, türe uygun gecikmeyi bekleyin, sonra şunu yoklayın: /res.php şundan başka bir şey alana kadar: CAPCHA_NOT_READY. Yanıtı bir betik okuyacaksa json=1 ekleyin. İki isim tuzağına dikkat edin: googlekey reCAPTCHA için, buna karşılık sitekey Turnstile için; bir de sonucun yalnızca bir kez okunabildiğini unutmayın.
Bu, kendi makinenizde çalışan bir captcha çözücü olduğu için yukarıdaki döngünün uyacağı bir kota ya da dolduracağı bir bakiye yok. Onu localhost'a yöneltin; tek sınır, işlemcinizin kuyruğu ne kadar hızlı bitirdiğidir.
