cURL और रॉ HTTP API से कैप्चा कैसे हल करें

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

आपको SDK की ज़रूरत नहीं। CapSkip API 2captcha के अनुरूप है, इसलिए curl से कैप्चा ठीक दो कॉल में हल हो जाता है: टास्क को POST करें /in.php पर, और बदले में एक ID पाएँ, फिर पोल करें /res.php जब तक जवाब न आ जाए। सब कुछ चलता है 127.0.0.1:8080पर, इसलिए न कोई रिमोट एंडपॉइंट है और न ही प्रति हल कोई शुल्क लगता है। इस गाइड में हर कैप्चा प्रकार के सटीक पैरामीटर, JSON रिस्पॉन्स के फ़ॉर्मेट और एक स्क्रिप्ट है जिसे आप सीधे टर्मिनल में पेस्ट कर सकते हैं।

आपको क्या चाहिए

  • CapSkip ऐप चालू हो और उसकी लोकल सर्विस शुरू हो। पोर्ट और की सेटिंग्स इसमें दी गई हैं: सेटअप गाइड.
  • curl। यह macOS, हर Linux डिस्ट्रीब्यूशन और Windows 10 बिल्ड 1803 व उसके बाद के साथ आता है।
  • jq अगर आप JSON रिस्पॉन्स से फ़ील्ड निकालना चाहते हैं। वैकल्पिक है, पर इससे उदाहरण एक ही लाइन के रह जाते हैं।

की वैलिडेशन डिफ़ॉल्ट रूप से बंद है, इसलिए इस फ़ील्ड में कोई भी खाली न होने वाली स्ट्रिंग चलती है: key। कुछ न भेजने से बेहतर है कुछ भेजना: खाली की पर यह लौटता है ERROR_WRONG_USER_KEY.

निर्भरताओं की सूची बस इतनी ही है, क्योंकि पूरा API सिर्फ़ दो एंडपॉइंट का है:

एंडपॉइंटयह क्या करता हैक्या लौटाता है
/in.phpएक टास्क सबमिट करता हैएक संख्यात्मक कैप्चा ID
/res.phpपूछता है कि वह ID तैयार है या नहींजवाब, या CAPCHA_NOT_READY

दोनों GET या POST स्वीकार करते हैं। POST बेहतर आदत है, क्योंकि क्वेरी पैरामीटर वाला पेज URL पहले बिना एन्कोड किए ऐम्परसैंड पर GET रिक्वेस्ट को चुपचाप काट देता है।

चरण 1: टास्क सबमिट करें

reCAPTCHA v2 सबसे छोटा उदाहरण है। दो मान काम तय करते हैं: पेज से लिया गया sitekey और उस पेज का URL जिस पर वह है।

# 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

पैरामीटर के नाम पर ध्यान दें। reCAPTCHA उपयोग करता है googlekey। Turnstile उपयोग करता है sitekey। भेजना sitekey को userrecaptcha इस रिस्पॉन्स का सबसे आम कारण है ERROR_GOOGLEKEY

चरण 2: नतीजे के लिए पोल करें

पहले रुकें, फिर पूछें। तुरंत पोल करना सिर्फ़ एक रिक्वेस्ट बर्बाद करता है और देता है 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

इसकी दो बातें /res.php लोगों को उलझा देती हैं। यह लौटाता है CAPCHA_NOT_READY जब तक टास्क चल रहा हो; यह त्रुटि नहीं है और इसका मतलब है पोल करते रहें। और हर नतीजा सिर्फ़ एक बार पढ़ा जा सकता है, इसलिए जवाब आते ही उसे सहेज लें। उसी ID को दूसरी बार पढ़ने पर खाली लौटता है।

पहले पोल से पहले कितना रुकना है, यह प्रकार पर निर्भर करता है:

Typeपहला पोल इतनी देर बाद
इमेज1 सेकंड
reCAPTCHA v215 से 20 सेकंड
reCAPTCHA v310 से 15 सेकंड
GeeTest v3लगभग 5 सेकंड

json=1 जोड़ें ताकि जवाब पार्स किया जा सके

सादा टेक्स्ट फ़ॉर्मेट टर्मिनल पर पढ़ते इंसान के लिए ठीक है और स्क्रिप्ट के लिए बेढंगा। जोड़ें json=1 किसी भी एंडपॉइंट पर, और बदले में एक स्थिर ऑब्जेक्ट मिलेगा।

// 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 सफलता पर 1 और बाकी सब पर 0 होता है, और काम का मान हमेशा इसमें रहता है request। इससे पूरा काम दो jq एक्सप्रेशन में सिमट जाता है।

