cURL और रॉ 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 v2 | 15 से 20 सेकंड |
| reCAPTCHA v3 | 10 से 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 मान। वैरिएंट अतिरिक्त पैरामीटर हैं, नए एंडपॉइंट नहीं।
| Type | method | आवश्यक पैरामीटर |
|---|---|---|
| इमेज, अपलोड की गई फ़ाइल | post | file |
| इमेज, base64 | base64 | body |
| reCAPTCHA v2 | userrecaptcha | googlekey, pageurl |
| reCAPTCHA v2 Invisible | userrecaptcha | साथ में invisible=1 |
| reCAPTCHA Enterprise | userrecaptcha | साथ में enterprise=1 |
| reCAPTCHA v3 | userrecaptcha | साथ में version=v3, action |
| Turnstile विजेट | turnstile | sitekey, pageurl |
| Turnstile चैलेंज पेज | turnstile | साथ में data, pagedata |
| GeeTest v3 | geetest | gt, 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 1The || { ...; exit 0; } ब्रांच हर उस चीज़ पर चलती है जो यह नहीं है CAPCHA_NOT_READY, जिसमें त्रुटि कोड भी शामिल हैं। यह जानबूझकर है: त्रुटि का मतलब रुकना है, पोल करते रहना नहीं।
इस परत पर मिलने वाली त्रुटियाँ
| कोड | अर्थ | फिक्स |
|---|---|---|
ERROR_WRONG_USER_KEY | की गायब थी या खाली थी | कोई भी खाली न होने वाला मान भेजें key |
ERROR_WRONG_METHOD | गलत method या action | ऊपर की टेबल से वर्तनी मिलाएँ |
ERROR_BAD_PARAMETERS | एक आवश्यक पैरामीटर गायब है | ऊपर आवश्यक पैरामीटर वाले कॉलम से मिलाएँ |
ERROR_GOOGLEKEY | The googlekey मान खारिज कर दिया गया | आपने शायद भेजा है sitekey उसकी जगह |
ERROR_PAGEURL | The 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 कतार को कितनी तेज़ी से निपटाता है।
