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

solve captcha with curl - How to Solve CAPTCHA with cURL and the Raw HTTP API

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.
  • jq JSON 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ç noktaNe yaparDöndürdüğü
/in.phpBir görev gönderirSayısal bir CAPTCHA ID'si
/res.phpO ID'nin bitip bitmediğini sorarCevap 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örsel1 saniye
reCAPTCHA v215 ila 20 saniye
reCAPTCHA v310 ila 15 saniye
GeeTest v3yaklaşı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ürmethodZorunlu parametreler
Görsel, yüklenen dosyapostfile
Görsel, base64base64body
reCAPTCHA v2userrecaptchagooglekey, pageurl
reCAPTCHA v2 Invisibleuserrecaptchaartı invisible=1
reCAPTCHA Enterpriseuserrecaptchaartı enterprise=1
reCAPTCHA v3userrecaptchaartı version=v3, action
Turnstile widget'ıturnstilesitekey, pageurl
Turnstile challenge sayfasıturnstileartı data, pagedata
GeeTest v3geetestgt, 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-Agent yanı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 1

The || { ...; 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

KodAnlamıDüzeltme
ERROR_WRONG_USER_KEYAnahtar eksikti ya da boştuBoş olmayan herhangi bir değer gönderin: key
ERROR_WRONG_METHODHatalı method veya actionYazımı yukarıdaki tabloyla karşılaştırın
ERROR_BAD_PARAMETERSZorunlu bir parametre eksikYukarıdaki zorunlu parametre sütunuyla karşılaştırın
ERROR_GOOGLEKEYThe googlekey değeri reddedildiMuhtemelen şunu gönderdiniz: sitekey onun yerine
ERROR_PAGEURLThe pageurl değeri reddedildiŞemayı ekleyin ve GET yerine POST kullanın
CAPCHA_NOT_READYHâlâ çalışıyorHata değil. Aynı ID'yi yoklamaya devam edin
Boş yanıtZaten okundu ya da böyle bir ID yokSonuç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.