हर मेथड एक ही टेबल में

नौ कैप्चा प्रकार, पाँच method मान। वैरिएंट अतिरिक्त पैरामीटर हैं, नए एंडपॉइंट नहीं।

Typemethodआवश्यक पैरामीटर
इमेज, अपलोड की गई फ़ाइलpostfile
इमेज, base64base64body
reCAPTCHA v2userrecaptchagooglekey, pageurl
reCAPTCHA v2 Invisibleuserrecaptchaसाथ में invisible=1
reCAPTCHA Enterpriseuserrecaptchaसाथ में enterprise=1
reCAPTCHA v3userrecaptchaसाथ में version=v3, action
Turnstile विजेटturnstilesitekey, pageurl
Turnstile चैलेंज पेजturnstileसाथ में data, pagedata
GeeTest v3geetestgt, challenge, pageurl

इमेज या तो फ़ॉर्म अपलोड के रूप में जाती है या बॉडी में base64 के रूप में:

# 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')"

उपयोग करें --data-urlencode उस हर चीज़ के लिए जिसमें हो +, / या =। base64 डेटा में तीनों होते हैं, और सादा -d उन्हें बिगाड़ देगा।

Turnstile एक user agent भी लौटाता है

Cloudflare टोकन को उस ब्राउज़र फ़िंगरप्रिंट से बाँध देता है जिसने उसे बनाया, इसलिए किसी दूसरे user agent से भेजा गया टोकन खारिज हो जाता है, भले ही वह खुद पूरी तरह वैध हो। रॉ API आपको इस्तेमाल किया गया मान दो जगह देता है:

  • इसके साथ json=1, रिस्पॉन्स में इस फ़ील्ड के रूप में userAgent
  • सादा टेक्स्ट मोड में इस रिस्पॉन्स हेडर के रूप में X-Turnstile-User-Agent रिस्पॉन्स हेडर।
# -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...

पूरे पेज वाले चैलेंज को ये भी चाहिए data (cData मान) और pagedata (chlPageData), जो सबमिट करने से ठीक पहले पेज से पढ़े जाते हैं। विजेट मोड को इनमें से कोई नहीं चाहिए। Turnstile सॉल्वर पेज इस अंतर को और विस्तार से समझाता है।

GeeTest का जवाब एक नहीं, तीन फ़ील्ड होता है

GeeTest अकेला टोकन नहीं लौटाता। JSON माँगिए और आपको वे तीन मान मिलेंगे जो साइट का अपना फ्रंट एंड वापस भेजता।

{
  "status": 1,
  "request": {
    "geetest_challenge": "...",
    "geetest_validate":  "...",
    "geetest_seccode":   "..."
  }
}

The gt मान हर साइट के लिए स्थिर होता है। challenge मान एक बार का होता है और करीब एक मिनट में मर जाता है, इसलिए इसे सबमिट करने से ठीक पहले लें, लंबी स्क्रिप्ट की शुरुआत में कभी नहीं।

प्रॉक्सी के ज़रिए सॉल्व भेजना

उसी /in.php कॉल में जोड़े गए दो पैरामीटर:

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 या SOCKS5H लेता है। प्रॉक्सी सिर्फ़ reCAPTCHA, Turnstile और GeeTest पर लागू होती है। इमेज सॉल्विंग उन पिक्सल को पढ़ती है जो पहले से आपके पास हैं और लक्ष्य साइट को कभी छूती नहीं, इसलिए वहाँ प्रॉक्सी कुछ नहीं करती।

एक पूरी स्क्रिप्ट

सबमिट करें, सीमा के साथ पोल करें, टोकन प्रिंट करें। करीब बीस लाइनें, इसके अलावा कोई निर्भरता नहीं: 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; } ब्रांच हर उस चीज़ पर चलती है जो यह नहीं है CAPCHA_NOT_READY, जिसमें त्रुटि कोड भी शामिल हैं। यह जानबूझकर है: त्रुटि का मतलब रुकना है, पोल करते रहना नहीं।

इस परत पर मिलने वाली त्रुटियाँ

कोडअर्थफिक्स
ERROR_WRONG_USER_KEYकी गायब थी या खाली थीकोई भी खाली न होने वाला मान भेजें key
ERROR_WRONG_METHODगलत method या actionऊपर की टेबल से वर्तनी मिलाएँ
ERROR_BAD_PARAMETERSएक आवश्यक पैरामीटर गायब हैऊपर आवश्यक पैरामीटर वाले कॉलम से मिलाएँ
ERROR_GOOGLEKEYThe googlekey मान खारिज कर दिया गयाआपने शायद भेजा है sitekey उसकी जगह
ERROR_PAGEURLThe pageurl मान खारिज कर दिया गयास्कीम शामिल करें, और GET की जगह POST करें
CAPCHA_NOT_READYअभी चल रहा हैत्रुटि नहीं। उसी ID को पोल करते रहें
खाली रिस्पॉन्सपहले ही पढ़ा जा चुका, या ऐसी कोई ID नहींनतीजे एक बार पढ़े जाते हैं। पहला ही सहेजें

API जो भी कोड लौटा सकता है, उसकी सटीक शब्दावली यहाँ है: API डॉक्युमेंटेशन.

curl कब छोड़ देना चाहिए

रॉ HTTP एक जल्दी टेस्ट, शेल पाइपलाइन या ऐसी भाषा के लिए बढ़िया है जिसका आधिकारिक क्लाइंट न हो। ऐप्लिकेशन कोड के लिए CapSkip SDKs एक निर्भरता के लायक हैं, सबसे बड़ी वजह यह है: वे एक समान अंतराल पर पोल नहीं करते। वे 250ms से शुरू होते हैं और घटकर इस तक जाते हैं pollingInterval, इसलिए सॉल्व आम तौर पर ऊपर वाले हाथ से लिखे लूप से जल्दी लौटता है, जो हर बार पूरे 15 सेकंड बैठकर बिता देता है।

वे त्रुटि स्ट्रिंग्स को टाइप किए हुए एक्सेप्शन में भी बदल देते हैं और Turnstile का user agent तथा GeeTest का तीन-फ़ील्ड जवाब आपके लिए संभाल लेते हैं। आधिकारिक क्लाइंट Python, Node.js, PHP और .NET के लिए मौजूद हैं।

अक्सर पूछे जाने वाले सवाल

क्या मैं POST की जगह GET इस्तेमाल कर सकता हूँ?

हाँ, दोनों एंडपॉइंट इसे स्वीकार करते हैं। पेच यह है कि अपनी खुद की क्वेरी स्ट्रिंग वाला pageurl पहले बिना एन्कोड किए ऐम्परसैंड पर कट जाएगा, और आपको मिलेगा ERROR_PAGEURL या गलत पेज के लिए सॉल्व। अगर GET ज़रूरी ही हो, तो URL को पहले इससे गुज़ारें --data-urlencode

मुझे कौन सी API की भेजनी चाहिए?

कोई भी खाली न होने वाली स्ट्रिंग। की वैलिडेशन डिफ़ॉल्ट रूप से बंद है क्योंकि सर्विस सिर्फ़ localhost सुनती है, इसलिए key=capskip ठीक चलता है। फिर भी उसका होना ज़रूरी है: छोड़ देंगे तो सॉल्व की जगह मिलेगा ERROR_WRONG_USER_KEY

क्या यह Windows PowerShell से काम करता है?

उपयोग करें curl.exe साफ़-साफ़ लिखें। PowerShell में curl इसका उपनाम है Invoke-WebRequest, जो -d को नहीं समझता और एक पैरामीटर त्रुटि फेंकेगा जो API की समस्या जैसी दिखती है। लिखना curl.exe उपनाम को दरकिनार कर देता है।

क्या मैं एक साथ कई सॉल्व चला सकता हूँ?

हाँ। जितने चाहें टास्क सबमिट करें और हर ID को अलग-अलग पोल करें। कोई चीज़ उन्हें क्रम में नहीं बाँधती और प्रति मिनट कोई कोटा नहीं है, क्योंकि काम किसी साझा कतार में नहीं बल्कि आपके अपने हार्डवेयर पर होता है।

सारांश

टास्क को POST करें /in.phpपर, ID सहेजें, प्रकार के हिसाब से देरी तक रुकें, फिर पोल करें /res.php जब तक इसके अलावा कुछ न मिले CAPCHA_NOT_READY। जोड़ें json=1 अगर जवाब कोई स्क्रिप्ट पढ़ रही हो। नाम की दो फँसाने वाली बातें याद रखें: googlekey reCAPTCHA के लिए, जबकि sitekey Turnstile के लिए, और यह कि नतीजा सिर्फ़ एक बार पढ़ा जा सकता है।

क्योंकि यह आपकी अपनी मशीन पर चलने वाला कैप्चा सॉल्वर है, ऊपर वाले लूप के लिए न कोई कोटा है और न भरने के लिए कोई बैलेंस। इसे localhost पर लगाइए, और एकमात्र सीमा यह है कि आपका CPU कतार को कितनी तेज़ी से निपटाता है।