API दस्तावेज़ीकरण
API को अपने एप्लिकेशन में इंटीग्रेट करने के लिए उपलब्ध एंडपॉइंट्स, रिक्वेस्ट फॉर्मेट, पैरामीटर्स, और उदाहरण रिस्पॉन्स के लिए संदर्भ।
यह documentation उन developers के लिए है जो CapSkip को सीधे अपनी scripts, applications, या automation systems में इंटीग्रेट करना चाहते हैं। third party सॉफ़्टवेयर के उपयोगकर्ताओं को setup निर्देशों के लिए Tutorials अनुभाग का पालन करना चाहिए।
CapSkip व्यापक रूप से इस्तेमाल होने वाली कैप्चा हल करने वाली सेवाओं के APIs को एमुलेट करता है, जिससे यह बिना किसी बदलाव के कम्पैटिबल थर्ड-पार्टी सॉफ़्टवेयर से कनेक्ट हो पाता है। इंटीग्रेशन के लिए आमतौर पर सिर्फ़ CapSkip चलाना ही ज़रूरी होता है।
यह दस्तावेज़ बताता है कि अनुरोध कैसे भेजें और परिणाम कैसे प्राप्त करें। CapSkip कई API परिवारों को सपोर्ट करता है, जिनमें 2Captcha स्टाइल API (in.php / res.php), AntiCaptcha, CapMonster, CapSolver, NextCaptcha और EzCaptcha द्वारा उपयोग किया जाने वाला JSON createTask / getTaskResult API, और DeathByCaptcha REST API शामिल हैं। एक ही परिवार की सेवाएँ समान endpoints, अनुरोध और प्रतिक्रिया फ़ॉर्मेट साझा करती हैं। हर सेवा के लिए केवल बेस URL (होस्ट और पोर्ट) अलग होता है।
| API परिवार | सेवाएँ |
|---|---|
| 2captcha-शैली | 2captcha.com, rucaptcha.com, solvecaptcha.com, captchas.io |
| JSON (createTask / getTaskResult) | anti-captcha.com, capmonster.cloud, capsolver.com, nextcaptcha.com, ez-captcha.com |
| DeathByCaptcha | deathbycaptcha.com |
इमेज कैप्चा
एक सामान्य कैप्चा एक ऐसी image है जिसमें विकृत पर human-readable text होता है। इसे हल करने के लिए, उपयोगकर्ता को image में दिखाया गया text टाइप करना होता है।
किसी सामान्य कैप्चा को हल करने के लिए, API endpoint को HTTP POST request के ज़रिए image submit करें। configured local address और port का उपयोग करके request सीधे अपने CapSkip instance को भेजें, उदाहरण के लिए: http://127.0.0.1:PORT/in.php
CapSkip multipart/form-data या Base64-encoded format में images स्वीकार करता है।
Multipart सैंपल फ़ॉर्म
<form method="post" action="http://127.0.0.1:PORT/in.php" enctype="multipart/form-data"> <input type="hidden" name="method" value="post"> Your key: <input type="text" name="key" value="YOUR_APIKEY"> The CAPTCHA file: <input type="file" name="file"> <input type="submit" value="Upload and get the ID"> </form>
YOUR_APIKEY अगर CapSkip में API key validation सक्षम है तो आपकी API key को दर्शाता है। अगर API key validation अक्षम है, तो कोई भी string वैल्यू स्वीकार की जाएगी।
Base64 नमूना form
<form method="post" action="http://127.0.0.1:PORT/in.php"> <input type="hidden" name="method" value="base64"> Your key: <input type="text" name="key" value="YOUR_APIKEY"> The CAPTCHA file body in base64 format: <textarea name="body">BASE64_FILE</textarea> <input type="submit" value="Upload and get the ID"> </form>
YOUR_APIKEY अगर CapSkip में API key validation सक्षम है तो आपकी API key को दर्शाता है। अगर API key validation अक्षम है, तो कोई भी string वैल्यू स्वीकार की जाएगी।
BASE64_FILE Base64-encoded image डेटा है।
POST Request Parameters की सूची
| POST पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| key | स्ट्रिंग | हां | आपकी CapSkip API key। |
| method | स्ट्रिंग | हां |
post: इमेज को multipart/form-data का इस्तेमाल करके सबमिट करें base64: इमेज को एक Base64-एन्कोडेड स्ट्रिंग के रूप में सबमिट करें |
| file | फ़ाइल | हाँ* |
कैप्चा image file। * method=post होने पर आवश्यक। |
| body | स्ट्रिंग | हाँ* |
Base64-encoded कैप्चा image data। * method=base64 होने पर आवश्यक। |
| json | पूर्णांक डिफ़ॉल्ट: 0 |
नहीं |
0: रिस्पॉन्स प्लेन टेक्स्ट के रूप में लौटाया जाता है 1: response JSON format में लौटाया जाता है |
कैप्चा सबमिट करें (multipart file upload):
curl -X POST -F "key=YOUR_API_KEY" -F "method=post" -F "[email protected]" http://127.0.0.1:8080/in.php
कैप्चा सबमिट करें (base64 encoded):
curl -X POST -d "key=YOUR_API_KEY&method=base64&body=BASE64_IMAGE_DATA" http://127.0.0.1:8080/in.php
request सबमिट करने के बाद, अगर सब कुछ सही है, तो CapSkip कैप्चा ID को plain text के रूप में लौटाएगा: OK|12345
अगर json=1 parameter इस्तेमाल होता है, तो रिस्पॉन्स JSON फ़ॉर्मैट में लौटाया जाएगा:
{
"status":1,
"request":"12345"
}
1 सेकंड प्रतीक्षा करें, फिर result endpoint पर एक HTTP GET request भेजें (/res.php) लौटाई गई कैप्चा ID के साथ।
अगर कैप्चा हल हो गया है, तो CapSkip परिणाम को plain text के रूप में लौटाएगा: OK|TEXT
अगर json=1 निर्दिष्ट किया गया था, तो रिस्पॉन्स होगा:
{
"status":1,
"request":"TEXT"
}
अगर कैप्चा अभी तक हल नहीं हुआ है, तो CapSkip यह लौटाएगा: CAPCHA_NOT_READY
इस मामले में, 1 सेकंड रुकें और अंतिम रिज़ल्ट मिलने तक रिक्वेस्ट दोहराएँ। अगर CapSkip खाली response body लौटाता है, तो रिज़ल्ट पहले ही रिट्रीव किया जा चुका है या ID मौजूद नहीं है। हर रिज़ल्ट सिर्फ़ एक बार पढ़ा जा सकता है।
GET request parameters की सूची
| GET पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| key | स्ट्रिंग | हां | आपकी CapSkip API key। |
| action | स्ट्रिंग | हां | get: सबमिट किए गए कैप्चा के लिए answer प्राप्त करें। |
| id | पूर्णांक | हां |
इसके द्वारा लौटाया गया कैप्चा ID in.php.
|
| json | पूर्णांक डिफ़ॉल्ट: 0 |
नहीं |
0: रिस्पॉन्स प्लेन टेक्स्ट के रूप में लौटाया जाता है 1: response JSON format में लौटाया जाता है |
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=CAPTCHA_ID"
reCAPTCHA V2
reCAPTCHA v2, जिसे “I’m not a robot” reCAPTCHA के नाम से भी जाना जाता है, एक व्यापक रूप से इस्तेमाल होने वाला कैप्चा प्रकार है। विज़िटर एक चेकबॉक्स पर टिक करता है, और Google या तो उसे तुरंत आगे जाने देता है या फ़ॉर्म सबमिट होने से पहले मिलती-जुलती तस्वीरें चुनने के लिए कहता है।
reCAPTCHA v2 हल करने के लिए, भेजें the googlekey और pageurl पैरामीटर्स के साथ method=userrecaptcha और आपकी CapSkip API key।
आप प्राप्त कर सकते हैं googlekey निम्नलिखित में से किसी एक method का उपयोग करके:
reCAPTCHA widget पर right-click करें और चुनें जाँचें। एक ऐसा URL ढूँढें जो इससे शुरू हो:
www.google.com/recaptcha/api2/anchor
इसका value कॉपी करें k उस URL से parameter। वैकल्पिक रूप से, इसे ढूंढें data-sitekey पेज source में attribute और उसकी value कॉपी करें।

जैसे ही आपके पास site key हो, एक HTTP GET या POST request सबमिट करें http://127.0.0.1:PORT/in.php
POST Request Parameters की सूची
| पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| key | स्ट्रिंग | हां | आपकी CapSkip API key। |
| method | स्ट्रिंग | हां | userrecaptcha: एक reCAPTCHA v2 request निर्दिष्ट करता है। |
| googlekey | स्ट्रिंग | हां | इसका value k या data-sitekey टारगेट पेज पर पाया गया पैरामीटर। |
| pageurl | स्ट्रिंग | हां | उस पेज का पूरा URL जहाँ reCAPTCHA स्थित है। |
| enterprise | पूर्णांक डिफ़ॉल्ट: 0 |
नहीं |
1: reCAPTCHA Enterprise v2 को दर्शाता है। 0: मानक reCAPTCHA v2। |
| invisible | पूर्णांक डिफ़ॉल्ट: 0 |
नहीं |
1: Invisible reCAPTCHA दर्शाता है। 0: standard checkbox reCAPTCHA। |
| data-s | स्ट्रिंग | नहीं | का मान data-s page पर मिलने वाला parameter। Google Search और कुछ Google services पर लागू। |
| json | पूर्णांक डिफ़ॉल्ट: 0 |
नहीं |
0: response सादे टेक्स्ट के रूप में लौटाया जाता है। 1: response को JSON format में लौटाया जाता है। |
| proxy | स्ट्रिंग | नहीं | प्रॉक्सी पता। IP authentication के लिए format: IP:PORT (उदाहरण: 123.123.123.123:3128). login/password authentication के लिए format: login:password@IP:PORT |
| proxytype | स्ट्रिंग | नहीं | प्रॉक्सी का प्रकार। समर्थित values: HTTP, HTTPS, SOCKS5, SOCKS5H। डिफ़ॉल्ट: HTTP जब proxy प्रदान किया गया है पर proxytype छोड़ दिया जाता है। |
reCAPTCHA v2 सबमिट करें (Standard):
curl -X POST -d "key=YOUR_API_KEY&method=userrecaptcha&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://example.com" http://127.0.0.1:8080/in.php
reCAPTCHA v2 सबमिट करें (Invisible):
curl -X POST -d "key=YOUR_API_KEY&method=userrecaptcha&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://example.com&invisible=1" http://127.0.0.1:8080/in.php
Enterprise reCAPTCHA v2 सबमिट करें:
curl -X POST -d "key=YOUR_API_KEY&method=userrecaptcha&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://example.com&enterprise=1" http://127.0.0.1:8080/in.php
Enterprise reCAPTCHA v2 (Invisible) submit करें:
curl -X POST -d "key=YOUR_API_KEY&method=userrecaptcha&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://example.com&enterprise=1&invisible=1" http://127.0.0.1:8080/in.php
अगर request सफल होती है, तो CapSkip कैप्चा ID को plain text के रूप में लौटाएगा: OK|12345
अगर json=1 पैरामीटर का उपयोग किया गया था, तो response को JSON format में लौटाया जाएगा:
{
"status":1,
"request":"12345"
}
अगर request फेल होती है, तो CapSkip एक error code लौटाएगा।
15 से 20 सेकंड प्रतीक्षा करें, फिर हल प्राप्त करने के लिए result endpoint पर एक HTTP GET request भेजें: http://127.0.0.1:PORT/res.php
GET request parameters की सूची
| GET पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| key | स्ट्रिंग | हां | आपकी CapSkip API key। |
| action | स्ट्रिंग | हां | get: सबमिट किए गए कैप्चा के लिए answer प्राप्त करें। |
| id | पूर्णांक | हां |
इसके द्वारा लौटाया गया कैप्चा ID in.php.
|
| json | पूर्णांक डिफ़ॉल्ट: 0 |
नहीं |
0 response को plain text के रूप में लौटाता है। 1 response को JSON के रूप में लौटाता है, जिसमें userAgent value भी शामिल होती है, जब वह उपलब्ध हो।
|
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=CAPTCHA_ID"
अगर कैप्चा हल हो गया है, तो CapSkip plain text या JSON में जवाब देगा और answer token लौटाएगा। token नीचे दिए गए जैसा दिखेगा:
03AHJ_Vuve5Asa4koK3KSMyUkCq0vUFCR5Im4CwB7PzO3dCxIo11i53epEraq-uBO5mVm2XRikL8iKOWr0aG50sCuej9bXx5qcviUGSm4iK4NC_Q88flavWhaTXSh0VxoihBwBjXxwXuJZ-WGN5Sy4dtUl2wbpMqAj8Zwup1vyCaQJWFvRjYGWJ_TQBKTXNB5CCOgncqLetmJ6B6Cos7qoQyaB8ZzBOTGf5KSP6e-K9niYs772f53Oof6aJeSUDNjiKG9gN3FTrdwKwdnAwEYX-F37sI_vLB1Zs8NQo0PObHYy0b0sf7WSLkzzcIgW9GR0FwcCCm1P8lB-50GQHPEBJUHNnhJyDzwRoRAkVzrf7UkV8wKCdTwrrWqiYDgbrzURfHc2ESsp020MicJTasSiXmNRgryt-gf50q5BMkiRH7osm4DoUgsjc_XyQiEmQmxl5sqZP7aKsaE-EM00x59XsPzD3m3YI6SRCFRUevSyumBd7KmXE8VuzIO9lgnnbka4-eZynZa6vbB9cO3QjLH0xSG3-egcplD1uLGh79wC34RF49Ui3eHwua4S9XHpH6YBe7gXzz6_mv-o-fxrOuphwfrtwvvi2FGfpTexWvxhqWICMFTTjFBCEGEgj7_IFWEKirXW2RTZCVF0Gid7EtIsoEeZkPbrcUISGmgtiJkJ_KojuKwImF0G0CsTlxYTOU2sPsd5o1JDt65wGniQR2IZufnPbbK76Yh_KI2DY4cUxMfcb2fAXcFMc9dcpHg6f9wBXhUtFYTu6pi5LhhGuhpkiGcv6vWYNxMrpWJW_pV7q8mPilwkAP-zw5MJxkgijl2wDMpM-UUQ_k37FVtf-ndbQAIPG7S469doZMmb5IZYgvcB4ojqCW3Vz6Q
हर token उसी browser User-Agent के साथ आता है जिससे वह प्राप्त किया गया था। इसके साथ json=1 response में शामिल है एक userAgent field, इसके साथ में: request। plain text मोड में, वही value यहाँ से पढ़ें X-Recaptcha-User-Agent रिस्पॉन्स हेडर। अगर आप JSON API इस्तेमाल करते हैं, तो getTaskResult इसे इस रूप में लौटाता है: solution.userAgent। token सबमिट करते समय यही User-Agent भेजें, क्योंकि कुछ साइटें जाँचती हैं कि दोनों मेल खाते हैं। जब कोई User-Agent उपलब्ध नहीं होता, तो field और header शामिल नहीं किए जाते।
{
"status": 1,
"request": "03AHJ_Vuve5Asa4koK3KSMyUkCq0vUFCR5Im4CwB7PzO3dCxIo11i53epEraq...",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36"
}
अगर कैप्चा अभी तक हल नहीं हुआ है, तो CapSkip लौटाएगा CAPCHA_NOT_READY। इस स्थिति में, 5 सेकंड प्रतीक्षा करें और request दोहराएँ। अगर CapSkip एक खाली response body लौटाता है, तो या तो result पहले ही प्राप्त किया जा चुका है या ID मौजूद नहीं है। प्रत्येक result को केवल एक बार पढ़ा जा सकता है।
इस ID वाले element को ढूंढें g-recaptcha-response और इसे हटाकर दृश्यमान बनाएँ display: none स्टाइल।

कृपया ध्यान दें: कुछ मामलों में, पेज की सामग्री गतिशील रूप से जेनरेट होती है, और
g-recaptcha-responseelement may not appear in the static HTML source. In such situations, inspect the page structure using your browser’s developer tools to locate the dynamically generated element.
एक विकल्प के रूप में, आप JavaScript का उपयोग करके इसका मान सेट कर सकते हैं g-recaptcha-response field सीधे:
document.getElementById("g-recaptcha-response").innerHTML="TOKEN";
पेज पर एक इनपुट फ़ील्ड दिखाई देगा। उत्तर टोकन को उस फ़ील्ड में पेस्ट करें और फॉर्म सबमिट करें।
reCAPTCHA V2 Callback
कुछ मामलों में, कोई submit button नहीं होता और इसके बजाय एक callback function इस्तेमाल होता है। reCAPTCHA हल होने पर callback function अपने आप execute हो जाता है।
POST और GET request parameters की सूची यहाँ उपलब्ध है: reCAPTCHA V2 POST और GET request पैरामीटर
callback function आम तौर पर इसमें परिभाषित होता है data-callback reCAPTCHA widget का attribute, उदाहरण के लिए:
data-callback="myCallbackFunction"
अन्य मामलों में, callback फंक्शन को इस रूप में परिभाषित किया जाता है callback इसका parameter the grecaptcha.render() function, उदाहरण के लिए:
grecaptcha.render('example', {
'sitekey' : 'someSitekey',
'callback' : myCallbackFunction,
'theme' : 'dark'
});
callback फ़ंक्शन ढूंढने का एक और तरीका है browser का JavaScript console खोलना और reCAPTCHA configuration object का निरीक्षण करना:
___grecaptcha_cfg.clients[0].aa.l.callback
ध्यान दें कि aa.l property अलग हो सकती है, और पेज पर कई reCAPTCHA clients हो सकते हैं। ऐसे मामलों में, आपको यह भी inspect करना चाहिए clients[1], clients[2], और सही configuration object खोजने के लिए अन्य entries।
वैकल्पिक रूप से, आप reCAPTCHA parameters अपने आप निकालने के लिए निम्नलिखित script का उपयोग कर सकते हैं:
function findRecaptchaClients() {
if (typeof (___grecaptcha_cfg) !== 'undefined') {
return Object.entries(___grecaptcha_cfg.clients).map(([cid, client]) => {
const data = { id: cid, version: cid >= 10000 ? 'V3' : 'V2' };
const objects = Object.entries(client).filter(([_, value]) => value && typeof value === 'object');
objects.forEach(([toplevelKey, toplevel]) => {
const found = Object.entries(toplevel).find(([_, value]) => (
value && typeof value === 'object' && 'sitekey' in value && 'size' in value
));
if (typeof toplevel === 'object' && toplevel instanceof HTMLElement && toplevel['tagName'] === 'DIV'){
data.pageurl = toplevel.baseURI;
}
if (found) {
const [sublevelKey, sublevel] = found;
data.sitekey = sublevel.sitekey;
const callbackKey = data.version === 'V2' ? 'callback' : 'promise-callback';
const callback = sublevel[callbackKey];
if (!callback) {
data.callback = null;
data.function = null;
} else {
data.function = callback;
const keys = [cid, toplevelKey, sublevelKey, callbackKey].map((key) => `['${key}']`).join('');
data.callback = `___grecaptcha_cfg.clients${keys}`;
}
}
});
return data;
});
}
return [];
}
अंत में, callback function को call करें:
myCallbackFunction();
या वैकल्पिक रूप से:
___grecaptcha_cfg.clients[0].aa.l.callback();
कुछ मामलों में, callback फंक्शन को एक आर्गुमेंट की आवश्यकता होती है। अधिकांश स्थितियों में, आपको हल किए गए टोकन को उस आर्गुमेंट के रूप में पास करना चाहिए। उदाहरण के लिए:
myCallbackFunction('TOKEN');
reCAPTCHA V2 Invisible
reCAPTCHA v2 में एक Invisible mode भी होता है। आप यहाँ एक उदाहरण देख सकते हैं:
https://www.google.com/recaptcha/api2/demo?invisible=true
Invisible reCAPTCHA “I’m not a robot” checkbox नहीं दिखाता। इसके बजाय, यह आमतौर पर किसी बटन से जुड़ा होता है या पेज लोड या यूज़र इंटरैक्शन पर अपने आप ट्रिगर होता है, जैसे किसी बटन पर क्लिक करना या फॉर्म सबमिट करना।
आंतरिक रूप से, Invisible reCAPTCHA widget एक छिपे हुए के अंदर render होता है <div> दृश्यमान viewport के बाहर स्थित element, जो इसे उपयोगकर्ता के लिए अदृश्य बना देता है।
उपयोगकर्ता के cookies और risk score के आधार पर, reCAPTCHA बिना कोई challenge दिखाए अपने आप पास हो सकता है। अन्यथा, एक standard image challenge दिखाई देगा।
अधिकांश मामलों में, चैलेंज पूरा होने पर एक callback फंक्शन एक्ज़ीक्यूट होता है। अधिक विवरण के लिए ऊपर callback सेक्शन देखें।
POST और GET request parameters की सूची यहाँ उपलब्ध है: reCAPTCHA V2 POST और GET request पैरामीटर
कैसे तय करें कि reCAPTCHA Invisible है या नहीं?
आप निम्नलिखित संकेतकों में से किसी एक का उपयोग करके Invisible reCAPTCHA पहचान सकते हैं:
“I’m not a robot” checkbox दिखता नहीं है, पर उपयोगकर्ता के इंटरैक्शन के बाद एक challenge दिखता है।
reCAPTCHA iframe URL में parameter होता है
size=invisible.reCAPTCHA कॉन्फ़िगरेशन ऑब्जेक्ट में शामिल है एक
sizeप्रॉपर्टी इस पर सेटinvisible, उदाहरण के लिए:___grecaptcha_cfg.clients[0].aa.l.size === "invisible"
API के ज़रिए Invisible reCAPTCHA हल करते समय, यह पैरामीटर शामिल करें: invisible=1
Browser में Invisible reCAPTCHA को कैसे संभालें?
तरीक़ा 1: JavaScript का उपयोग
इसका मान सेट करें g-recaptcha-response field को CapSkip द्वारा लौटाए गए token पर:
document.getElementById("g-recaptcha-response").innerHTML="TOKEN";
token सेट करने के बाद, वह action निष्पादित करें जो आमतौर पर सफल वेरिफ़िकेशन के बाद होता है।
अधिकांश मामलों में, इसका मतलब है एक फॉर्म सबमिट करना। आपको सही फॉर्म को उसके आधार पर पहचानना होता है id, name, या कोई अन्य attribute, और फिर submission को ट्रिगर करें। यहाँ कुछ उदाहरण हैं:
document.getElementById("recaptcha-demo-form").submit(); //by id "recaptcha-demo-form"
document.getElementsByName("myFormName")[0].submit(); //by element name "myFormName"
document.getElementsByClassName("example").submit(); //by class name "example"
कुछ मामलों में, reCAPTCHA हल होने पर एक callback फ़ंक्शन अपने आप निष्पादित होता है।
callback function आम तौर पर इसमें परिभाषित होता है data-callback reCAPTCHA widget का attribute, उदाहरण के लिए:
data-callback="myCallbackFunction"
अन्य मामलों में, callback फंक्शन को इस रूप में परिभाषित किया जाता है callback इसका parameter the grecaptcha.render() function, उदाहरण के लिए:
grecaptcha.render('example', {
'sitekey' : 'someSitekey',
'callback' : myCallbackFunction,
'theme' : 'dark'
});
आपको बस उस फंक्शन को कॉल करना है:
myCallbackFunction();
विधि 2: HTML को संशोधित करना
हटाएँ the <div> वह element जो page body से reCAPTCHA widget रखता है।
<div style="visibility: hidden; position: absolute; width:100%; top: -10000px; left: 0px; right: 0px; transition: visibility 0s linear 0.3s, opacity 0.3s linear; opacity: 0;">
<div style="width: 100%; height: 100%; position: fixed; top: 0px; left: 0px; z-index: 2000000000; background-color: #fff; opacity: 0.5; filter: alpha(opacity=50)"></div>
<div style="margin: 0 auto; top: 0px; left: 0px; right: 0px; position: absolute; border: 1px solid #ccc; z-index: 2000000000; background-color: #fff; overflow: hidden;">
<iframe src="https://www.google.com/recaptcha/api2/bframe?hl=en&v=r20170213115309&k=6LfP0CITAAAAAHq9FOgCo7v_fb0-pmmH9VW3ziFs#zglq3yifgkmj"
title="recaptcha challenge"
style="width: 100%; height: 100%;"
scrolling="no"
name="zglq3yifgkmj"
frameborder="0"></iframe>
</div>
</div>
पेज से पूरा reCAPTCHA block हटा दें।
<div class="">
<!-- BEGIN: ReCAPTCHA implementation example. -->
<div
id="recaptcha-demo"
class="g-recaptcha"
data-sitekey="6LfP0CITAAAAAHq9FOgCo7v_fb0-pmmH9VW3ziFs"
data-callback="onSuccess"
data-bind="recaptcha-demo-submit"
>
<div
class="grecaptcha-badge"
style="width: 256px; height: 60px; transition: right 0.3s ease 0s; position: fixed; bottom: 14px; right: -186px; box-shadow: 0px 0px 5px gray;"
>
<div class="grecaptcha-logo">
<iframe
src="https://www.google.com/recaptcha/api2/anchor?k=6LfP0CITAAAAAHq9FOgCo7v_fb0-pmmH9VW3ziFs&co=aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbTo0NDM.&hl=en&v=r20170213115309&size=invisible&cb=uror1hlow5a"
title="recaptcha widget"
scrolling="no"
name="undefined"
width="256"
height="60"
frameborder="0"
></iframe>
</div>
<div class="grecaptcha-error"></div>
<textarea
id="g-recaptcha-response"
name="g-recaptcha-response"
class="g-recaptcha-response"
style="width: 250px; height: 40px; border: 1px solid #c1c1c1; margin: 10px 25px; padding: 0px; resize: none; display: none; "
></textarea>
</div>
</div>
<script>
var onSuccess = function (response) {
var errorDivs = document.getElementsByClassName('recaptcha-error');
if (errorDivs.length) {
errorDivs[0].className = '';
}
var errorMsgs = document.getElementsByClassName('recaptcha-error-message');
if (errorMsgs.length) {
errorMsgs[0].parentNode.removeChild(errorMsgs[0]);
}
document.getElementById('recaptcha-demo-form').submit();
};
</script>
<!-- Optional noscript fallback. --><!-- END: ReCAPTCHA implementation example. -->
</div>
हटाए गए ब्लॉक के स्थान पर निम्नलिखित कोड डालें:
<input type="submit" /> <textarea name="g-recaptcha-response">%g-recaptcha-response%</textarea>
%g-recaptcha-response% CapSkip से प्राप्त उत्तर token को दर्शाता है।
block को बदलने के बाद, एक “Submit query” button दिखाई देगा। form को इसके साथ सबमिट करने के लिए button पर क्लिक करें g-recaptcha-response मान और अन्य सभी आवश्यक फॉर्म डेटा वेबसाइट को।
reCAPTCHA V3
reCAPTCHA v3 Google द्वारा विकसित एक आधुनिक कैप्चा तंत्र है। यह कोई दिखने वाला challenge पेश नहीं करता और किसी user interaction की ज़रूरत नहीं होती। इसके बजाय, यह इस संभावना के आधार पर एक score देता है कि interaction इंसानी है।
तकनीकी रूप से, reCAPTCHA v3, reCAPTCHA v2 के समान है। वेबसाइट को reCAPTCHA API से एक token प्राप्त होता है, जिसे फिर एक POST request में लक्ष्य सर्वर पर भेजा जाता है और reCAPTCHA API के माध्यम से सत्यापित किया जाता है।
मुख्य अंतर यह है कि reCAPTCHA v3 कोई दृश्यमान challenge नहीं दिखाता। इसके बजाय, यह एक रेटिंग लौटाता है जो अनुमान लगाती है कि उपयोगकर्ता इंसान है या बॉट। इस रेटिंग को कहते हैं score और 0.0 से 1.0 तक होता है। स्कोर वेबसाइट को भेजा जाता है, जो फिर उस वैल्यू के आधार पर तय करती है कि रिक्वेस्ट को कैसे संभालना है।
एक अतिरिक्त पैरामीटर भी है जिसे कहते हैं action, जो वेबसाइट को विभिन्न उपयोगकर्ता इंटरैक्शन के बीच अंतर करने की अनुमति देता है। token को सत्यापित करने के बाद, reCAPTCHA API request से जुड़े action name को लौटाता है।
CapSkip का उपयोग करके reCAPTCHA v3 कैसे हल करें?
पहले, पुष्टि करें कि टारगेट वेबसाइट reCAPTCHA v3 इस्तेमाल कर रही है।
reCAPTCHA v3 के संकेतकों में शामिल हैं:
कोई दिखने वाला कैप्चा या image challenge नहीं
The
api.jsscript इसके साथ लोड होती हैrender=SITEKEYपैरामीटर, उदाहरण के लिए:https://www.google.com/recaptcha/api.js?render=SITEKEYThe
___grecaptcha_cfg.clientsarray में एक उच्च numeric index वाली entry होती है, जैसे किclients[100000]
reCAPTCHA v3 हल करने के लिए, निम्नलिखित parameters की पहचान करें:
- sitekey
यह इसमें पाया जा सकता हैrenderइसका parameter theapi.jsस्क्रिप्ट URL। यह एक iframe URL में भी दिखाई दे सकता है, उस JavaScript कोड के भीतर जो कॉल करता हैgrecaptcha.execute(), या इसके अंदर___grecaptcha_cfgconfiguration object। - action
इसे JavaScript code में इन calls के निरीक्षण द्वारा खोजेंgrecaptcha.execute(), उदाहरण के लिए:grecaptcha.execute('SITEKEY', {action: 'do_something'})कुछ मामलों में, action ढूँढने के लिए page द्वारा load की गई कई JavaScript files की समीक्षा करनी पड़ती है। अगर आप action value तय नहीं कर पाते, तो आप default value इस्तेमाल कर सकते हैं"verify". - pageurl
उस page का पूरा URL जहां reCAPTCHA v3 लागू किया गया है।
स्कोर को समझना
स्वीकार्य स्कोर थ्रेशोल्ड वेबसाइट के अनुसार अलग-अलग होता है और केवल टेस्टिंग के माध्यम से निर्धारित किया जा सकता है। स्कोर की रेंज:
0.0 → संभवतः बॉट
1.0 → संभवतः इंसान
अधिकांश वेबसाइटें 0.3 और 0.7 के बीच thresholds इस्तेमाल करती हैं, क्योंकि वैध उपयोगकर्ताओं को भी कम scores मिल सकते हैं।
आप अपना इच्छित threshold इसका इस्तेमाल करके पास कर सकते हैं min_score parameter, पर अंतिम स्कोर हमेशा वेरिफ़िकेशन के समय Google द्वारा तय किया जाता है और सॉल्वर द्वारा इसकी गारंटी नहीं दी जा सकती।
POST Request Parameters की सूची
| पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| key | स्ट्रिंग | हां | आपकी CapSkip API key। |
| method | स्ट्रिंग | हां | userrecaptcha: एक reCAPTCHA request निर्दिष्ट करता है। |
| version | स्ट्रिंग | हां | v3: दर्शाता है कि request reCAPTCHA v3 के लिए है। |
| googlekey | स्ट्रिंग | हां | इसका value data-sitekey टारगेट पेज पर पाया गया पैरामीटर। |
| pageurl | स्ट्रिंग | हां | उस पेज का पूरा URL जहाँ reCAPTCHA स्थित है। |
| enterprise | पूर्णांक डिफ़ॉल्ट: 0 |
नहीं |
1: reCAPTCHA Enterprise v3 दर्शाता है। 0: मानक reCAPTCHA v3। |
| action | स्ट्रिंग डिफ़ॉल्ट: verify |
नहीं | इसका value action पेज पर परिभाषित पैरामीटर। |
| min_score | Float | नहीं | token के लिए अनुरोधित न्यूनतम score। जब आपका server token सत्यापित करता है तब Google अंतिम score असाइन करता है, इसलिए यह वैल्यू एक संकेत है और इसकी गारंटी नहीं है। Google बाद में जो भी score असाइन करे उससे बेपरवाह, CapSkip जो token हासिल करता है वह लौटा देता है। |
| json | पूर्णांक डिफ़ॉल्ट: 0 |
नहीं |
0: response सादे टेक्स्ट के रूप में लौटाया जाता है। 1: response को JSON format में लौटाया जाता है। |
| proxy | स्ट्रिंग | नहीं | प्रॉक्सी पता। IP authentication के लिए format: IP:PORT (उदाहरण: 123.123.123.123:3128). login/password authentication के लिए format: login:password@IP:PORT |
| proxytype | स्ट्रिंग | नहीं | प्रॉक्सी का प्रकार। समर्थित values: HTTP, HTTPS, SOCKS5, SOCKS5H। डिफ़ॉल्ट: HTTP जब proxy प्रदान किया गया है पर proxytype छोड़ दिया जाता है। |
reCAPTCHA v3 सबमिट करें:
curl -X POST -d "key=YOUR_API_KEY&method=userrecaptcha&version=v3&action=submit&min_score=0.7&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://example.com" http://127.0.0.1:8080/in.php
Enterprise reCAPTCHA v3 सबमिट करें:
curl -X POST -d "key=YOUR_API_KEY&method=userrecaptcha&version=v3&action=submit&min_score=0.7&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://example.com&enterprise=1" http://127.0.0.1:8080/in.php
अगर request सफल होती है, तो CapSkip कैप्चा ID को plain text के रूप में लौटाएगा: OK|12345
अगर json=1 पैरामीटर निर्दिष्ट किया गया है, तो response को JSON format में लौटाया जाएगा:
{
"status":1,
"request":"12345"
}
अगर कोई error होता है, तो CapSkip एक error code लौटाएगा।
10 से 15 सेकंड प्रतीक्षा करें, फिर result endpoint पर एक HTTP GET request भेजें: http://127.0.0.1:PORT/res.php
अपनी request में लौटाई गई CAPTCHA ID दें। उपलब्ध parameters की पूरी सूची नीचे तालिका में दिखाई गई है।
अगर कैप्चा सफलतापूर्वक हल हो गया है, तो CapSkip नतीजा plain text या JSON format में लौटाएगा। लौटाई गई value नीचे दी गई जैसी एक verification token होती है:
03AHJ_Vuve5Asa4koK3KSMyUkCq0vUFCR5Im4CwB7PzO3dCxIo11i53epEraq-uBO5mVm2XRikL8iKOWr0aG50sCuej9bXx5qcviUGSm4iK4NC_Q88flavWhaTXSh0VxoihBwBjXxwXuJZ-WGN5Sy4dtUl2wbpMqAj8Zwup1vyCaQJWFvRjYGWJ_TQBKTXNB5CCOgncqLetmJ6B6Cos7qoQyaB8ZzBOTGf5KSP6e-K9niYs772f53Oof6aJeSUDNjiKG9gN3FTrdwKwdnAwEYX-F37sI_vLB1Zs8NQo0PObHYy0b0sf7WSLkzzcIgW9GR0FwcCCm1P8lB--gf50q5BMkiRH7osm4DoUgsjc_XyQiEmQmxl5sqZP7aKsaE-EM00x59XsPzD3m3YI6SRCFRUevSyumBd7KmXE8VuzIO9lgnnbka4-eZynZa6vbB9cO3QjLH0xSG3--o-fxrOuphwfrtwvvi2FGfpTexWvxhqWICMFTTjFBCEGEgj7_IFWEKirXW2RTZCVF0Gid7EtIsoEeZkPbrcUISGmgtiJkJ_KojuKwImF0G0CsTlxYTOU2sPsd5o1JDt65wGniQR2IZufnPbbK76Yh_KI2DY4cUxMfcb2fAXcFMc9dcpHg6f9wBXhUtFYTu6pi5LhhGuhpkiGcv6vWYNxMrpWJW_pV7q8mPilwkAP-zw5MJxkgijl2wDMpM-UUQ_k37FVtf-ndbQAIPG7S469doZMmb5IZYgvcB4ojqCW3Vz6Q
हर token उसी browser User-Agent के साथ आता है जिससे वह प्राप्त किया गया था। इसके साथ json=1 response में शामिल है एक userAgent field, इसके साथ में: request। plain text मोड में, वही value यहाँ से पढ़ें X-Recaptcha-User-Agent रिस्पॉन्स हेडर। अगर आप JSON API इस्तेमाल करते हैं, तो getTaskResult इसे इस रूप में लौटाता है: solution.userAgent। token सबमिट करते समय यही User-Agent भेजें, क्योंकि कुछ साइटें जाँचती हैं कि दोनों मेल खाते हैं। जब कोई User-Agent उपलब्ध नहीं होता, तो field और header शामिल नहीं किए जाते।
{
"status": 1,
"request": "03AHJ_Vuve5Asa4koK3KSMyUkCq0vUFCR5Im4CwB7PzO3dCxIo11i53epEraq...",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36"
}
अगर कैप्चा अभी तक हल नहीं हुआ है, तो CapSkip लौटाएगा CAPCHA_NOT_READY। 5 सेकंड प्रतीक्षा करें और request दोहराएं। अगर CapSkip एक खाली response body लौटाता है, तो या तो नतीजा पहले ही retrieve किया जा चुका है या वह ID मौजूद नहीं है। हर नतीजा केवल एक बार पढ़ा जा सकता है।
GET request parameters की सूची
| GET पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| key | स्ट्रिंग | हां | आपकी CapSkip API key। |
| action | स्ट्रिंग | हां | get: सबमिट किए गए कैप्चा के लिए answer प्राप्त करें। |
| id | पूर्णांक | हां |
इसके द्वारा लौटाया गया कैप्चा ID in.php.
|
| json | पूर्णांक डिफ़ॉल्ट: 0 |
नहीं |
0 response को plain text के रूप में लौटाता है। 1 response को JSON के रूप में लौटाता है, जिसमें userAgent value भी शामिल होती है, जब वह उपलब्ध हो।
|
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=CAPTCHA_ID"
CapSkip से token मिलने के बाद, आपको इसे सही तरीके से टारगेट वेबसाइट को सबमिट करना होगा। यह कैसे काम करता है इसे समझने का सबसे अच्छा तरीका है सामान्य उपयोगकर्ता की तरह वेरिफ़िकेशन पूरा करते समय भेजी गई रिक्वेस्ट्स को देखना। ज़्यादातर browsers developer tools देते हैं जिनमें एक Network tab जो आपको आउटगोइंग requests का निरीक्षण करने देता है।
ज़्यादातर मामलों में, token एक POST request के माध्यम से भेजा जाता है। parameter name हो सकता है g-recaptcha-response, reCAPTCHA v2 के समान, या कुछ ऐसा जैसे g-recaptcha-response-100000। कुछ कार्यान्वयनों में, एक अलग parameter name का उपयोग किया जा सकता है।
आपको network requests का निरीक्षण करके यह तय करना चाहिए कि token कैसे प्रसारित होता है और फिर उसके अनुसार अपनी request की संरचना करनी चाहिए।
reCAPTCHA Enterprise
reCAPTCHA Enterprise, Google के reCAPTCHA सिस्टम का उन्नत संस्करण है। यह v2 और v3 दोनों मोड में काम कर सकता है और वेबसाइट एडमिनिस्ट्रेटर को अतिरिक्त नियंत्रण देता है, जिसमें यह आकलन और रिपोर्ट करने की क्षमता शामिल है कि कोई इंटरैक्शन इंसानी था या स्वचालित।
reCAPTCHA Enterprise कैसे हल करें?
पहला कदम यह निर्धारित करना है कि website reCAPTCHA के Enterprise संस्करण का उपयोग कर रही है या नहीं।
reCAPTCHA Enterprise के मुख्य संकेतकों में शामिल हैं:
पेज लोड होता है
enterprise.jsके बजायapi.js, उदाहरण के लिए:<script src="https://recaptcha.net/recaptcha/enterprise.js" async defer></script>
वेबसाइट का JavaScript कोड कॉल करता है
grecaptcha.enterprise.METHODके बजायgrecaptcha.METHOD
इसके बाद तय करें कि कौन सा implementation इस्तेमाल हो रहा है: v2, Invisible v2, या v3। इसे आम तौर पर यह विश्लेषण करके पहचाना जा सकता है कि widget कैसे render होता है और page पर कैसे व्यवहार करता है।
सही इम्प्लीमेंटेशन तय करने के लिए नीचे दिए flowchart का पालन करें। यह अधिकांश मामलों में लागू होता है।

कैप्चा parameters को उसी तरह पहचानें जैसा reCAPTCHA v2 या v3 के लिए बताया गया है।
v2 Enterprise implementations के लिए, कुछ अतिरिक्त वैकल्पिक data हो सकता है। ज़्यादातर मामलों में, यह एक custom string होता है जो में परिभाषित होता है s या data-s parameter। अगर मौजूद हो, तो इस मान को अपनी रिक्वेस्ट में इसका इस्तेमाल करते हुए शामिल करें data-s पैरामीटर।
POST और GET request parameters की सूची यहाँ उपलब्ध है: reCAPTCHA V2 POST और GET request पैरामीटर
v3 Enterprise कार्यान्वयनों के लिए, आपको इसकी भी ज़रूरत हो सकती है action value। इसे ढूँढने के लिए, website’s के JavaScript code का निरीक्षण करें और खोजें grecaptcha.enterprise.execute() कॉल। यह action पैरामीटर आमतौर पर इस फंक्शन के भीतर पास किया जाता है। ध्यान रखें कि action वैकल्पिक है और कुछ मामलों में undefined हो सकता है।
POST और GET request parameters की सूची यहाँ उपलब्ध है: reCAPTCHA V3 POST और GET request parameters
जब आप अपनी request सबमिट करते हैं /in.php endpoint, अतिरिक्त parameter शामिल करें: enterprise=1
उसके बाद, CapSkip API के साथ उसी तरह इंटरैक्ट करें जैसे reCAPTCHA v2 या v3 हल करते समय करते हैं। जब token लौट आता है, तो उसे टारगेट वेबसाइट को उसके इम्प्लीमेंटेशन के अनुसार सबमिट करें।
Cloudflare Turnstile
Cloudflare Turnstile, Cloudflare द्वारा विकसित एक आधुनिक कैप्चा विकल्प है। यह पारंपरिक विज़ुअल challenge पर निर्भर हुए बिना यह सत्यापित करता है कि विज़िटर इंसान है या नहीं। Turnstile एक स्टैंडअलोन विजेट के रूप में या किसी challenge पेज के हिस्से के रूप में दिख सकता है, और यह कम या बिना किसी यूज़र इंटरैक्शन के काम करता है।
दो आम Turnstile implementations हैं:
1. स्टैंडअलोन Turnstile Widget
एक standalone Turnstile widget सीधे किसी website page पर एम्बेड होता है, जो आमतौर पर किसी form को स्वचालित सबमिशन से बचाता है। इस मामले में:
इसे निकालें
sitekeyfrom the page.इसे पूरे के साथ CapSkip API को भेजें
pageurl.token प्राप्त करने के बाद, इसे इसमें डालें the
cf-turnstile-responseफ़ील्ड।कुछ इम्प्लीमेंटेशन में, टोकन को इसमें भी रखने की आवश्यकता हो सकती है
g-recaptcha-responseफ़ील्ड।अगर में कोई callback परिभाषित है
turnstile.render()कॉन्फ़िगरेशन, इसे लौटाए गए token के साथ निष्पादित करें।
फिर form को हमेशा की तरह submit करें।
2. Cloudflare Challenge Page पर Turnstile
यह तब होता है जब वेबसाइट Cloudflare के ज़रिए proxied होती है और access देने से पहले एक Turnstile challenge पेज प्रस्तुत करती है। इस स्थिति में, आपको निम्नलिखित parameters निकालने होंगे:
cDatachlPageDataaction
ये मान आपकी API रिक्वेस्ट में शामिल होने ही चाहिए। इसके अलावा, आपको यह इस्तेमाल करना ही होगा User-Agent token सबमिट करते समय CapSkip API द्वारा लौटाया गया value।
आवश्यक Parameters कैसे निकालें?
आवश्यक parameters निकालने के लिए, आप override कर सकते हैं turnstile.render मेथड और उस पर कॉल होने पर पास किए गए आर्गुमेंट्स को इंटरसेप्ट करें। उदाहरण के लिए, निम्नलिखित JavaScript कोड को पेज में इंजेक्ट करें। पैरामीटर्स को सफलतापूर्वक कैप्चर करने के लिए स्क्रिप्ट को Turnstile विजेट लोड होने से पहले एक्ज़ीक्यूट किया जाना चाहिए।
const i = setInterval(()=>{
if (window.turnstile) {
clearInterval(i)
window.turnstile.render = (a,b) => {
let p = {
method: "turnstile",
key: "YOUR_API_KEY",
sitekey: b.sitekey,
pageurl: window.location.href,
data: b.cData,
pagedata: b.chlPageData,
action: b.action,
userAgent: navigator.userAgent,
json: 1
}
console.log(JSON.stringify(p))
window.tsCallback = b.callback
return 'foo'
}
}
},50)
POST Request Parameters की सूची
| पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| key | स्ट्रिंग | हां | आपकी CapSkip API key। |
| method | स्ट्रिंग | हां | turnstile: एक Cloudflare Turnstile रिक्वेस्ट निर्दिष्ट करता है। |
| sitekey | स्ट्रिंग | हां | इसका value data-sitekey टारगेट पेज पर पाया गया पैरामीटर। |
| pageurl | स्ट्रिंग | हां | उस page का पूरा URL जहाँ Turnstile challenge स्थित है। |
| action | स्ट्रिंग | नहीं |
में परिभाषित वैकल्पिक action value data-action attribute या इसे पास किया गया turnstile.render().
|
| data | स्ट्रिंग | नहीं |
इसका मान cData पास किया गया turnstile.render() या इसमें परिभाषित data-cdata attribute।
|
| pagedata | स्ट्रिंग | नहीं |
इसका मान chlPageData पास किया गया turnstile.render().
|
| json | पूर्णांक डिफ़ॉल्ट: 0 |
नहीं |
0: response सादे टेक्स्ट के रूप में लौटाया जाता है। 1: response को JSON format में लौटाया जाता है। |
| proxy | स्ट्रिंग | नहीं | प्रॉक्सी पता। IP authentication के लिए format: IP:PORT (उदाहरण: 123.123.123.123:3128). login/password authentication के लिए format: login:password@IP:PORT |
| proxytype | स्ट्रिंग | नहीं | प्रॉक्सी का प्रकार। समर्थित values: HTTP, HTTPS, SOCKS5, SOCKS5H। डिफ़ॉल्ट: HTTP जब proxy प्रदान किया गया है पर proxytype छोड़ दिया जाता है। |
Turnstile सबमिट करें (standalone):
curl -X POST -d "key=YOUR_API_KEY&method=turnstile&sitekey=0x4AAAAAAABUYP0XeMJF0xoy&pageurl=https://example.com" http://127.0.0.1:8080/in.php
Turnstile सबमिट करें (challenge पेज, साथ में वैकल्पिक action, data, pagedata):
curl -X POST -d "key=YOUR_API_KEY&method=turnstile&sitekey=0x4AAAAAAABUYP0XeMJF0xoy&pageurl=https://example.com&action=managed&data=...&pagedata=..." http://127.0.0.1:8080/in.php
अगर request सफल होती है, तो CapSkip कैप्चा ID को plain text के रूप में लौटाएगा: OK|12345
अगर json=1 पैरामीटर निर्दिष्ट किया गया है, तो response को JSON format में लौटाया जाएगा:
{
"status":1,
"request":"12345"
}
अगर कोई error होता है, तो CapSkip एक error code लौटाएगा।
परिणाम प्राप्त करने के लिए लौटाई गई ID का उपयोग करें /res.php API का endpoint।
GET request parameters की सूची
| GET पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| key | स्ट्रिंग | हां | आपकी CapSkip API key। |
| action | स्ट्रिंग | हां | get: सबमिट किए गए कैप्चा के लिए answer प्राप्त करें। |
| id | पूर्णांक | हां |
इसके द्वारा लौटाया गया कैप्चा ID in.php.
|
| json | पूर्णांक डिफ़ॉल्ट: 0 |
नहीं |
0 - response को plain text के रूप में लौटाया जाता है। 1 - response को JSON format में लौटाया जाता है, जिसमें शामिल है userAgent value। |
Cloudflare Turnstile के लिए सॉल्वर एक विशिष्ट browser User-Agent का उपयोग करता है, और token सबमिट करते समय आपको वही User-Agent भेजना ज़रूरी है। इसके साथ json=1 response में शामिल है एक userAgent field। plain text मोड में, वही value यहाँ से पढ़ें X-Turnstile-User-Agent रिस्पॉन्स हेडर।
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=CAPTCHA_ID"
Cloudflare के पीछे की कुछ साइटें कोई भी सामग्री दिखाने से पहले हर विज़िटर को एक पूरे पेज पर रोक देती हैं, जिस पर “Just a moment...” लिखा होता है। उस पेज को पार करने पर एक cf_clearance कुकी सेट हो जाती है, और उसके बाद का हर अनुरोध जिसमें यह कुकी होती है, सीधे आगे जाने दिया जाता है। CapSkip आपके भेजे गए URL के लिए यह पेज पार करता है और कुकी लौटाता है, ताकि कोई भी स्क्रिप्ट या टूल, जिसके पास अपना ब्राउज़र नहीं है, साधारण HTTP अनुरोधों से साइट को एक्सेस कर सके।
यह कैसे काम करता है
यह तरीका पूरे पेज वाले चैलेंज के लिए है। अगर साइट इसके बजाय किसी फ़ॉर्म के अंदर Turnstile विजेट दिखाती है, तो आपको कुकी नहीं, टोकन चाहिए: ऊपर दिया गया Cloudflare Turnstile सेक्शन देखें।
Cloudflare एक cf_clearance कुकी को उसी IP पते और User-Agent से बाँध देता है जिनसे वह हासिल की गई थी। किसी दूसरे पते से, या किसी दूसरे User-Agent के साथ दोबारा भेजी गई कुकी अस्वीकार कर दी जाती है और चैलेंज पेज फिर से आ जाता है। इसी वजह से इस तरीके के हर अनुरोध में आपकी प्रॉक्सी शामिल होती है, और इसी वजह से जवाब आपको बताता है कि कौन सा User-Agent भेजना है।
पूरा चक्र चार चरणों का है:
- CapSkip में cf_clearance कुकीज़ लौटाएँ चालू करें (नीचे देखें)।
- पेज का URL और अपनी प्रॉक्सी यहाँ भेजें:
/createTask. - जब तक token तैयार न हो जाए, तब तक
/getTaskResultजब तक कुकी तैयार न हो जाए। - अपने खुद के अनुरोध उसी प्रॉक्सी के ज़रिए, उसी User-Agent और कुकी के साथ भेजें।
यह तरीका केवल JSON createTask / getTaskResult API पर उपलब्ध है। पुराने in.php / res.php इंटरफ़ेस में कोई कुकी मोड नहीं है।
शुरू करने से पहले
यह तरीका डिफ़ॉल्ट रूप से बंद रहता है। CapSkip खोलें, यहाँ जाएँ: सेटिंग्स, कैप्चा टाइप्स, Cloudflare, और यह विकल्प चालू करें: cf_clearance कुकीज़ लौटाएँ। जब तक यह बंद है, इस तरीके का हर अनुरोध इस त्रुटि के साथ अस्वीकार कर दिया जाता है: ERROR_TASK_NOT_SUPPORTED। यह बदलाव अगले अनुरोध से ही लागू हो जाता है; कुछ भी रीस्टार्ट करने की ज़रूरत नहीं है।
हर अनुरोध में दो चीज़ें ज़रूरी हैं:
- एक प्रॉक्सी। कुकी केवल उसी पते से मान्य होती है जिससे वह हासिल की गई थी, इसलिए अनुरोध में वह प्रॉक्सी बतानी होगी जिसका इस्तेमाल आप बाद में करेंगे। बिना प्रॉक्सी वाला अनुरोध कोई भी काम शुरू होने से पहले ही अस्वीकार कर दिया जाता है। HTTP, HTTPS, SOCKS5 और SOCKS5H प्रॉक्सी स्वीकार की जाती हैं; SOCKS4 नहीं।
- अगर आप User-Agent भेजते हैं, तो वह मेल खाता होना चाहिए। यह Windows के लिए Chrome का User-Agent होना चाहिए, और इसका मेजर वर्शन वही होना चाहिए जो CapSkip चलाने वाले कंप्यूटर पर इंस्टॉल किए गए Google Chrome का है। कोई दूसरा User-Agent ऐसी कुकी देगा जिसे साइट अस्वीकार कर देती है, इसलिए उसे शुरुआत में ही एक त्रुटि के साथ अस्वीकार कर दिया जाता है। सबसे आसान विकल्प यह है कि कोई User-Agent न भेजें और कुकी के साथ लौटाए गए User-Agent का इस्तेमाल करें।
टास्क प्रकार
एक ही अनुरोध के तीन रूप स्वीकार किए जाते हैं, कुकी मोड वाले हर क्लाइंट परिवार के लिए एक। तीनों एक ही तरह से हल होते हैं; केवल फ़ील्ड के नाम और जवाब का स्वरूप अलग होता है।
| टास्क प्रकार | API शैली | समर्थित | विवरण |
|---|---|---|---|
AntiCloudflareTask | CapSolver | हां | प्रॉक्सी एक अकेली proxy स्ट्रिंग के रूप में। जवाब में कुकी, वही मान रखने वाला एक token फ़ील्ड, और User-Agent होते हैं। |
TurnstileTask के साथ cloudflareTaskType इस पर सेट cf_clearance | CapMonster | हां | प्रॉक्सी अलग-अलग फ़ील्ड के रूप में। जवाब में कुकी होती है, और अगर अनुरोध में User-Agent नहीं भेजा गया था, तो User-Agent भी। |
TurnstileTask बिना websiteKey | NextCaptcha | हां | प्रॉक्सी अलग-अलग फ़ील्ड के रूप में। यह केवल तब पहचाना जाता है जब NextCaptcha चुनी गई सेवा हो। जवाब में कुकी और User-Agent होते हैं। |
AntiCloudflareTask पैरामीटर
| पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| clientKey | स्ट्रिंग | हाँ* | आपकी CapSkip API key। सिर्फ़ तब ज़रूरी जब API Key सत्यापन सक्षम है। |
| type | स्ट्रिंग | हां | होना ही चाहिए AntiCloudflareTask. |
| websiteURL | स्ट्रिंग | हां | चैलेंज दिखाने वाले पेज का पूरा http या https URL। |
| proxy | स्ट्रिंग | हां | वह प्रॉक्सी जिसके ज़रिए हल किया जाएगा। स्वीकार्य फ़ॉर्मैट: IP:PORT:LOGIN:PASSWORD, LOGIN:PASSWORD@IP:PORT, http://LOGIN:PASSWORD@IP:PORT (साथ ही https://, socks5://, socks5h://) और socks5:IP:PORT:LOGIN:PASSWORD। लॉगिन और पासवर्ड वैकल्पिक हैं। |
| userAgent | स्ट्रिंग | नहीं | वह User-Agent जिसे आप कुकी के साथ भेजेंगे। क्या स्वीकार्य है, यह जानने के लिए शुरू करने से पहले देखें। |
| html | स्ट्रिंग | नहीं | संगतता के लिए स्वीकार किया जाता है और अनदेखा कर दिया जाता है। |
TurnstileTask (cf_clearance) पैरामीटर
| पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| clientKey | स्ट्रिंग | हाँ* | आपकी CapSkip API key। सिर्फ़ तब ज़रूरी जब API Key सत्यापन सक्षम है। |
| type | स्ट्रिंग | हां | होना ही चाहिए TurnstileTask. |
| cloudflareTaskType | स्ट्रिंग | हां | होना ही चाहिए cf_clearance। इसके बिना, टास्क को Turnstile टोकन अनुरोध माना जाता है। |
| websiteURL | स्ट्रिंग | हां | चैलेंज दिखाने वाले पेज का पूरा http या https URL। |
| websiteKey | स्ट्रिंग | नहीं | संगतता के लिए स्वीकार किया जाता है। इस पेज के पास देने के लिए कोई sitekey नहीं होती, इसलिए कोई भी मान चलेगा। |
| proxyType | स्ट्रिंग डिफ़ॉल्ट: http | नहीं | http, https, socks5 या socks5h. |
| proxyAddress | स्ट्रिंग | हां | प्रॉक्सी का IP पता या होस्ट नाम। |
| proxyPort | पूर्णांक | हां | प्रॉक्सी पोर्ट। |
| proxyLogin | स्ट्रिंग | नहीं | प्रॉक्सी लॉगिन। |
| proxyPassword | स्ट्रिंग | नहीं | प्रॉक्सी पासवर्ड। जैसा भेजा जाता है वैसा ही लिया जाता है, इसलिए @ और : जैसे अक्षरों से कोई समस्या नहीं होती। |
| userAgent | स्ट्रिंग | नहीं | वह User-Agent जिसे आप कुकी के साथ भेजेंगे। क्या स्वीकार्य है, यह जानने के लिए शुरू करने से पहले देखें। |
| htmlPageBase64 | स्ट्रिंग | नहीं | संगतता के लिए स्वीकार किया जाता है और अनदेखा कर दिया जाता है। |
NextCaptcha रूप भी वही proxyType, proxyAddress, proxyPort, proxyLogin और proxyPassword फ़ील्ड लेता है, साथ में type इस पर सेट TurnstileTask और बिना websiteKey.
टास्क सबमिट करना
अपने CapSkip API एंडपॉइंट पर JSON बॉडी के साथ एक HTTP POST अनुरोध भेजें (/createTask).
AntiCloudflareTask सबमिट करें:
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "AntiCloudflareTask",
"websiteURL": "https://www.example.com/",
"proxy": "203.0.113.10:8080:login:password"
}
}' \
http://127.0.0.1:8080/createTask
TurnstileTask सबमिट करें, साथ में cloudflareTaskType:
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "TurnstileTask",
"cloudflareTaskType": "cf_clearance",
"websiteURL": "https://www.example.com/",
"websiteKey": "xxxxxx",
"proxyType": "http",
"proxyAddress": "203.0.113.10",
"proxyPort": 8080,
"proxyLogin": "login",
"proxyPassword": "password"
}
}' \
http://127.0.0.1:8080/createTask
अगर अनुरोध स्वीकार हो जाता है, तो CapSkip टास्क ID लौटाता है। सेटिंग बंद होने पर, बिना प्रॉक्सी के, या ऐसे User-Agent के साथ किया गया अनुरोध जिसका इस्तेमाल नहीं हो सकता, यहीं, यानी सबमिट अनुरोध पर ही, कोई भी काम शुरू होने से पहले अस्वीकार कर दिया जाता है।
{
"errorId": 0,
"errorCode": "",
"errorDescription": "",
"taskId": "2122988149"
}
परिणाम प्राप्त करना
लगभग 5 सेकंड प्रतीक्षा करें, फिर /getTaskResult पर टास्क ID के साथ एक HTTP POST अनुरोध भेजें। जब तक स्थिति यह रहे, हर कुछ सेकंड में दोहराते रहें: processing। ज़्यादातर पेज 5 से 20 सेकंड में पार हो जाते हैं; धीमी प्रॉक्सी इसमें और समय जोड़ती है।
curl -X POST \
-H "Content-Type: application/json" \
-d '{"clientKey": "YOUR_API_KEY", "taskId": "2122988149"}' \
http://127.0.0.1:8080/getTaskResult
{
"errorId": 0,
"taskId": "2122988149",
"status": "processing"
}
तैयार जवाब: AntiCloudflareTask. token में कुकी वाला ही मान होता है:
{
"errorId": 0,
"errorCode": "",
"errorDescription": "",
"taskId": "2122988149",
"solution": {
"cookies": {
"cf_clearance": "3gBq2EXAMPLE9vRk7pT0c1aZ.uWx4yNq8mLs-1792066388-1.2.1.1-Qx7aEXAMPLEpZ0kR3vT9wYb2"
},
"token": "3gBq2EXAMPLE9vRk7pT0c1aZ.uWx4yNq8mLs-1792066388-1.2.1.1-Qx7aEXAMPLEpZ0kR3vT9wYb2",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/155.0.0.0 Safari/537.36"
},
"status": "ready"
}
तैयार जवाब: TurnstileTask के साथ cloudflareTaskType। जब अनुरोध में अपना खुद का userAgentभेजा गया हो, तो समाधान में केवल कुकी होती है, क्योंकि कुकी आपके भेजे गए User-Agent से बँधी होती है। जब ऐसा नहीं हुआ हो, तो userAgent जोड़ा जाता है ताकि आपको पता रहे कि कौन सा इस्तेमाल करना है:
{
"errorId": 0,
"errorCode": "",
"errorDescription": "",
"taskId": "2122988149",
"solution": {
"cf_clearance": "3gBq2EXAMPLE9vRk7pT0c1aZ.uWx4yNq8mLs-1792066388-1.2.1.1-Qx7aEXAMPLEpZ0kR3vT9wYb2",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/155.0.0.0 Safari/537.36"
},
"status": "ready"
}
NextCaptcha रूप के जवाब में cf_clearance और userAgent दोनों एक साथ इसमें होते हैं: solution.
कुकी का इस्तेमाल
साइट पर हर अनुरोध के साथ कुकी भेजें, उसी प्रॉक्सी के ज़रिए और उसी User-Agentके साथ। इनमें से कोई भी एक बदलने पर Cloudflare फिर से चैलेंज पेज दिखाता है।
curl -x "http://login:[email protected]:8080" \ -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/155.0.0.0 Safari/537.36" \ -b "cf_clearance=3gBq2EXAMPLE9vRk7pT0c1aZ.uWx4yNq8mLs-1792066388-1.2.1.1-Qx7aEXAMPLEpZ0kR3vT9wYb2" \ https://www.example.com/
कुकी तब तक चलती है जब तक साइट की अपनी Cloudflare सेटिंग्स अनुमति देती हैं, अक्सर 30 मिनट और कभी-कभी इससे काफ़ी ज़्यादा। जब चैलेंज पेज वापस आ जाए, तो नया टास्क सबमिट करें। अगर आप प्रॉक्सी रोटेट करते हैं, तो हर प्रॉक्सी के लिए एक बार हल करें: एक पते पर हासिल की गई कुकी दूसरे पते पर काम नहीं करती।
त्रुटियाँ
अस्वीकृतियाँ createTask अनुरोध पर मिलती हैं। हल करने में विफलताएँ getTaskResult के साथ status इस पर सेट failedके साथ मिलती हैं। NextCaptcha चुने होने पर, कोड और HTTP स्टेटस इसके बजाय NextCaptcha की अपनी त्रुटि तालिका के अनुसार होते हैं।
| कोड | अर्थ |
|---|---|
ERROR_TASK_NOT_SUPPORTED | cf_clearance कुकीज़ लौटाएँ विकल्प CapSkip में बंद है। |
ERROR_PROXY_MISSING | TurnstileTask रूप: अनुरोध में कोई इस्तेमाल योग्य प्रॉक्सी नहीं है। |
ERROR_WRONG_USERAGENT | TurnstileTask रूप: User-Agent, Windows के लिए Chrome का नहीं है, या उसका मेजर वर्शन CapSkip कंप्यूटर पर इंस्टॉल किए गए Google Chrome के वर्शन से मेल नहीं खाता। |
ERROR_BAD_PARAMETERS | AntiCloudflareTask रूप: कोई इस्तेमाल योग्य प्रॉक्सी नहीं है, या User-Agent इस्तेमाल योग्य नहीं है। दोनों रूपों में: websiteURL मौजूद नहीं है। |
ERROR_PAGEURL | websiteURL पूरा http या https URL नहीं है। |
ERROR_PROXY_BANNED | Cloudflare ने प्रॉक्सी पते को पूरी तरह ब्लॉक कर दिया। कोई दूसरी प्रॉक्सी इस्तेमाल करें। |
ERROR_PROXY_CONNECT_REFUSED | प्रॉक्सी के ज़रिए पेज तक नहीं पहुँचा जा सका। जाँचें कि प्रॉक्सी चालू है और लॉगिन सही है। |
ERROR_CAPTCHA_UNSOLVABLE | समय पर कोई कुकी नहीं मिली, या पेज पर कोई Cloudflare चैलेंज था ही नहीं (errorDescription में तब “No Cloudflare challenge on this page” लिखा होता है)। दोबारा कोशिश करने के लिए नया टास्क सबमिट करें। |
hCaptcha एक CAPTCHA विजेट है जिसका उपयोग कई साइन-अप, लॉगिन और चेकआउट फ़ॉर्म करते हैं। विज़िटर एक चेकबॉक्स पर टिक करता है, कभी-कभी एक चित्र वाले चैलेंज का जवाब देता है, और फिर विजेट फ़ॉर्म में एक टोकन डाल देता है। फ़ॉर्म स्वीकार करने से पहले साइट उस टोकन की जाँच hCaptcha से करती है। आप जो sitekey और पेज भेजते हैं, उसके लिए CapSkip विजेट को पास करता है और टोकन लौटाता है, जो फ़ॉर्म के साथ सबमिट करने के लिए तैयार होता है। hCaptcha Enterprise और अदृश्य विजेट भी इसी मेथड का उपयोग करते हैं।
यह कैसे काम करता है
- लक्ष्य पेज पर hCaptcha विजेट का sitekey खोजें (नीचे देखें)।
- sitekey और पेज URL यहाँ सबमिट करें:
/in.phpके साथmethod=hcaptcha. - जब तक token तैयार न हो जाए, तब तक
/res.phpको poll करते रहें। - टोकन को फ़ॉर्म में डालें, या उसे पेज के callback फ़ंक्शन को दें, और फ़ॉर्म सबमिट करें।
एक हल में आम तौर पर 10 से 30 सेकंड लगते हैं। हर 5 सेकंड में पोल करें।
Sitekey खोजना
sitekey एक सार्वजनिक पहचानकर्ता है, जो पेज के हर विज़िटर के लिए एक जैसा होता है। ज़्यादातर पेज इसे विजेट कंटेनर पर इस रूप में रखते हैं: data-sitekey:
<div class="h-captcha" data-sitekey="a5f74b19-9e45-40e0-b45d-47ff91b7a6c2"></div>
जब कोई पेज विजेट को script से बनाता है, तो यह खोजें: sitekey विकल्प, जो इसका हिस्सा है: hcaptcha.render(), या hCaptcha iframe के पते में यह sitekey= पैरामीटर देखें। जिस विजेट में data-size="invisible" होता है, वह अदृश्य होता है: उसके लिए invisible=1 भेजें।
कुछ hCaptcha Enterprise साइटें विजेट को एक rqdata मान भी देती हैं, इसके ज़रिए: hcaptcha.setData(), विजेट के चलने से पहले। अगर पेज ऐसा करता है, तो वह मान इस रूप में भेजें: data। यह साइट द्वारा एक चैलेंज के लिए जारी किया जाता है और जल्दी समाप्त हो जाता है, इसलिए हर टास्क के लिए नया मान लें।
POST Request Parameters की सूची
| पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| key | स्ट्रिंग | हाँ* | आपकी CapSkip API key। सिर्फ़ तब ज़रूरी जब API Key सत्यापन सक्षम है। |
| method | स्ट्रिंग | हां | होना ही चाहिए hcaptcha। यह बताता है कि आप hCaptcha सबमिट कर रहे हैं। |
| sitekey | स्ट्रिंग | हां | hCaptcha विजेट का sitekey। |
| pageurl | स्ट्रिंग | हां | उस पेज का पूरा URL जिस पर विजेट है। |
| invisible | पूर्णांक डिफ़ॉल्ट: 0 | नहीं | 1 अदृश्य विजेट के लिए। |
| data | स्ट्रिंग | नहीं | The rqdata मान, किसी hCaptcha Enterprise विजेट का, जब साइट इसे सेट करती है। |
| userAgent | स्ट्रिंग | नहीं | वह User-Agent जिसके साथ आप फ़ॉर्म सबमिट करेंगे। CapSkip इसका उपयोग तभी करता है जब यह उस ब्राउज़र से मेल खाता है जिससे CapSkip हल करता है। रिप्लाई में हमेशा वह User-Agent बताया जाता है जिससे टोकन हासिल किया गया था। |
| proxy | स्ट्रिंग | नहीं | प्रॉक्सी का पता। ये formats स्वीकार्य हैं: IP:PORT, LOGIN:PASSWORD@IP:PORT या IP:PORT:LOGIN:PASSWORD. |
| proxytype | स्ट्रिंग | नहीं | प्रॉक्सी का प्रकार: HTTP, HTTPS, SOCKS5 या SOCKS5H. |
| json | पूर्णांक डिफ़ॉल्ट: 0 | नहीं | 0 response को plain text के रूप में लौटाता है। 1 response को JSON के रूप में लौटाता है। |
CapSkip इस मेथड के लिए प्रॉक्सी अनिवार्य नहीं करता। टेस्टिंग और कभी-कभार के हल के लिए एक पता ठीक है। उससे आगे, hCaptcha ब्राउज़र के साथ-साथ उस नेटवर्क को भी स्कोर करता है जिससे टोकन आता है, और एक ही IP से लगातार आने वाले हल ठीक वही हैं जिन्हें पकड़ने के लिए इसकी रेट लिमिट और प्रतिष्ठा जाँच बनी हैं। ज़्यादा मात्रा में, एक प्रॉक्सी पूल यहाँ कॉन्फ़िगर करें: सेटिंग्स, कैप्चा टाइप्स, hCaptcha, प्रॉक्सी कॉन्फ़िगर करें, या जब हल किसी खास नेटवर्क से आना ज़रूरी हो, तो हर टास्क के साथ एक प्रॉक्सी भेजें। टास्क के साथ भेजे गए प्रॉक्सी को हमेशा सूची पर प्राथमिकता मिलती है।
अपने CapSkip API endpoint पर एक HTTP GET या POST request सबमिट करें (/in.php) के साथ method=hcaptcha। फ़ॉर्म फ़ील्ड, क्वेरी स्ट्रिंग और JSON बॉडी, तीनों एक जैसे फ़ील्ड नामों के साथ स्वीकार किए जाते हैं।
hCaptcha सबमिट करें:
curl -X POST \ -d "key=YOUR_API_KEY" \ -d "method=hcaptcha" \ -d "sitekey=a5f74b19-9e45-40e0-b45d-47ff91b7a6c2" \ --data-urlencode "pageurl=https://accounts.hcaptcha.com/demo" \ -d "json=1" \ http://127.0.0.1:8080/in.php
अगर सब कुछ सही है, तो CapSkip CAPTCHA ID को plain text के रूप में लौटाता है: OK|2122988149। अगर json=1 parameter भेजा गया था, तो इसके बजाय response एक JSON envelope होता है। दोनों ही स्थितियों में, लौटाया गया मान वही CAPTCHA ID है जिसके लिए आप result poll करते हैं।
{
"status": 1,
"request": "2122988149"
}
अन्यथा CapSkip कोई भी काम शुरू होने से पहले, सबमिट अनुरोध पर ही एक त्रुटि कोड लौटाता है:
| त्रुटि | कारण |
|---|---|
| ERROR_RECAPTCHA_INVALID_SITEKEY | sitekey मौजूद नहीं है या खाली है। |
| ERROR_PAGEURL | pageurl गायब है या http या https पता नहीं है। |
| ERROR_PROXY_FORMAT | proxy मान पढ़ा नहीं जा सका। |
लगभग 10 सेकंड प्रतीक्षा करें, फिर परिणाम एंडपॉइंट (/res.php) पर आपको मिली CAPTCHA ID के साथ एक HTTP GET request भेजें।
GET request parameters की सूची
| पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| key | स्ट्रिंग | हाँ* | आपकी CapSkip API key। सिर्फ़ तब ज़रूरी जब API Key सत्यापन सक्षम है। |
| action | स्ट्रिंग | हां | निर्दिष्ट करें get कैप्चा का हल प्राप्त करने के लिए। |
| id | पूर्णांक | हां | इसके द्वारा लौटाई गई CAPTCHA ID in.php request। |
| json | पूर्णांक डिफ़ॉल्ट: 0 | नहीं | 0 response को plain text के रूप में लौटाता है। 1 response को JSON के रूप में लौटाता है। |
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=2122988149&json=1"
अगर विजेट पास हो गया है, तो CapSkip टोकन लौटाता है:
{
"status": 1,
"request": "P1_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.hadwYXNza2V5xQZ2...f3Kq8nV2",
"respKey": "E0_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjA0...9wB1",
"useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36"
}
request टोकन है। respKey वह दूसरा मान है जो hCaptcha टोकन के साथ विजेट को देता है; ज़्यादातर साइटें इसे कभी नहीं पढ़तीं, और यह खाली भी हो सकता है। useragent वह User-Agent है जिससे टोकन हासिल किया गया था।
अगर आप नहीं भेजते json=1, टोकन OK| प्रीफ़िक्स के बाद सादे टेक्स्ट के रूप में आता है, और User-Agent X-HCaptcha-User-Agent रिस्पॉन्स हेडर में आता है:
OK|P1_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.hadwYXNza2V5xQZ2...f3Kq8nV2
अगर विजेट अभी तक पास नहीं हुआ है, तो CapSkip लौटाता है CAPCHA_NOT_READY, ठीक इसी वर्तनी के साथ, जैसा हर दूसरे method पर होता है। 5 सेकंड प्रतीक्षा करें और request दोहराएँ।
हर परिणाम एक ही बार दिया जाता है। पहला सफल पोल टोकन लौटाता है और उसे हटा देता है, इसलिए जिस रिप्लाई में टोकन आया, उसी से उसे सहेज लें।
जो टास्क हल नहीं हो सका, वह लौटाता है ERROR_CAPTCHA_UNSOLVABLE. दो विफलताएँ इसके बजाय अपना कारण बताती हैं, क्योंकि उसी टास्क को दोबारा भेजने पर वह फिर विफल होगा: ERROR_RECAPTCHA_INVALID_SITEKEY तब मिलता है जब hCaptcha ने उस पेज के लिए sitekey अस्वीकार कर दिया हो; ऐसे में sitekey के साथ इसे भी जाँचें: pageurl, और ERROR_PROXY_CONNECT_REFUSED जब प्रॉक्सी तक पहुँचा नहीं जा सका।
JSON API (createTask) का उपयोग
hCaptcha को /createTaskपर भी स्वीकार किया जाता है, और परिणाम यहाँ से पढ़ा जाता है: /getTaskResult। चार टास्क प्रकार पहचाने जाते हैं: HCaptchaTaskProxyless और HCaptchaEnterpriseTaskProxyless आपके प्रॉक्सी के बिना हल होते हैं, HCaptchaTask और HCaptchaEnterpriseTask एक प्रॉक्सी लेते हैं। चारों एक ही तरीके से हल होते हैं।
| पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| type | स्ट्रिंग | हां | ऊपर दिए गए चार टास्क प्रकारों में से एक। |
| websiteURL | स्ट्रिंग | हां | उस पेज का पूरा URL जिस पर विजेट है। |
| websiteKey | स्ट्रिंग | हां | hCaptcha विजेट का sitekey। |
| isInvisible | Boolean | नहीं | true अदृश्य विजेट के लिए। |
| enterprisePayload | Object | नहीं | एक ऑब्जेक्ट जिसमें rqdataहोता है, hCaptcha Enterprise के लिए। एक फ़्लैट rqdata फ़ील्ड भी स्वीकार किया जाता है। |
| userAgent | स्ट्रिंग | नहीं | इसके समान: in.php ऊपर देखें। |
| proxy | स्ट्रिंग | नहीं | प्रॉक्सी एक स्ट्रिंग के रूप में, या proxyType, proxyAddress, proxyPort, proxyLogin और proxyPassword फ़ील्ड। |
curl -X POST http://127.0.0.1:8080/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "HCaptchaTaskProxyless",
"websiteURL": "https://accounts.hcaptcha.com/demo",
"websiteKey": "a5f74b19-9e45-40e0-b45d-47ff91b7a6c2"
}
}'
समाधान में टोकन दो बार होता है, इन नामों के तहत: gRecaptchaResponse और token, ताकि इनमें से किसी भी नाम के लिए लिखे गए क्लाइंट इसे बिना बदलाव के पढ़ सकें:
{
"errorId": 0,
"status": "ready",
"solution": {
"gRecaptchaResponse": "P1_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.hadwYXNza2V5xQZ2...f3Kq8nV2",
"token": "P1_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.hadwYXNza2V5xQZ2...f3Kq8nV2",
"respKey": "E0_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjA0...9wB1",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36"
}
}
विफल टास्क में वही त्रुटि कोड आते हैं जो res.php पर आते हैं, इस फ़ील्ड में: errorCode.
Token सबमिट करना
पेज पर, विजेट अपना टोकन फ़ॉर्म के अंदर एक छिपे हुए textarea में लिखता है, जिसका नाम है h-captcha-response (और एक कॉपी जिसका नाम है g-recaptcha-response)। आपको मिला टोकन दोनों फ़ील्ड में डालें और फ़ॉर्म सबमिट करें। अगर विजेट को data-callbackके साथ रेंडर किया गया था, तो इसके बजाय उस फ़ंक्शन को टोकन के साथ कॉल करें, जैसा विजेट करता:
document.querySelector('[name="h-captcha-response"]').value = token;
const g = document.querySelector('[name="g-recaptcha-response"]');
if (g) g.value = token;
// या, जब विजेट में data-callback हो:
window[callbackName](token);
जब आप ब्राउज़र के बिना फ़ॉर्म पोस्ट करते हैं, तो टोकन को h-captcha-response फ़ील्ड के रूप में भेजें (और g-recaptcha-responseमें भी, अगर फ़ॉर्म में यह है), रिप्लाई वाले User-Agent के साथ।
hCaptcha टोकन केवल एक बार उपयोग किए जा सकते हैं और जारी होने के लगभग दो मिनट बाद समाप्त हो जाते हैं। हर टोकन को मिलने के तुरंत बाद सबमिट करें, और हर फ़ॉर्म सबमिशन के लिए नया टोकन माँगें।
सख़्त Sitekey
कुछ साइटें, खास तौर पर hCaptcha Enterprise वाली, ऐसे टोकन अस्वीकार कर देती हैं जिन्हें hCaptcha ने जोखिम भरा स्कोर किया हो, भले ही विजेट पास हो गया हो। अगर कोई साइट CapSkip के लौटाए टोकन अस्वीकार करती है, तो High score mode for hCaptcha (hCaptcha के लिए हाई स्कोर मोड) को यहाँ चालू करें: सेटिंग्स, कैप्चा टाइप्स, hCaptcha। इसके लिए CapSkip चलाने वाले कंप्यूटर पर Google Chrome इंस्टॉल होना ज़रूरी है। साथ में एक अच्छा प्रॉक्सी भी इस्तेमाल करें, और फ़ॉर्म उसी पते से और उसी User-Agent के साथ सबमिट करें जो रिप्लाई में बताया गया है।
AWS WAF CAPTCHA वह पहेली है जो Amazon Web Services तब दिखाता है जब किसी साइट का फ़ायरवॉल यह सबूत चाहता है कि विज़िटर इंसान है: आम तौर पर नौ तस्वीरों का एक ग्रिड, जिसके साथ “Choose all the curtains” (सभी पर्दे चुनें) जैसा निर्देश होता है, और कभी-कभी एक छोटी खिलौना कार जिसे रास्ते के अंत तक ले जाना होता है। इसे पास करने पर एक aws-waf-token कुकी मिलती है। सुरक्षित पेज से मान CapSkip को भेजें, और यह वह परिणाम लौटाता है जो उस कुकी में बदलता है।
यह कैसे काम करता है
साइटों पर AWS WAF CAPTCHA दो में से किसी एक रूप में आता है, और यह मेथड दोनों को संभालता है:
- चैलेंज पेज। फ़ायरवॉल अनुरोध का जवाब HTTP स्टेटस
405और सामग्री की जगह एक छोटे पेज के साथ देता है। उस पेज में एकwindow.gokuPropsऑब्जेक्ट होता है और वहchallenge.jsऔरcaptcha.jsको एकawswaf.comहोस्ट से लोड करता है। - JS-API विजेट। एक सामान्य पेज, जैसे संपर्क या डाउनलोड फ़ॉर्म,
jsapi.jsलोड करता है और पहेली को खुद इसके ज़रिए बनाता है:AwsWafCaptcha.renderCaptcha.
पूरा चक्र चार चरणों का है:
- नीचे दिए गए मान सुरक्षित पेज से पढ़ें।
- उन्हें यहाँ सबमिट करें:
/in.phpके साथmethod=amazon_waf. - जब तक token तैयार न हो जाए, तब तक
/res.phpको तब तक पोल करें जब तक उत्तर तैयार न हो जाए। - उत्तर को
aws-waf-tokenसे बदलें और साइट को भेजे जाने वाले अपने अनुरोधों के साथ उसे भेजें।
चैलेंज पेज पर मान कहाँ मिलते हैं
सुरक्षित URL का अनुरोध करें और 405 प्रतिक्रिया की बॉडी सहेज लें, या उसे ब्राउज़र में खोलकर इसका उपयोग करें: पेज का सोर्स देखें। आपको जो कुछ चाहिए वह HTML में है:
<script>
window.gokuProps = {
"key": "AQIDAHjcYuEXAMPLEghicBgQ/7bFaQZ+m5FKCMDnO+vTbNg96AHDh0IR5vgzHNceHYqZR+GOAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQM...",
"iv": "CgAFRDIjfgAAA5yY",
"context": "Rbp3r8fvbuhmrCqpUe8Mh1TLvs8OSKJZiSs2vCF4dt9rxVZI7xYJa2n5k/9r+XaXe7KUIu2I8nXTDHHkDvIOTDc2..."
};
</script>
<script src="https://3f2a9c7d41b0.edge.sdk.awswaf.com/3f2a9c7d41b0/8e51d0c7a2f4/challenge.js"></script>
<script src="https://3f2a9c7d41b0.edge.sdk.awswaf.com/3f2a9c7d41b0/8e51d0c7a2f4/captcha.js"></script>
| पेज पर मान | इस रूप में भेजें |
|---|---|
| gokuProps.key | sitekey। लंबी key जो आम तौर पर इससे शुरू होती है: AQIDAH। यह साइट के फ़ायरवॉल कॉन्फ़िगरेशन की पहचान करती है। |
| gokuProps.iv | iv। हर चैलेंज पेज के साथ बदलता है। |
| gokuProps.context | context। हर चैलेंज पेज के साथ, इसके साथ-साथ बदलता है: iv. |
| challenge.js का URL | challenge_script। स्क्रिप्ट का पूरा पता, ठीक वैसा जैसा वह इस attribute में दिखता है: src attribute। |
| captcha.js का URL | captcha_script। स्क्रिप्ट का पूरा पता, ठीक वैसा जैसा वह इस attribute में दिखता है: src attribute। |
केवल sitekey और pageurl ज़रूरी हैं। iv और context साथ में भेजे जाते हैं: दोनों भेजें या कोई नहीं। आप जो भी मान छोड़ देते हैं, वह हल करते समय pageurl से पढ़ा जाता है। अगर आपकी पेज कॉपी कुछ मिनट से ज़्यादा पुरानी है तो यही सुरक्षित विकल्प है।
विजेट पेज पर मान कहाँ मिलते हैं
पहेली दिखाने वाला पेज खोलें और उसके सोर्स में, या ब्राउज़र डेवलपर टूल्स के Network टैब में, इन्हें खोजें: jsapi.js स्क्रिप्ट और renderCaptcha कॉल में जोड़े गए दो पैरामीटर:
<script src="https://5b7e0a19c3d8.us-east-1.captcha-sdk.awswaf.com/5b7e0a19c3d8/jsapi.js"></script>
<script>
AwsWafCaptcha.renderCaptcha(document.getElementById("captcha"), {
apiKey: "Xr9kEXAMPLE2bWQx1vTq8LmZ0aYc4dHs7nFp3gJt6uKw5eRi...9AbCdEfGh=_0_1",
onSuccess: function (wafToken) { /* ... */ }
});
</script>
| पेज पर मान | इस रूप में भेजें |
|---|---|
| apiKey | sitekey। एक लंबी key जिसके अंत में छोटा सा suffix होता है, जैसे _0_1। कुछ साइटें इसे HTML की बजाय एक अलग JavaScript फ़ाइल में रखती हैं, इसलिए अगर यह पेज में न मिले तो लोड हुई स्क्रिप्ट्स में यह खोजें: apiKey । |
| jsapi.js का URL | jsapiScript। स्क्रिप्ट का पूरा पता, ठीक वैसा जैसा वह इस attribute में दिखता है: src attribute। |
विजेट पेज पर gokuPropsनहीं होता, इसलिए iv या context। भेजना jsapiScript को इनके बिना भेजना ही अनुरोध को विजेट सॉल्व के रूप में चिह्नित करता है।
चैलेंज के प्रकार
कौन सी पहेली दिखेगी, यह AWS WAF तय करता है। आपको CapSkip को यह बताने की ज़रूरत नहीं कि कौन सी आएगी।
| Challenge | कैसा दिखता है | समर्थित | विवरण |
|---|---|---|---|
| इमेज ग्रिड | 3 x 3 टाइल्स | हां | नौ तस्वीरें और “Choose all the beds” (सभी बिस्तर चुनें) जैसा निर्देश, जो अंत में पक्का करें कि बटन से पूरा होता है। सबसे आम पहेली। |
| खिलौना कार | एक तस्वीर | हां | एक छोटे सड़क नक्शे पर खिलौना कार, जिसे उसके रास्ते के अंत तक ले जाना होता है। |
कभी-कभी किसी पहेली का उत्तर नहीं दिया जा सकता और परिणाम होता है ERROR_CAPTCHA_UNSOLVABLE। नया टास्क सबमिट करें: हर प्रयास में नई पहेली मिलती है।
POST Request Parameters की सूची
| पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| key | स्ट्रिंग | हाँ* | आपकी CapSkip API key। सिर्फ़ तब ज़रूरी जब API Key सत्यापन सक्षम है। |
| method | स्ट्रिंग | हां | होना ही चाहिए amazon_waf। बताता है कि आप AWS WAF CAPTCHA सबमिट कर रहे हैं। |
| sitekey | स्ट्रिंग | हां | The gokuProps.key (चैलेंज पेज का), या विजेट का apiKey. |
| pageurl | स्ट्रिंग | हां | चैलेंज दिखाने वाले पेज का पूरा http या https URL, यानी AWS WAF से सुरक्षित पेज का पता। |
| iv | स्ट्रिंग | नहीं | The gokuProps.iv (चैलेंज पेज का)। इसे इसके साथ भेजें: context, या दोनों को छोड़ दें। |
| context | स्ट्रिंग | नहीं | The gokuProps.context (चैलेंज पेज का)। इसे इसके साथ भेजें: iv, या दोनों को छोड़ दें। |
| challenge_script | स्ट्रिंग | नहीं | पेज की इस स्क्रिप्ट का पूरा URL: challenge.js. |
| captcha_script | स्ट्रिंग | नहीं | पेज की इस स्क्रिप्ट का पूरा URL: captcha.js. |
| jsapiScript | स्ट्रिंग | नहीं | केवल विजेट पेज के लिए: इसका पूरा URL: jsapi.js. |
| proxy | स्ट्रिंग | नहीं | प्रॉक्सी का पता। ये formats स्वीकार्य हैं: IP:PORT, LOGIN:PASSWORD@IP:PORT या IP:PORT:LOGIN:PASSWORD. |
| proxytype | स्ट्रिंग | नहीं | प्रॉक्सी का प्रकार: HTTP, HTTPS, SOCKS5 या SOCKS5H. SOCKS4 स्वीकार नहीं किया जाता। |
| json | पूर्णांक डिफ़ॉल्ट: 0 | नहीं | 0 response को plain text के रूप में लौटाता है। 1 response को JSON के रूप में लौटाता है। |
आपके भेजे गए हर स्क्रिप्ट URL को किसी awswaf.com होस्ट की ओर इशारा करना चाहिए। किसी और जगह की स्क्रिप्ट अस्वीकार कर दी जाती है, क्योंकि वह AWS WAF इंटीग्रेशन नहीं है।
प्रॉक्सी
CapSkip इस मेथड के लिए प्रॉक्सी अनिवार्य नहीं करता, और टेस्टिंग व कभी-कभार के सॉल्व के लिए एक पता काफ़ी है। उससे आगे आपको प्रॉक्सी चाहिए। AWS WAF से सुरक्षित साइटें आम तौर पर CAPTCHA के साथ रेट लिमिट और IP प्रतिष्ठा नियम भी लगाती हैं, इसलिए एक ही पते से लगातार सॉल्व जल्दी ही सख़्त व्यवहार और फिर सीधे ब्लॉक का कारण बनते हैं। CapSkip की सेटिंग्स में AWS WAF के लिए प्रॉक्सी सूची कॉन्फ़िगर करें और उसे लोड बाँटने दें, या जब टोकन किसी खास नेटवर्क से आना ज़रूरी हो तो हर अनुरोध के साथ proxy भेजें।
टास्क सबमिट करना
अपने CapSkip API endpoint पर एक HTTP POST अनुरोध भेजें (/in.php) के साथ method=amazon_waf। फ़ॉर्म फ़ील्ड, JSON बॉडी और GET query string, सभी समान फ़ील्ड नामों के साथ स्वीकार किए जाते हैं। keys में +, / और =होते हैं, इसलिए फ़ॉर्म फ़ील्ड के रूप में भेजते समय उन्हें URL-encode करें।
चैलेंज पेज सबमिट करें:
curl -X POST \ --data-urlencode "key=YOUR_API_KEY" \ --data-urlencode "method=amazon_waf" \ --data-urlencode "sitekey=AQIDAHjcYuEXAMPLEghicBgQ/7bFaQZ+m5FKCMDnO+vTbNg96AHDh0IR5vgzHNceHYqZR+GOAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQM..." \ --data-urlencode "iv=CgAFRDIjfgAAA5yY" \ --data-urlencode "context=Rbp3r8fvbuhmrCqpUe8Mh1TLvs8OSKJZiSs2vCF4dt9rxVZI7xYJa2n5k/9r+XaXe7KUIu2I8nXTDHHkDvIOTDc2..." \ --data-urlencode "challenge_script=https://3f2a9c7d41b0.edge.sdk.awswaf.com/3f2a9c7d41b0/8e51d0c7a2f4/challenge.js" \ --data-urlencode "pageurl=https://www.example.com/" \ --data-urlencode "json=1" \ http://127.0.0.1:8080/in.php
विजेट पेज सबमिट करें (JSON बॉडी):
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"key": "YOUR_API_KEY",
"method": "amazon_waf",
"sitekey": "Xr9kEXAMPLE2bWQx1vTq8LmZ0aYc4dHs7nFp3gJt6uKw5eRi...9AbCdEfGh=_0_1",
"jsapiScript": "https://5b7e0a19c3d8.us-east-1.captcha-sdk.awswaf.com/5b7e0a19c3d8/jsapi.js",
"pageurl": "https://www.example.com/contact",
"json": 1
}' \
http://127.0.0.1:8080/in.php
अगर सब कुछ सही है, तो CapSkip CAPTCHA ID को plain text के रूप में लौटाता है: OK|2122988149। json=1भेजने पर प्रतिक्रिया इसकी बजाय JSON फ़ॉर्मेट में आती है:
{
"status": 1,
"request": "2122988149"
}
गायब sitekey, अनुपयोगी pageurl, iv बिना context (या इसका उल्टा) और गलत फ़ॉर्मेट वाला प्रॉक्सी, कोई भी काम शुरू होने से पहले इसी अनुरोध पर अस्वीकार कर दिए जाते हैं।
परिणाम प्राप्त करना
लगभग 5 सेकंड प्रतीक्षा करें, फिर CAPTCHA ID के साथ /res.php पर HTTP GET अनुरोध भेजें। जब तक उत्तर यह हो, हर 5 सेकंड में दोहराएँ: CAPCHA_NOT_READY। ज़्यादातर टास्क 15 सेकंड के भीतर तैयार हो जाते हैं; धीमा प्रॉक्सी इसमें समय जोड़ता है।
| पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| key | स्ट्रिंग | हाँ* | आपकी CapSkip API key। सिर्फ़ तब ज़रूरी जब API Key सत्यापन सक्षम है। |
| action | स्ट्रिंग | हां | निर्दिष्ट करें get कैप्चा का हल प्राप्त करने के लिए। |
| id | पूर्णांक | हां | इसके द्वारा लौटाई गई CAPTCHA ID in.php request। |
| json | पूर्णांक डिफ़ॉल्ट: 0 | नहीं | 0 response को plain text के रूप में लौटाता है। 1 response को JSON के रूप में लौटाता है। |
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=2122988149&json=1"
उत्तर में दो मान हैं, इसलिए request एक string नहीं बल्कि एक ऑब्जेक्ट है:
{
"status": 1,
"request": {
"captcha_voucher": "eyJ2b3VjaGVyIjoiRVhBTVBMRSJ9.9QwZcEXAMPLEvoucherJk4LmN0pQ",
"existing_token": "7d4c2a91-EXAMPLE-4f0b-9e6d-3a1b5c8e2f70:EQoAeXAMPLEtokenAAAA:Wm9wc2E="
}
}
अगर आप नहीं भेजते json=1के बिना वही ऑब्जेक्ट OK| के बाद एक ही लाइन में आता है:
OK|{"captcha_voucher":"eyJ2b3VjaGVyIjoiRVhBTVBMRSJ9.9QwZcEXAMPLEvoucherJk4LmN0pQ","existing_token":"7d4c2a91-EXAMPLE-4f0b-9e6d-3a1b5c8e2f70:EQoAeXAMPLEtokenAAAA:Wm9wc2E="}
| फ़ील्ड | अर्थ |
|---|---|
| captcha_voucher | AWS WAF का सबूत कि पहेली का उत्तर दिया गया। |
| existing_token | वह टोकन जिसके लिए voucher जारी हुआ। दोनों केवल जोड़ी के रूप में काम करते हैं। |
अगर टास्क विफल हुआ, तो /res.php यह लौटाता है: ERROR_CAPTCHA_UNSOLVABLE, या CapSkip में कॉन्फ़िगर किया गया बदला हुआ एरर टेक्स्ट। दोबारा कोशिश करने के लिए नया टास्क सबमिट करें।
Voucher को कुकी में बदलना
AWS WAF इस जोड़ी को अपने टोकन होस्ट पर अंतिम aws-waf-token से बदलता है: यानी वह होस्ट और फ़ोल्डर जहाँ से challenge.js लोड होता है। विजेट पेज पर, Network टैब में वह challenge.js अनुरोध खोजें; jsapi.js उसे आपके लिए लोड करता है। पते में challenge.js के साथ voucher से बदलें और जोड़ी को JSON के रूप में POST करें:
curl -X POST \
-H "Content-Type: text/plain;charset=UTF-8" \
-H "Origin: https://www.example.com" \
-d '{"captcha_voucher":"eyJ2b3VjaGVyIjoiRVhBTVBMRSJ9.9QwZcEXAMPLEvoucherJk4LmN0pQ","existing_token":"7d4c2a91-EXAMPLE-4f0b-9e6d-3a1b5c8e2f70:EQoAeXAMPLEtokenAAAA:Wm9wc2E="}' \
https://3f2a9c7d41b0.edge.sdk.awswaf.com/3f2a9c7d41b0/8e51d0c7a2f4/voucher
प्रतिक्रिया एक JSON ऑब्जेक्ट है जिसके token फ़ील्ड में aws-waf-tokenहोता है। voucher मिलते ही उसे बदल लें, बाद के लिए न रखें।
टोकन का उपयोग
टोकन को सुरक्षित डोमेन पर aws-waf-token कुकी के रूप में भेजें और रोका गया अनुरोध दोहराएँ। अब साइट 405 पेज की बजाय अपनी असली सामग्री के साथ जवाब देती है:
curl -b "aws-waf-token=7d4c2a91-EXAMPLE-4f0b-9e6d-3a1b5c8e2f70:HgoAxEXAMPLEcookieBBBB:Q2FwU2tpcA==" \ https://www.example.com/
विजेट पेज पर, यह वही टोकन है जो पेज का onSuccess callback पाता है। ऐसे कई पेज इसे aws-waf-token कुकी के रूप में आगे भेजते हैं, कुछ x-aws-waf-token request header में, इसलिए देखें कि पेज का अपना अनुरोध क्या भेजता है और वैसा ही करें।
टोकन साइट के immunity time तक मान्य रहता है, जिसे AWS WAF डिफ़ॉल्ट रूप से 5 मिनट रखता है और साइट मालिक बढ़ा सकते हैं। चैलेंज दोबारा आने पर नया टास्क सबमिट करें।
JSON API
JSON createTask / getTaskResult API भी AWS WAF को स्वीकार करता है, इन रूपों में: AmazonTask / AmazonTaskProxyless और AntiAwsWafTask / AntiAwsWafTaskProxyLess, उस सेवा के फ़ील्ड नामों और परिणाम फ़ॉर्मेट के साथ जिसे CapSkip emulate कर रहा है। इनमें से कई फ़ॉर्मेट सीधे अंतिम aws-waf-token लौटाते हैं, इसलिए कोई voucher बदलने की ज़रूरत नहीं होती। NextCaptcha या EzCaptcha चुनी गई सेवा होने पर ये उपलब्ध नहीं हैं।
GeeTest v3 Slider, GeeTest द्वारा विकसित एक इंटरैक्टिव कैप्चा है। यह तेज़ और सहज सत्यापन अनुभव प्रदान करते हुए मनुष्यों को बॉट्स से अलग करने के लिए एक slider challenge के माध्यम से उपयोगकर्ताओं का सत्यापन करता है।
CapSkip से GeeTest v3 कैप्चा हल करने के लिए, आपको पहले target website से ज़रूरी कैप्चा parameters प्राप्त करने होंगे। ज़रूरी parameters ये हैं:
- gt: सार्वजनिक वेबसाइट कुंजी (स्टैटिक)
- challenge: डायनामिक challenge मान
- api_server: GeeTest API सर्वर डोमेन (वैकल्पिक)
ये values आम तौर पर तब उपलब्ध होती हैं जब website GeeTest को इनिशियलाइज़ करती है।
महत्वपूर्ण: एक नया
challengeवैल्यू हर हल request के लिए प्राप्त करनी होती है। एक बार जब कैप्चा पेज पर लोड हो जाता है, तो पिछलाchallengeअमान्य हो जाता है। आपको website’s के network requests का निरीक्षण करके उस request की पहचान करनी चाहिए जो एक नया generate करती हैchallengevalue और CapSkip को हर हल request सबमिट करने से पहले वह request करें।
POST Request Parameters की सूची
| पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| key | स्ट्रिंग | हाँ* | आपकी CapSkip API key। सिर्फ़ तब ज़रूरी जब API Key सत्यापन सक्षम है। |
| method | स्ट्रिंग | हां | होना ही चाहिए geetest। निर्दिष्ट करता है कि आप एक GeeTest v3 कैप्चा सबमिट कर रहे हैं। |
| gt | स्ट्रिंग | हां | The gt टारगेट वेबसाइट से प्राप्त वैल्यू। |
| challenge | स्ट्रिंग | हां | The challenge लक्षित वेबसाइट से प्राप्त value। हर हल request के लिए एक नई value प्राप्त करनी होगी। |
| pageurl | स्ट्रिंग | हां | GeeTest कैप्चा वाले पेज का पूरा URL। |
| api_server | स्ट्रिंग | नहीं | लक्ष्य वेबसाइट द्वारा उपयोग किया जाने वाला GeeTest API server domain (उदाहरण के लिए api.geetest.com या api-na.geetest.com). |
| json | पूर्णांक डिफ़ॉल्ट: 0 |
नहीं | 0 response को plain text के रूप में लौटाता है। 1 response को JSON के रूप में लौटाता है। |
| proxy | स्ट्रिंग | नहीं | प्रॉक्सी पता। IP authentication के लिए format: IP:PORT (उदाहरण: 123.123.123.123:3128). login/password authentication के लिए format: login:password@IP:PORT. |
| proxytype | स्ट्रिंग | नहीं | प्रॉक्सी का प्रकार। समर्थित values: HTTP, HTTPS, SOCKS5, SOCKS5H। डिफ़ॉल्ट: HTTP जब proxy प्रदान किया गया है पर proxytype छोड़ दिया जाता है। |
अपने CapSkip API endpoint पर एक HTTP GET या POST request सबमिट करें (/in.php) के साथ method=geetest। पिछले चरण में प्राप्त आवश्यक GeeTest parameters को कैप्चा वाले पेज के पूर्ण URL के साथ शामिल करें।
curl -X POST \ -d "key=YOUR_API_KEY" \ -d "method=geetest" \ -d "gt=f1ab2cdefa3456789012345b6c78d90e" \ -d "challenge=12345678abc90123d45678ef90123a456b" \ -d "pageurl=https://www.example.com/" \ -d "api_server=api-na.geetest.com" \ http://127.0.0.1:8080/in.php
अगर सब कुछ सफल होता है, तो CapSkip कैप्चा ID को सादे text के रूप में लौटाएगा: OK|212
अगर json=1 पैरामीटर निर्दिष्ट किया गया है, तो response को JSON format में लौटाया जाएगा:
{
"status": 1,
"request": "212"
}
अन्यथा, CapSkip एक उपयुक्त error code लौटाएगा।
लगभग प्रतीक्षा करें 5 सेकंड, फिर एक HTTP GET request सबमिट करें res.php परिणाम प्राप्त करने के लिए एंडपॉइंट।
GET request parameters की सूची
| पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| key | स्ट्रिंग | हाँ* | आपकी CapSkip API key। सिर्फ़ तब ज़रूरी जब API Key सत्यापन सक्षम है। |
| action | स्ट्रिंग | हां | निर्दिष्ट करें get कैप्चा का हल प्राप्त करने के लिए। |
| id | पूर्णांक | हां | इसके द्वारा लौटाई गई CAPTCHA ID in.php request। |
| json | पूर्णांक डिफ़ॉल्ट: 0 |
नहीं | 0 response को plain text के रूप में लौटाता है। 1 response को JSON के रूप में लौटाता है। |
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=212&json=1"
अगर कैप्चा सफलतापूर्वक हल हो गया है, तो CapSkip समाधान को JSON format में लौटाएगा:
{
"status": 1,
"request": "{\"geetest_challenge\":\"1a2b3456cd67890e12345fab678901c2de\",\"geetest_validate\":\"09fe8d7c6ba54f32e1dcb0a9fedc8765\",\"geetest_seccode\":\"12fe3d4c56789ba01f2e345d6789c012|jordan\"}"
}
अगर कैप्चा अभी तक हल नहीं हुआ है, तो CapSkip लौटाएगा: CAPCHA_NOT_READY
5 सेकंड इंतज़ार करें और request दोहराएँ। अगर कोई त्रुटि होती है, तो CapSkip एक उपयुक्त error code लौटाएगा। टारगेट वेबसाइट को अपनी request सबमिट करते समय निम्नलिखित फ़ील्ड का इस्तेमाल करके CapSkip द्वारा लौटाए गए मानों का उपयोग करें:
geetest_challengegeetest_validategeetest_seccode
ALTCHA एक proof of work कैप्चा है। इसमें पढ़ने के लिए कोई image नहीं होती और न ही बजाने के लिए कोई audio। target site एक challenge जारी करती है, और client को वह number brute force करके निकालना होता है जो उस challenge को पूरा करता हो। CapSkip उसी number की गणना करता है और वही payload लौटाता है जो widget ने बनाया होता।
यह कैसे काम करता है
यहाँ बचाव का आधार पहचान नहीं, बल्कि CPU लागत है। server एक लक्ष्य और एक search range (maxnumber) बताता है, और client तब तक candidates को hash करता रहता है जब तक उनमें से कोई मेल न खा जाए। इससे दो ऐसी बातें निकलती हैं, जो किसी CAPTCHA प्रकार के लिए असामान्य हैं।
पहली, हर solve deterministic होता है। यहाँ न कोई model है और न ही accuracy का कोई आँकड़ा, क्योंकि या तो जवाब बताई गई range के भीतर मौजूद होता है, या फिर challenge ही गलत ढंग से बना था। यहाँ कभी कुछ गलत पढ़ा ही नहीं जाता।
दूसरी, solve time CapSkip नहीं, बल्कि target site तय करती है। reference widget में default range 1,000,000 होती है, यानी कुछ ही milliseconds का काम। साइटें इसे बढ़ाने के लिए स्वतंत्र हैं, और कुछ तो 999,999,999 के साथ आती हैं, जो एक औसत challenge के लिए लगभग 50 करोड़ hashes होते हैं। अगर कोई साइट धीरे हल हो रही है, तो सबसे पहले उसका maxnumber मान देखें।
पूरा चक्र चार चरणों का है:
- challenge को उसी endpoint से लें जहाँ से widget उसे पढ़ता है।
- इसे यहाँ सबमिट करें:
/in.phpके साथmethod=altcha. - जब तक token तैयार न हो जाए, तब तक
/res.phpको poll करते रहें। - token को वापस target form के इस field में भेजें:
altchaफ़ील्ड।
हल करने से पहले आपको क्या चाहिए
challenge, दो में से किसी एक रूप में। दोनों ही स्वीकार किए जाते हैं, इसलिए आपके स्क्रैपर के पास जो पहले से मौजूद है, वही भेज दें।
| पैरामीटर | कब इस्तेमाल करें |
|---|---|
| challenge_json | challenge document आपके पास पहले से मौजूद है। CapSkip उसे लोकल रूप से हल कर लेता है और कोई network request करता ही नहीं, और यही सबसे तेज़ रास्ता है। |
| challenge_url | आपके पास सिर्फ़ वह endpoint है जो challenge देता है। CapSkip उसे fetch करता है, और अगर आपने प्रॉक्सी भेजी है तो उसी के ज़रिए, और फिर उसे हल करता है। |
Challenge कहाँ मिलेगा
browser के developer tools खोलें, target page पर Network tab पर जाएँ, और वह request ढूँढें जो <altcha-widget> element अपने challenge के लिए भेजता है। यह अक्सर ऐसा कोई path होता है, जैसे /altcha/challenge। वही request URL है आपका challenge_url, और जवाब में आने वाला JSON है आपका challenge_json.
इस endpoint का नाम बताने वाला widget attribute अलग-अलग versions में बदलता रहा है, इसलिए अंदाज़ा लगाने के बजाय page का source पढ़ें। Widget v1 और v2 challengeurl="..."का इस्तेमाल करते हैं, जबकि v3 और उसके बाद के versions challenge="..." का इस्तेमाल URL और inline data, दोनों के लिए करते हैं। कुछ deployments challenge को page के भीतर ही बना लेते हैं और कुछ भी fetch नहीं करते।
एक challenge document कुछ ऐसा दिखता है:
{
"algorithm": "SHA-256",
"challenge": "3dd28253be6cc0c54d95f7f98c517e68a1b2c3d4e5f60718293a4b5c6d7e8f90",
"salt": "46d5b1c8871e5152d902ee3f?expires=1893456000",
"signature": "4b1cf0e0be0f4e5247e50b0f9a4498301234567890abcdef1234567890abcdef",
"maxnumber": 1000000
}
Challenge एक्सपायर हो जाते हैं, और समय बहुत कम मिलता है
हर challenge अपनी expiry खुद लेकर आता है, या तो salt के query string में, या फिर parameters.expiresAtके रूप में। एक बार यह समय बीत जाने पर target site solution को एक सादी verification failure के साथ अस्वीकार कर देती है, जो देखने में बिल्कुल गलत जवाब जैसी लगती है। दो मिनट जितनी छोटी समय-सीमाएँ आम हैं।
task बनाने से ठीक पहले challenge fetch करें, और token बिना देर किए सबमिट करें। challenge पहले से जमा करके न रखें, और जब तक कोई user form भर रहा हो तब तक token को रोककर न रखें। अगर आप challenge_url के बजाय challenge_jsonभेजते हैं, तो queue में रहते हुए challenge के expire होने पर CapSkip उसे अपने आप दोबारा fetch कर लेता है।
POST Request Parameters की सूची
| पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| key | स्ट्रिंग | हाँ* | आपकी CapSkip API key। सिर्फ़ तब ज़रूरी जब API Key सत्यापन सक्षम है। |
| method | स्ट्रिंग | हां | होना ही चाहिए altcha। यह बताता है कि आप एक ALTCHA challenge सबमिट कर रहे हैं। |
| pageurl | स्ट्रिंग | हां | उस page का पूरा URL जहाँ से challenge आया है। |
| challenge_url | स्ट्रिंग | हाँ* | वह endpoint जहाँ से CapSkip को challenge fetch करना चाहिए। यह ज़रूरी है, जब तक challenge_json न भेजा जाए। |
| challenge_json | स्ट्रिंग | हाँ* | challenge document खुद, एक JSON string के रूप में। यह ज़रूरी है, जब तक challenge_url न भेजा जाए। |
| proxy | स्ट्रिंग | नहीं | प्रॉक्सी का पता। ये formats स्वीकार्य हैं: IP:PORT, LOGIN:PASSWORD@IP:PORT या IP:PORT:LOGIN:PASSWORD। इसका इस्तेमाल सिर्फ़ challenge_url fetch के लिए होता है। |
| proxytype | स्ट्रिंग | नहीं | प्रॉक्सी का प्रकार: HTTP, HTTPS, SOCKS5 या SOCKS5H. |
| json | पूर्णांक डिफ़ॉल्ट: 0 |
नहीं | 0 response को plain text के रूप में लौटाता है। 1 response को JSON के रूप में लौटाता है। |
इनमें से कोई एक भेजें: challenge_url या challenge_json। दोनों भेजना भी मान्य है, और ऐसे में inline document को प्राथमिकता मिलती है, क्योंकि fetch करने पर वही चीज़ दोबारा मिलेगी जो आपके पास पहले से है।
अपने CapSkip API endpoint पर एक HTTP GET या POST request सबमिट करें (/in.php) के साथ method=altcha। form fields और JSON body, दोनों एक ही field नामों के साथ स्वीकार किए जाते हैं, और GET भी काम करता है, क्योंकि ALTCHA में upload करने के लिए कोई image नहीं होती।
ALTCHA सबमिट करें (form fields):
curl -X POST \ -d "key=YOUR_API_KEY" \ -d "method=altcha" \ -d "pageurl=https://www.example.com/signup" \ --data-urlencode "challenge_url=https://www.example.com/captcha/api/altcha/challenge" \ -d "json=1" \ http://127.0.0.1:8080/in.php
ALTCHA सबमिट करें (JSON body):
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"key": "YOUR_API_KEY",
"method": "altcha",
"pageurl": "https://www.example.com/signup",
"challenge_url": "https://www.example.com/captcha/api/altcha/challenge",
"json": 1
}' \
http://127.0.0.1:8080/in.php
JSON body में तीन ऐसी चीज़ें मुमकिन हैं जो form encoding में नहीं। Flags असली booleans हो सकते हैं ("json": true), challenge_json एक escaped string के बजाय सीधे nested document हो सकता है, और जिस field को null पर सेट किया गया हो, उसे न भेजा गया माना जाता है।
अगर सब कुछ सही है, तो CapSkip CAPTCHA ID को plain text के रूप में लौटाता है: OK|2122988149। अगर json=1 parameter भेजा गया था, तो इसके बजाय response एक JSON envelope होता है। दोनों ही स्थितियों में, लौटाया गया मान वही CAPTCHA ID है जिसके लिए आप result poll करते हैं।
{
"status": 1,
"request": "2122988149"
}
अन्यथा CapSkip एक उपयुक्त error code लौटाता है। गलत ढंग से बना inline challenge polling के बाद नहीं, बल्कि submit request पर ही अस्वीकार कर दिया जाता है, इसलिए आपको उसी request पर पता चल जाता है जो गलत थी।
लगभग 5 सेकंड प्रतीक्षा करें, फिर result endpoint (/res.php) पर आपको मिली CAPTCHA ID के साथ एक HTTP GET request भेजें।
GET request parameters की सूची
| पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| key | स्ट्रिंग | हाँ* | आपकी CapSkip API key। सिर्फ़ तब ज़रूरी जब API Key सत्यापन सक्षम है। |
| action | स्ट्रिंग | हां | निर्दिष्ट करें get कैप्चा का हल प्राप्त करने के लिए। |
| id | पूर्णांक | हां | इसके द्वारा लौटाई गई CAPTCHA ID in.php request। |
| json | पूर्णांक डिफ़ॉल्ट: 0 |
नहीं | 0 response को plain text के रूप में लौटाता है। 1 response को JSON के रूप में लौटाता है। |
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=2122988149&json=1"
अगर CAPTCHA हल हो चुका है, तो CapSkip solution को JSON format में लौटाता है:
{
"status": 1,
"request": "eyJhbGdvcml0aG0iOiJTSEEtMjU2IiwiY2hhbGxlbmdlIjoiM2RkMi...",
"solution": {
"token": "eyJhbGdvcml0aG0iOiJTSEEtMjU2IiwiY2hhbGxlbmdlIjoiM2RkMi...",
"number": 9661
},
"cost": "0.0020",
"createTime": 1788863246,
"endTime": 1788863246,
"errorId": 0,
"solveCount": 1
}
request और solution.token हमेशा एक ही string होते हैं, इसलिए आपका client जिसकी उम्मीद करता है, उसे पढ़ लें। number वह counter है जिसने challenge को हल किया, और इसे पूर्णता के लिए लौटाया जाता है। json=1के बिना, जवाब में सिर्फ़ यह मिलता है: OK|<token>.
अगर CAPTCHA अभी तक हल नहीं हुआ है, तो CapSkip यह लौटाता है: CAPCHA_NOT_READY, ठीक इसी वर्तनी के साथ, जैसा हर दूसरे method पर होता है। 5 सेकंड प्रतीक्षा करें और request दोहराएँ।
अपने polling loop की शर्त इस पर रखें: errorId, न कि status. status वही integer 1 है, जिसे res.php contract हमेशा से यही लौटाता आया है, और हर संगत SDK यही पढ़ता है। यदि आपने अपना क्लाइंट किसी ऐसे डॉक्यूमेंटेशन पेज के आधार पर लिखा है जिसमें दिखाया गया था "status": "ready"दिखाया गया है, तो इसके बजाय यह जाँचें: errorId === 0 , या फिर इस field की मौजूदगी जाँचें: solution.token क्यों मिलता है।
Token सबमिट करना
ALTCHA widget अपना payload एक form field में रखता है, जिसका नाम है altcha। token को उसी field में हूबहू सबमिट करें, ठीक वैसे ही जैसे widget ने किया होता:
POST https://www.example.com/signup Content-Type: application/x-www-form-urlencoded email=someone%40example.com&altcha=eyJhbGdvcml0aG0iOiJTSEEtMjU2Iiwi...
payload की आंतरिक संरचना उसी challenge पर निर्भर करती है जिससे वह बना है। एक legacy challenge एक सपाट document बनाता है, जिसमें ये fields सीधे शामिल होते हैं: number। वहीं एक PoW v2 challenge ऐसा document बनाता है जो मूल challenge को challenge के अंदर और जवाब को solutionके अंदर रखता है। token को opaque मानें और उसे बिना किसी बदलाव के आगे भेज दें, क्योंकि target site पहले से जानती है कि उसे किस आकार की उम्मीद करनी है।
कुछ integrations payload को इसके बजाय JSON body के किसी field से पढ़ते हैं, इसलिए देखें कि page का अपना submit क्या भेजता है और वैसा ही करें। token को दोबारा encode न करें, न उसे trim करें और न ही उसके क्रम में फेरबदल करें। यह एक JSON document का base64 है, जिसके fields server के HMAC signature के दायरे में आते हैं, इसलिए कोई भी बदलाव उसे अमान्य कर देता है।
समर्थित Algorithms
आपको यह पता लगाने की ज़रूरत नहीं कि कोई साइट कौन-सी स्कीम इस्तेमाल करती है। CapSkip challenge को पढ़कर खुद ही algorithm चुन लेता है।
| स्कीम | पीढ़ी | समर्थित | विवरण |
|---|---|---|---|
| Legacy PoW | v1 | हां | ऐसा n खोजें, जहाँ SHA(salt + n) challenge के बराबर हो। SHA-1, SHA-256, SHA-384 और SHA-512, सभी समर्थित हैं। ज़्यादातर deployments आज भी इसी रूप में चलते हैं। |
| PBKDF2 | PoW v2 | हां | ऐसा counter खोजें जिसकी derived key लक्षित prefix से शुरू होती हो। SHA-256, SHA-384 और SHA-512 समर्थित हैं। ALTCHA खुद अपने default के रूप में इसी का सुझाव देता है। |
| SHA | PoW v2 | हां | उसी स्कीम का iterative hash वाला रूप। |
| Argon2id | PoW v2 | नहीं | मेमोरी-हार्ड key derivation function। इसे आज़माया नहीं जाता, बल्कि सीधे अस्वीकार कर दिया जाता है। |
| scrypt | PoW v2 | नहीं | मेमोरी-हार्ड key derivation function। इसे आज़माया नहीं जाता, बल्कि सीधे अस्वीकार कर दिया जाता है। |
दोनों effort modes काम करते हैं और आपसे कुछ नहीं माँगते। deterministic mode में server पहले से ही target की गणना कर लेता है, जिससे solve time अनुमान के मुताबिक रहता है, और probabilistic mode में solve time हर challenge के साथ बदलता रहता है। तीनों widget types (native, checkbox और switch) समर्थित हैं, क्योंकि type सिर्फ़ control की दिखावट तय करता है और कभी API तक पहुँचता ही नहीं।
Argon2id और scrypt को आज़माया नहीं जाता, बल्कि अस्वीकार कर दिया जाता है। इनमें से किसी का भी इस्तेमाल करने वाला task लगभग एक तिहाई सेकंड में यह लौटाता है: ERROR_CAPTCHA_UNSOLVABLE , और इसे कभी दोबारा नहीं आज़माया जाता, इसलिए वह चुपचाप गलत तरीके से हल भी नहीं होता। चूँकि ALTCHA अपने default के रूप में PBKDF2 का सुझाव देता है, इसका असर बहुत कम साइटों पर पड़ता है।
CaptchaFox एक प्राइवेसी-केंद्रित कैप्चा है जो विज़िटर से कुछ पढ़ने के लिए कहने के बजाय browser को ही स्कोर करता है। ज़्यादातर विज़िटर को कोई पहेली दिखती ही नहीं। CapSkip इसे असली browser में असली widget चलाकर हल करता है और वही verification token लौटाता है जो widget ने खुद बनाया होता।
यह कैसे काम करता है
CaptchaFox तीन परतों में फ़ैसला करता है, और उनमें से सिर्फ़ आख़िरी परत दिखाई देती है। widget एक छोटा proof of work चलाता है, browser के बहुत सारे signals इकट्ठा करता है, और दोनों को अपने API पर भेज देता है। अगर यह सबूत सर्विस को संतुष्ट कर देता है, तो token तुरंत जारी हो जाता है और कोई पहेली बनाई ही नहीं जाती। इंटरैक्टिव चैलेंज तभी दिखता है जब यह सबूत पास नहीं होता।
इस बनावट का एक व्यावहारिक नतीजा है, जिसे इंटीग्रेट करने से पहले जान लेना ज़रूरी है। token किसी असली browser सेशन से बनता है, न कि आपके दिए हुए पैरामीटर पर की गई किसी गणना से, इसलिए CapSkip widget को आपके page URL के साथ लोड करता है और उसे चलने देता है। आप CapSkip को site key और page देते हैं, और CapSkip token लौटा देता है।
पूरा चक्र चार चरणों का है:
- टारगेट page से site key पढ़ें।
- इसे यहाँ सबमिट करें:
/in.phpके साथmethod=captchafox. - जब तक token तैयार न हो जाए, तब तक
/res.phpको poll करते रहें। - token को वापस target form के इस field में भेजें:
cf-captcha-responseफ़ील्ड।
हल करने से पहले आपको क्या चाहिए
दो वैल्यू, और दोनों सीधे टारगेट page से ही पढ़ी जाती हैं। न तो कैप्चर करने के लिए कोई चैलेंज डॉक्यूमेंट होता है और न ही ऐसा कुछ जो टास्क के कतार में रहते हुए एक्सपायर हो जाए।
| पैरामीटर | यह कहाँ से आता है |
|---|---|
| sitekey | वह public key जिससे widget रेंडर किया जाता है। यह गुप्त नहीं है, हर विज़िटर के लिए एक ही रहती है, और आम तौर पर इसका प्रीफ़िक्स होता है sk_. |
| pageurl | उस page का पूरा URL जिस पर widget दिखता है। CaptchaFox इसे उन डोमेन से मिलाकर जाँचता है जिनके लिए key रजिस्टर की गई है, इसलिए यह असली page ही होना चाहिए। |
Site Key कहाँ मिलेगी
टारगेट page पर browser के developer tools खोलें और CaptchaFox कंटेनर ढूँढें। साइटें widget को दो में से किसी एक तरीके से रेंडर करती हैं, और दोनों में key दिखाई देती है।
<!-- Automatic rendering: the key is an attribute -->
<div class="captchafox" data-sitekey="sk_xtNxpk6fCdFbxh1_xJeGflSdCE9tn99G"></div>
<!-- Explicit rendering: the key is in the render call -->
<script>
captchafox.render("#container", {
sitekey: "sk_xtNxpk6fCdFbxh1_xJeGflSdCE9tn99G",
onVerify: function (token) { /* ... */ }
});
</script>
अगर page widget को रनटाइम पर बनाता है और इसीलिए इनमें से कुछ भी सर्व किए गए HTML में नहीं है, तो Network टैब खोलें और वह रिक्वेस्ट ढूँढें जो इस पते पर जाती है: api.captchafox.com। key वह path सेगमेंट है जो इसके बाद आता है: /captcha/.
Page URL का Key से मेल खाना ज़रूरी है
CaptchaFox की keys अनुमति वाले डोमेन की एक सूची के साथ रजिस्टर होती हैं, और सर्विस कुछ भी जारी करने से पहले होस्ट की जाँच करती है। जो key सही तो है लेकिन उस सूची से बाहर के किसी page पर इस्तेमाल होती है, उसे कभी-कभार नहीं, बल्कि हमेशा के लिए अस्वीकार कर दिया जाता है।
CapSkip ऐसे मामले को दोबारा आज़माने के बजाय रिपोर्ट कर देता है, क्योंकि दोबारा कोशिश करने से कोई फ़ायदा नहीं होता। अगर कोई site key तुरंत और लगातार फ़ेल होती है, तो जाँचें कि pageurl वही page है जिस पर widget असल में चलता है, न कि कोई सर्च page, कोई रीडायरेक्ट या कोई छोटा किया गया लिंक जो कहीं और जाकर खुलता है।
चैलेंज के प्रकार
कौन-सा चैलेंज आएगा, यह आप तय नहीं करते। यह CaptchaFox तय करता है, और जो मिलता है CapSkip उसे संभाल लेता है।
| Challenge | कब दिखता है | समर्थित | विवरण |
|---|---|---|---|
| Invisible | आम तौर पर | हां | browser के सबूत सर्विस को संतुष्ट कर देते हैं और स्क्रीन पर कुछ भी दिखाए बिना token जारी हो जाता है। यही आम रास्ता है और सबसे तेज़ भी। |
| स्लाइड | कभी-कभी | हां | एक स्लाइडर पहेली, जिसमें एक टुकड़े को खींचकर खाली जगह में ले जाना होता है। CapSkip टारगेट का पता लगाता है और ड्रैग पूरा करता है। |
| इमेज चुनना | बहुत कम | नहीं | चुनने के लिए इमेज का एक ग्रिड। इसे unsolvable बताया जाता है, ताकि आपका क्लाइंट टाइमआउट का इंतज़ार करने के बजाय दोबारा कोशिश करके कोई नया चैलेंज ले सके। |
| ऑडियो | बहुत कम | नहीं | एक्सेसिबिलिटी वाला फ़ॉलबैक। इसी वजह से इसे भी unsolvable बताया जाता है। |
जो दो चैलेंज सपोर्ट नहीं होते, वे कम ही आते हैं, और दोबारा कोशिश करने पर आम तौर पर कोई दूसरा चैलेंज मिल जाता है। unsolvable नतीजे को दोबारा सबमिट करने के संकेत की तरह लें, न कि key की स्थायी विफलता की तरह।
POST Request Parameters की सूची
| पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| key | स्ट्रिंग | हाँ* | आपकी CapSkip API key। सिर्फ़ तब ज़रूरी जब API Key सत्यापन सक्षम है। |
| method | स्ट्रिंग | हां | होना ही चाहिए captchafox। यह बताता है कि आप CaptchaFox कैप्चा सबमिट कर रहे हैं। |
| sitekey | स्ट्रिंग | हां | टारगेट page से पढ़ी गई site key, जिसका प्रीफ़िक्स आम तौर पर होता है sk_. |
| pageurl | स्ट्रिंग | हां | उस page का पूरा URL जिस पर widget दिखता है। |
| api_server | स्ट्रिंग | नहीं | लोड किया जाने वाला widget एंट्री पॉइंट। डिफ़ॉल्ट रूप से यह होता है https://cdn.captchafox.com/। नीचे Widget सोर्स चुनना देखें। |
| useragent | स्ट्रिंग | नहीं | दूसरी सर्विसेज़ के साथ कम्पैटिबिलिटी के लिए इसे स्वीकार किया जाता है, लेकिन लागू नहीं किया जाता। इसके बजाय result के साथ लौटाया गया userAgent इस्तेमाल करें। |
| proxy | स्ट्रिंग | नहीं | प्रॉक्सी का पता। ये formats स्वीकार्य हैं: IP:PORT, LOGIN:PASSWORD@IP:PORT या IP:PORT:LOGIN:PASSWORD. |
| proxytype | स्ट्रिंग | नहीं | प्रॉक्सी का प्रकार: HTTP, HTTPS, SOCKS5 या SOCKS5H. |
| json | पूर्णांक डिफ़ॉल्ट: 0 | नहीं | 0 response को plain text के रूप में लौटाता है। 1 response को JSON के रूप में लौटाता है। |
ज़्यादातर services के उलट, CapSkip इस method के लिए proxy ज़रूरी नहीं करता। फिर भी जैसे ही आप किसी ठीक-ठाक volume पर solve करने लगेंगे, आपको proxy चाहिए होंगे: CaptchaFox सिर्फ़ browser को नहीं, widget जिस network पर चल रहा है उसे भी score करता है, इसलिए एक ही address से बार-बार solve करने पर वह address पहले interactive challenges की तरफ़ और उसके बाद refusals की तरफ़ बढ़ता है। टेस्टिंग और कभी-कभार के solve के लिए एक address काफ़ी है। उससे आगे CapSkip में proxy pool configure करें और load उसी पर बाँटने दें, या token को किसी ख़ास network से आना हो तो हर request के साथ proxy भेजें।
अपने CapSkip API endpoint पर एक HTTP GET या POST request सबमिट करें (/in.php) के साथ method=captchafox। form fields और JSON body, दोनों एक ही field नामों के साथ स्वीकार किए जाते हैं, और GET भी काम करता है, क्योंकि CaptchaFox में अपलोड करने के लिए कोई इमेज होती ही नहीं।
CaptchaFox सबमिट करें (form फ़ील्ड):
curl -X POST \ -d "key=YOUR_API_KEY" \ -d "method=captchafox" \ -d "sitekey=sk_xtNxpk6fCdFbxh1_xJeGflSdCE9tn99G" \ -d "pageurl=https://www.example.com/signup" \ -d "json=1" \ http://127.0.0.1:8080/in.php
CaptchaFox सबमिट करें (JSON बॉडी):
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"key": "YOUR_API_KEY",
"method": "captchafox",
"sitekey": "sk_xtNxpk6fCdFbxh1_xJeGflSdCE9tn99G",
"pageurl": "https://www.example.com/signup",
"json": 1
}' \
http://127.0.0.1:8080/in.php
अगर सब कुछ सही है, तो CapSkip CAPTCHA ID को plain text के रूप में लौटाता है: OK|2122988149। अगर json=1 parameter भेजा गया था, तो इसके बजाय response एक JSON envelope होता है। दोनों ही स्थितियों में, लौटाया गया मान वही CAPTCHA ID है जिसके लिए आप result poll करते हैं।
{
"status": 1,
"request": "2122988149"
}
वरना CapSkip उपयुक्त error code लौटाता है। site key न होने या page URL के इस्तेमाल लायक न होने पर रिक्वेस्ट पोलिंग के बाद नहीं, बल्कि सबमिट रिक्वेस्ट पर ही अस्वीकार हो जाती है, इसलिए जो रिक्वेस्ट ग़लत थी, उसी पर आपको पता चल जाता है।
लगभग 5 सेकंड प्रतीक्षा करें, फिर result endpoint (/res.php) पर वह कैप्चा ID भेजें जो आपको मिली थी। CaptchaFox का एक solve असली browser सेशन चलाता है, इसलिए उम्मीद रखें कि इसमें ALTCHA जैसे गणना-आधारित method से ज़्यादा समय लगेगा, और इंटरैक्टिव चैलेंज आने पर उससे भी ज़्यादा।
GET request parameters की सूची
| पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| key | स्ट्रिंग | हाँ* | आपकी CapSkip API key। सिर्फ़ तब ज़रूरी जब API Key सत्यापन सक्षम है। |
| action | स्ट्रिंग | हां | निर्दिष्ट करें get कैप्चा का हल प्राप्त करने के लिए। |
| id | पूर्णांक | हां | इसके द्वारा लौटाई गई CAPTCHA ID in.php request। |
| json | पूर्णांक डिफ़ॉल्ट: 0 | नहीं | 0 response को plain text के रूप में लौटाता है। 1 response को JSON के रूप में लौटाता है। |
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=2122988149&json=1"
अगर CAPTCHA हल हो चुका है, तो CapSkip solution को JSON format में लौटाता है:
{
"status": 1,
"request": "177f50c25b845601e5c779cdb51b040d523e8ab69efb4d5b343e28df07d05076",
"solution": {
"token": "177f50c25b845601e5c779cdb51b040d523e8ab69efb4d5b343e28df07d05076",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36"
},
"cost": "0.00145",
"createTime": 1788863246,
"endTime": 1788863262,
"errorId": 0,
"solveCount": 1,
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36"
}
request और solution.token हमेशा एक ही स्ट्रिंग होते हैं, इसलिए आपका क्लाइंट जिसकी अपेक्षा करता हो, उसे पढ़ लें। बिना json=1के बिना, जवाब में सिर्फ़ यह मिलता है: OK|<token>.
जब solve कोई browser User-Agent रिपोर्ट करता है, तो वह इस नाम से लौटता है: userAgent, top level पर भी और इसके अंदर भी: solution। plain text मोड में, इसे यहाँ से पढ़ें X-CaptchaFox-User-Agent रिस्पॉन्स हेडर। token सबमिट करते समय यही User-Agent भेजें।
अगर CAPTCHA अभी तक हल नहीं हुआ है, तो CapSkip यह लौटाता है: CAPCHA_NOT_READY, ठीक इसी वर्तनी के साथ, जैसा हर दूसरे method पर होता है। 5 सेकंड प्रतीक्षा करें और request दोहराएँ।
अपने polling loop की शर्त इस पर रखें: errorId, न कि status. status वही integer 1 है, जिसे res.php contract हमेशा से यही लौटाता आया है, और हर संगत SDK यही पढ़ता है। यदि आपने अपना क्लाइंट किसी ऐसे डॉक्यूमेंटेशन पेज के आधार पर लिखा है जिसमें दिखाया गया था "status": "ready"दिखाया गया है, तो इसके बजाय यह जाँचें: errorId === 0 , या फिर इस field की मौजूदगी जाँचें: solution.token क्यों मिलता है।
Token सबमिट करना
CaptchaFox widget अपना token एक form फ़ील्ड में रखता है, जिसका नाम है cf-captcha-response। token को उसी field में हूबहू सबमिट करें, ठीक वैसे ही जैसे widget ने किया होता:
POST https://www.example.com/signup Content-Type: application/x-www-form-urlencoded email=someone%40example.com&cf-captcha-response=177f50c25b845601e5c779cdb51b040d...
कुछ इंटीग्रेशन token को इसके बजाय JSON बॉडी की किसी फ़ील्ड से पढ़ते हैं, इसलिए देखें कि page का अपना submit क्या भेजता है और वैसा ही करें। token को opaque मानें और उसे बिना बदले आगे भेजें। इसकी जाँच सर्वर साइड पर उसी सेशन के आधार पर होती है जिसने इसे बनाया था, इसलिए कोई भी बदलाव इसे अमान्य कर देता है।
Tokens कम समय तक ही चलते हैं। किसी यूज़र के form भरने तक token को रोके रखने के बजाय उसे तुरंत सबमिट करें, और अगर form बीच में छोड़कर बाद में दोबारा शुरू किया जाए, तो फिर से हल करें।
Widget सोर्स चुनना
CaptchaFox अपना widget दो जगहों से पब्लिश करता है, और कोई साइट इनमें से कौन-सा लोड करती है, यही तय करता है कि वह वापस किस रूप में token की उम्मीद करती है। api_server तभी भेजें जब टारगेट page डिफ़ॉल्ट का इस्तेमाल न करता हो।
| api_server | Token | डिफ़ॉल्ट | विवरण |
|---|---|---|---|
| https://cdn.captchafox.com/ | सादा | हां | मानक widget, जिसे अधिकांश साइटें इस्तेमाल करती हैं। जब आप कुछ नहीं भेजते, तब CapSkip यही लोड करता है। |
| https://s.uicdn.com/mampkg/ | MAM_ प्रीफ़िक्स वाला | नहीं | पैकेज्ड बिल्ड, जिसे कुछ प्लेटफ़ॉर्म एम्बेड करते हैं। यह ऐसा token लौटाता है जिसका प्रीफ़िक्स होता है MAM_। पूरा पैकेज पाथ ठीक वैसे ही भेजें जैसा वह page के script टैग में दिखता है। |
यह वैल्यू उस <script> टैग से पढ़ें जो टारगेट page पर widget को लोड करता है। अगर आप ग़लत वाला भेजते हैं, तो solve तब भी सफल होता है, लेकिन token ऐसे फ़ॉर्मैट में वापस आता है जिसे टारगेट साइट स्वीकार नहीं करेगी, और यह किसी एरर की तरह नहीं, बल्कि चुपचाप हुई वेरिफ़िकेशन विफलता जैसी दिखती है।
Capy Puzzle एक ड्रैग एंड ड्रॉप CAPTCHA है: किसी फ़ोटो में से एक टुकड़ा काट लिया जाता है और विज़िटर उसे खिसकाकर वापस उसी खाली जगह में बिठाता है जहाँ से वह आया था। CapSkip वही तीन वैल्यू लौटाता है जो widget ने page में लिखी होतीं, आपके form के साथ सबमिट करने के लिए तैयार।
यह कैसे काम करता है
इस page के बाक़ी CAPTCHA से Capy इस मामले में अलग है कि चैलेंज का कोई भी हिस्सा किसी सर्वर से जारी नहीं होता। widget अपनी challenge key खुद बनाता है, Capy API से उसी key वाली पहेली माँगता है, और विज़िटर टुकड़े को खींचकर सही जगह पर रख देता है। पहले से लाने के लिए कोई token नहीं होता और दोहराने के लिए कोई handshake भी नहीं।
answer कोई कोऑर्डिनेट नहीं होता। widget उस पूरे रास्ते को रिकॉर्ड करता है जिस पर टुकड़े को खींचा गया था और उसे एक स्ट्रिंग में एन्कोड कर देता है, इसलिए आप टारगेट साइट को जो वापस भेजते हैं वह कोई मंज़िल नहीं, बल्कि भरोसेमंद लगने वाला एक ड्रैग होता है। यह रास्ता CapSkip आपके लिए तैयार करता है।
पूरा चक्र चार चरणों का है:
- टारगेट page से CAPTCHA key पढ़ें।
- इसे यहाँ सबमिट करें:
/in.phpके साथmethod=capy. - जब तक token तैयार न हो जाए, तब तक
/res.phpको poll करते रहें। - लौटाई गई तीनों वैल्यू को टारगेट form में वापस भेजें।
हल करने से पहले आपको क्या चाहिए
दो वैल्यू, और दोनों सीधे टारगेट page से ही पढ़ी जाती हैं।
| पैरामीटर | यह कहाँ से आता है |
|---|---|
| captchakey | साइट की सार्वजनिक Capy key, जिसका प्रीफ़िक्स आम तौर पर होता है PUZZLE_। यह page के सोर्स में इस रूप में दिखती है: capy_captchakey, और widget के script URL में इस k query parameter के रूप में। |
| pageurl | उस page का पूरा URL जिस पर widget दिखता है। Capy इस वैल्यू को कभी नहीं देखता, लेकिन keys साइटों के हिसाब से रजिस्टर होती हैं, इसलिए असली page ही भेजें। |
एक तीसरी वैल्यू भी जाँचने लायक है: api_server, जो उस Capy API का रूट है जिसके पीछे यह key रहती है। इसे उसी script टैग से पढ़ें। CapSkip का डिफ़ॉल्ट है https://jp.api.capy.me, जहाँ लाइव सर्विस चलती है, और इसे अलग से बताने की ज़रूरत सिर्फ़ तब पड़ती है जब टारगेट page कहीं और की ओर इशारा कर रहा हो।
कई solving सर्विसेज़ आज भी अपने डॉक्यूमेंटेशन में api.capy.me को बिना रीजनल प्रीफ़िक्स के दिखाती हैं। वह होस्ट अब रिज़ॉल्व नहीं होता। अगर आपने इसे कहीं और से कॉपी किया है, तो इसे हटा दें और CapSkip को अपना डिफ़ॉल्ट इस्तेमाल करने दें।
CAPTCHA key कहाँ मिलेगी
टारगेट page पर browser के developer tools खोलें और Capy widget ढूँढें। साइटें widget को जिन दो तरीक़ों से लोड करती हैं, उन दोनों में key दिखाई देती है।
<!-- In the page source, as the widget configuration -->
<div id="capy"></div>
<script>
window.capyOptions = {
captchakey: "PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v",
puzzle_div: "capy"
};
</script>
<!-- Or in the script URL itself, as the k parameter -->
<script src="https://jp.api.capy.me/puzzle/get_js/?k=PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v"></script>
उस script URL का रूट, https://jp.api.capy.me/ जो ऊपर के उदाहरण में है, वही api_server वैल्यू है, अगर आपको कोई भेजनी हो।
जवाब तीन वैल्यू होता है, कोई token नहीं
इस page के बाक़ी हर method से इसका एक ही ढाँचागत फ़र्क़ है, और क्लाइंट लिखने से पहले इसे पढ़ लेना फ़ायदेमंद है। reCAPTCHA, Turnstile और CaptchaFox, सब एक ही opaque स्ट्रिंग के रूप में वापस आते हैं। Capy का solution तीन अलग-अलग वैल्यू होता है, जो सिर्फ़ साथ मिलकर ही काम करती हैं।
| लौटाई गई वैल्यू | टारगेट form की इस फ़ील्ड में जाती है |
|---|---|
| captchakey | capy_captchakey |
| challengekey | capy_challengekey |
| answer | capy_answer |
चूँकि एक सादा OK|<token> में तीन नहीं, सिर्फ़ एक वैल्यू की जगह होती है, इसलिए /res.php इस method के लिए पूरा solution object लौटाता है। plain text जवाब में भी यही आता है, और JSON जवाब के request field में भी। एक चौथा field, respKey, दूसरी सर्विसेज़ के लिए लिखे गए क्लाइंट्स के साथ कम्पैटिबिलिटी के लिए खाली स्ट्रिंग के रूप में वापस आती है। puzzle के solve में यह कुछ नहीं बताती, इसलिए इसे नज़रअंदाज़ किया जा सकता है।
POST Request Parameters की सूची
| पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| key | स्ट्रिंग | हाँ* | आपकी CapSkip API key। सिर्फ़ तब ज़रूरी जब API Key सत्यापन सक्षम है। |
| method | स्ट्रिंग | हां | होना ही चाहिए capy। यह बताता है कि आप Capy Puzzle CAPTCHA सबमिट कर रहे हैं। |
| captchakey | स्ट्रिंग | हां | टारगेट page से पढ़ी गई CAPTCHA key, जिसका प्रीफ़िक्स आम तौर पर होता है PUZZLE_. sitekey और websiteKey को एलियास के रूप में स्वीकार किया जाता है। |
| pageurl | स्ट्रिंग | हां | उस page का पूरा URL जिस पर widget दिखता है। |
| api_server | स्ट्रिंग | नहीं | उस Capy API का रूट जिसके पीछे यह key रहती है। डिफ़ॉल्ट है https://jp.api.capy.me. |
| version | स्ट्रिंग डिफ़ॉल्ट: puzzle | नहीं | चैलेंज फ़ैमिली। सिर्फ़ puzzle हल किया जाता है। नीचे Puzzle और Avatar देखें। |
| userAgent | स्ट्रिंग | नहीं | पहेली वाली request के साथ भेजा जाने वाला User-Agent। वैकल्पिक, और इसकी ज़रूरत बहुत कम पड़ती है। |
| proxy | स्ट्रिंग | नहीं | प्रॉक्सी का पता। ये formats स्वीकार्य हैं: IP:PORT, LOGIN:PASSWORD@IP:PORT या IP:PORT:LOGIN:PASSWORD. |
| proxytype | स्ट्रिंग | नहीं | प्रॉक्सी का प्रकार: HTTP, HTTPS, SOCKS5 या SOCKS5H. |
| json | पूर्णांक डिफ़ॉल्ट: 0 | नहीं | 0 response को plain text के रूप में लौटाता है। 1 response को JSON के रूप में लौटाता है। |
CapSkip इस method के लिए proxy ज़रूरी नहीं करता, लेकिन जैसे ही आप किसी ठीक-ठाक volume पर solve करने लगेंगे, आपको proxy चाहिए होंगे। हर solve एक live request से Capy API से नई पहेली लेता है, और एक ही address से आने वाला ऐसा लगातार सिलसिला ठीक वही pattern है जिसे पकड़ने के लिए rate limiting बनी है। टेस्टिंग और कभी-कभार के solve के लिए एक address काफ़ी है। उससे आगे CapSkip में proxy pool configure करें और load उसी पर बाँटने दें, या किसी solve को ख़ास network से आना हो तो हर request के साथ proxy भेजें।
अपने CapSkip API endpoint पर एक HTTP GET या POST request सबमिट करें (/in.php) के साथ method=capy। एक जैसे field नामों के तहत form fields, query string और JSON body, तीनों स्वीकार किए जाते हैं, क्योंकि Capy में अपलोड करने के लिए कोई इमेज होती ही नहीं।
Capy Puzzle सबमिट करें (form फ़ील्ड):
curl -X POST \ -d "key=YOUR_API_KEY" \ -d "method=capy" \ -d "captchakey=PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v" \ -d "pageurl=https://www.example.com/login" \ -d "json=1" \ http://127.0.0.1:8080/in.php
Capy Puzzle सबमिट करें (JSON बॉडी):
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"key": "YOUR_API_KEY",
"method": "capy",
"captchakey": "PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v",
"api_server": "https://jp.api.capy.me/",
"pageurl": "https://www.example.com/login",
"json": 1
}' \
http://127.0.0.1:8080/in.php
अगर सब कुछ सही है, तो CapSkip CAPTCHA ID को plain text के रूप में लौटाता है: OK|2122988149। अगर json=1 parameter भेजा गया था, तो इसके बजाय response एक JSON envelope होता है। दोनों ही स्थितियों में, लौटाया गया मान वही CAPTCHA ID है जिसके लिए आप result poll करते हैं।
{
"status": 1,
"request": "2122988149"
}
वरना CapSkip उपयुक्त error code लौटाता है। CAPTCHA key का न होना, page URL का इस्तेमाल लायक न होना, या ऐसा api_server जो URL ही नहीं है: ये सब पोलिंग के बाद नहीं, बल्कि सबमिट रिक्वेस्ट पर ही अस्वीकार हो जाते हैं, इसलिए जो रिक्वेस्ट ग़लत थी, उसी पर आपको पता चल जाता है।
लगभग 3 सेकंड प्रतीक्षा करें, फिर result endpoint (/res.php) पर एक HTTP GET request भेजें, उसी CAPTCHA ID के साथ जो आपको मिली थी। किसी solve को लौटाने से पहले जान-बूझकर इतनी देर रोका जाता है कि वह इंसानी रफ़्तार जैसा लगे। इसकी वजह जानने के लिए नीचे टाइमिंग देखें।
GET request parameters की सूची
| पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| key | स्ट्रिंग | हाँ* | आपकी CapSkip API key। सिर्फ़ तब ज़रूरी जब API Key सत्यापन सक्षम है। |
| action | स्ट्रिंग | हां | निर्दिष्ट करें get कैप्चा का हल प्राप्त करने के लिए। |
| id | पूर्णांक | हां | इसके द्वारा लौटाई गई CAPTCHA ID in.php request। |
| json | पूर्णांक डिफ़ॉल्ट: 0 | नहीं | 0 response को plain text के रूप में लौटाता है। 1 response को JSON के रूप में लौटाता है। |
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=2122988149&json=1"
अगर CAPTCHA हल हो चुका है, तो CapSkip solution को JSON format में लौटाता है:
{
"status": 1,
"request": {
"captchakey": "PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v",
"challengekey": "BalY2gJaI8uA2SGVOZhqBQ3V0CYSNNGP",
"answer": "0xax8ex0xax84x0xkx7qx0x18x76x0x1ix6sx0x26x68x0x2gx5kx0x34x50x",
"respKey": ""
},
"solution": {
"captchakey": "PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v",
"challengekey": "BalY2gJaI8uA2SGVOZhqBQ3V0CYSNNGP",
"answer": "0xax8ex0xax84x0xkx7qx0x18x76x0x1ix6sx0x26x68x0x2gx5kx0x34x50x",
"respKey": ""
},
"cost": "0.00299",
"createTime": 1788863246,
"endTime": 1788863250,
"errorId": 0,
"solveCount": 1
}
request और solution एक ही object लेकर आते हैं, इसलिए आपका क्लाइंट जिसकी अपेक्षा करता हो, उसे पढ़ लें। बिना json=1के, वही object OK| prefix के बाद एक ही JSON line के रूप में आता है। जो client res.php को plain text के रूप में पढ़ता है, वह यही लौटाएगा:
OK|{"captchakey":"PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v","challengekey":"BalY2gJaI8uA2SGVOZhqBQ3V0CYSNNGP","answer":"0xax8ex0xax84x0xkx7qx","respKey":""}
अगर CAPTCHA अभी तक हल नहीं हुआ है, तो CapSkip यह लौटाता है: CAPCHA_NOT_READY, बिल्कुल इसी वर्तनी में, जैसा हर दूसरे method पर होता है। 3 सेकंड प्रतीक्षा करें और request दोहराएँ।
हर नतीजा सिर्फ़ एक बार दिया जाता है। पहला सफल poll हल लौटाकर उसे हटा देता है, और उसी ID के लिए बाद का हर poll खाली बॉडी लौटाता है, इसलिए जिस रिप्लाई में वैल्यू आई थीं, उन्हें सँभालकर रखें।
हल सबमिट करना
ये तीनों वैल्यू उन्हीं form फ़ील्ड में जाती हैं जिन्हें Capy widget ने खुद भरा होता। इन्हें हूबहू वैसे ही सबमिट करें:
<input type="hidden" name="capy_captchakey" value="PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v"> <input type="hidden" name="capy_challengekey" value="BalY2gJaI8uA2SGVOZhqBQ3V0CYSNNGP"> <input type="hidden" name="capy_answer" value="0xax8ex0xax84x0xkx7qx0x18x76x0x1ix6sx">
इसमें कोई बदलाव न करें: answer स्ट्रिंग को न trim करें, न दोबारा एन्कोड करें और न किसी और तरह से साफ़ करें। यह वही ड्रैग पाथ है जो widget ने रिकॉर्ड किया होता, और टारगेट साइट का बैकएंड इसे उसी चैलेंज से मिलाकर जाँचता है जो उसने जारी किया था, इसलिए कोई भी बदलाव इसे अमान्य कर देता है।
challenge key सिर्फ़ एक बार इस्तेमाल होती है और कम समय तक चलती है। CapSkip हर solve के लिए नई key बनाता है और पहेली उसी से बंधी होती है, इसलिए तीनों वैल्यू को कैश करने के बजाय फ़ौरन सबमिट करें, और किसी भी challengekey को दूसरी बार सबमिट करने के लिए कभी दोबारा इस्तेमाल न करें।
टाइमिंग: बहुत जल्दी आने वाले जवाबों को Capy अस्वीकार कर देता है
Capy का यह वही हिस्सा है जो आपका पूरा दिन ले लेगा, अगर आप इसके लिए खुद इंटीग्रेशन बनाएँ। Capy पहेली जारी करने और जवाब मिलने के बीच का असली समय (wall clock) मापता है, और जो कुछ भी इंसानी क्षमता से परे लगे, उसे अस्वीकार कर देता है। यह अस्वीकार उसी मैसेज के साथ होता है जो किसी ग़लत जवाब पर मिलता है, इसलिए 200 मिलीसेकंड में लौटाया गया बिल्कुल सही हल भी किसी ख़राब सॉल्वर से अलग नहीं दिखता।
Capy के अपने sign in page पर, एक सही जवाब को स्थिर रखते हुए मापा गया:
| पहेली से वेरिफ़िकेशन तक का समय | नतीजा |
|---|---|
| 0.48 seconds | Refused |
| 1.03 सेकंड और उससे ज़्यादा, 4 सेकंड तक टेस्ट किया गया | Accepted |
इसीलिए CapSkip हर नतीजे को तब तक रोके रखता है जब तक पहेली बनने के बाद पर्याप्त समय बीत न जाए, लगभग मापी गई न्यूनतम सीमा से दोगुना, क्योंकि वह सीमा Capy की है और बदल सकती है। यह रोक हर solve पर अपने आप लागू होती है और इसमें कुछ भी configure करने की ज़रूरत नहीं है। इसकी क़ीमत latency है, throughput नहीं, और अगर आप नतीजे के लिए poll करते हैं तो यह दिखती तक नहीं, क्योंकि टास्क बस लगभग दो सेकंड लेता है।
Puzzle और Avatar
Capy दो challenge families पब्लिश करता है। ये अलग-अलग endpoints के पीछे अलग-अलग चैलेंज हैं, और CapSkip इनमें से एक को हल करता है।
| version | Challenge | समर्थित | विवरण |
|---|---|---|---|
| puzzle | Assemble a puzzle | हां | डिफ़ॉल्ट, और लगभग हर deployment यही इस्तेमाल करता है। एक टुकड़े को खींचकर वापस उसी खाली जगह में ले जाया जाता है जहाँ से वह काटा गया था। |
| avatar | Drag an object | नहीं | एक अलग challenge टाइप। इसका जवाब देने के बजाय इसे सबमिट के समय ही ERROR_BAD_PARAMETERS के साथ अस्वीकार कर दिया जाता है। |
अगर आप कोई version नहीं भेजते, तो इसका मतलब होता है puzzle, इसलिए ज़्यादातर इंटीग्रेशन इसे कभी सेट ही नहीं करते। किसी avatar request को जान-बूझकर आज़माने के बजाय अस्वीकार कर दिया जाता है: उसे puzzle की तरह हल करने पर ऐसा solution मिलेगा जिसे टारगेट साइट अस्वीकार कर देगी, और यह एक साफ़ error से भी बुरा है, क्योंकि तब यह किसी असमर्थित चैलेंज जैसा नहीं, बल्कि फ़ेल होते सॉल्वर जैसा दिखता है।
Friendly Captcha विज़िटर से कुछ करवाने के बजाय उसके ब्राउज़र से थोड़ी गणना करवाता है। क्लिक करने के लिए कोई छवि नहीं, कोई स्लाइडर नहीं और कोई ऑडियो फ़ॉलबैक नहीं, इसलिए स्क्रीन पर ग़लत करने को कुछ है ही नहीं। CapSkip वही token लौटाता है जो विजेट ने बनाया होता, और उसे आप सीधे अपने फ़ॉर्म के साथ सबमिट कर सकते हैं।
यह कैसे काम करता है
Friendly Captcha एक proof of work कैप्चा है। विजेट को एक difficulty सेटिंग दी जाती है, वह ऐसे मान खोजता है जिनका hash उससे नीचे आए, और परिणाम आपके फ़ॉर्म के एक छिपे हुए फ़ील्ड में लिख देता है। विज़िटर को कभी कुछ दिखाया ही नहीं जाता, और यही इस उत्पाद का मक़सद है: इसे इस्तेमाल करने वाला पेज ऐसा लगता है जैसे उस पर कोई कैप्चा हो ही नहीं।
इस एक ही नाम के नीचे दो बिल्कुल अलग प्रोटोकॉल आते हैं, और sitekey से यह पता नहीं चलता कि कोई साइट कौन सा इस्तेमाल करती है। इन दोनों में सिर्फ़ ब्रांड और sitekey का namespace साझा है, इसके अलावा कुछ नहीं। किसी भी इंटीग्रेशन को सबसे पहले यही सही तय करना होता है कि साइट इनमें से कौन सा चला रही है, इसलिए नीचे इसका अपना अलग अनुभाग है।
पूरा चक्र चार चरणों का है:
- लक्ष्य पेज से sitekey पढ़ें, और उसके साथ विजेट स्क्रिप्ट का URL भी।
- दोनों को इसके साथ सबमिट करें:
/in.phpके साथmethod=friendly_captcha. - जब तक token तैयार न हो जाए, तब तक
/res.phpको poll करते रहें। - token को उस फ़ॉर्म फ़ील्ड में डालें जिसे विजेट ने खुद भरा होता, और फ़ॉर्म सबमिट कर दें।
इस method में हल का समय स्थिर नहीं होता। सेवा हर रिक्वेस्ट के लिए काम की मात्रा उसी क्षण तय करती है जब रिक्वेस्ट की जाती है, इसलिए वही sitekey किसी समय दूसरे समय की तुलना में काफ़ी ज़्यादा महँगा पड़ सकता है। किसी तय अवधि को मान लेने के बजाय अपनी पोलिंग में इसकी गुंजाइश रखें।
हल करने से पहले आपको क्या चाहिए
दो मान आवश्यक हैं, और एक तीसरा भी जब भी मिल सके भेजना उपयोगी रहता है।
| पैरामीटर | यह कहाँ से आता है |
|---|---|
| sitekey | The data-sitekey विजेट एलिमेंट का एट्रिब्यूट, यानी वह एलिमेंट जिस पर यह मौजूद होता है: class="frc-captcha". |
| pageurl | उस page का पूरा URL जिस पर widget दिखता है। |
| module_script | The src विजेट के उस स्क्रिप्ट टैग का, जिस पर यह मौजूद है: type="module"। आवश्यक नहीं, लेकिन CapSkip को यही बताता है कि साइट कौन सा प्रोटोकॉल वर्शन इस्तेमाल करती है, इसलिए अगर पेज पर यह मौजूद हो तो इसे भेजें। |
Version 1 और Version 2
यही वह हिस्सा है जिसे छोड़ देने पर आपकी आधी दोपहर बरबाद होगी। दोनों वर्शन चालू हैं, दोनों इस्तेमाल में हैं, और एक के लिए रजिस्टर किया गया sitekey दूसरे के endpoint पर भी जवाब दे देता है। ग़लत वाला हल करेंगे तो आपको एक ठीक बना हुआ token मिलेगा जिसे लक्ष्य साइट अस्वीकार कर देगी, और कहीं कोई संकेत नहीं मिलेगा कि गड़बड़ी वर्शन की थी।
| version | विजेट पैकेज | समर्थित | विवरण |
|---|---|---|---|
| v1 | friendly-challenge | हां | मूल, ओपन सोर्स विजेट। इसकी स्क्रिप्ट है widget.module.min.js या widget.min.js। जब और कुछ न बताया गया हो तो डिफ़ॉल्ट यही रहता है। |
| v2 | @friendlycaptcha/sdk | हां | मौजूदा SDK। इसकी स्क्रिप्ट है site.min.js। जो पेज इसे लोड करता है वह v2 है, चाहे बाकी सब कुछ जैसा भी दिखे। |
CapSkip वर्शन इसी क्रम में तय करता है, और पहला उत्तर मिलते ही रुक जाता है:
- The
versionपैरामीटर, अगर आपने भेजा हो।v1औरv2यही वर्तनियाँ हैं; अकेला1या2भी स्वीकार किया जाता है। - विजेट स्क्रिप्ट का URL, जो इनसे आता है:
module_scriptयाnomodule_script। यही सबसे भरोसेमंद संकेत है, क्योंकि यही वह बिल्ड है जिसे साइट असल में लोड करती है। - दोनों न मिलने पर,
v1.
CapSkip सेवा से यह नहीं पूछता कि कोई sitekey किस वर्शन का है, क्योंकि सेवा दोनों में से किसी के लिए भी जवाब दे देगी। आप स्वयं version, या स्क्रिप्ट URL भेज दें, तो यह सवाल कभी उठता ही नहीं।
Sitekey कहाँ मिलेगा
लक्ष्य पेज पर ब्राउज़र के डेवलपर टूल्स खोलें और विजेट एलिमेंट ढूँढ़ें। sitekey और स्क्रिप्ट पेज सोर्स में एक-दूसरे के पास ही होते हैं, और दोनों मिलकर वह सब दे देते हैं जो इस method को चाहिए।
<!-- Version 1: the friendly-challenge widget --> <div class="frc-captcha" data-sitekey="FCMEXAMPLE1234AB"></div> <script type="module" src="https://cdn.example.com/[email protected]/widget.module.min.js"></script> <script nomodule src="https://cdn.example.com/[email protected]/widget.min.js"></script> <!-- Version 2: the @friendlycaptcha/sdk widget --> <div class="frc-captcha" data-sitekey="FCMEXAMPLE1234AB"></div> <script type="module" src="https://cdn.example.com/@friendlycaptcha/[email protected]/site.min.js"></script>
कुछ डिप्लॉयमेंट स्क्रिप्ट को CDN के बजाय अपने ही डोमेन से देते हैं। मायने फ़ाइल का नाम रखता है, वह होस्ट नहीं जहाँ से वह आती है।
POST Request Parameters की सूची
| पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| key | स्ट्रिंग | हाँ* | आपकी CapSkip API key। सिर्फ़ तब ज़रूरी जब API Key सत्यापन सक्षम है। |
| method | स्ट्रिंग | हां | होना ही चाहिए friendly_captcha। बताता है कि आप एक Friendly Captcha सबमिट कर रहे हैं। |
| sitekey | स्ट्रिंग | हां | The data-sitekey मान, जो लक्ष्य पेज पर विजेट एलिमेंट से पढ़ा जाता है। |
| pageurl | स्ट्रिंग | हां | उस page का पूरा URL जिस पर widget दिखता है। |
| version | स्ट्रिंग डिफ़ॉल्ट: v1 | नहीं | प्रोटोकॉल वर्शन, v1 या v2। नीचे Version 1 और Version 2 ऊपर देखें। |
| module_script | स्ट्रिंग | नहीं | The src विजेट के उस स्क्रिप्ट टैग का, जिस पर यह मौजूद है: type="module"। इसका उपयोग तब वर्शन तय करने के लिए किया जाता है जब version न भेजा गया हो। |
| nomodule_script | स्ट्रिंग | नहीं | The src विजेट के उस स्क्रिप्ट टैग का, जिस पर यह मौजूद है: nomodule। इसे भी इसी कारण से पढ़ा जाता है। |
| api_server | स्ट्रिंग | नहीं | केवल CapSkip में। वह data residency endpoint जिससे यह sitekey संबंधित है। स्वीकार करता है: global (डिफ़ॉल्ट), eu, या कोई पूरा URL। देखें: डेटा रेजिडेंसी देखें। |
| useragent | स्ट्रिंग | नहीं | रिक्वेस्ट के साथ भेजा जाने वाला User-Agent। वैकल्पिक, और शायद ही कभी ज़रूरी। |
| proxy | स्ट्रिंग | नहीं | प्रॉक्सी का पता। ये formats स्वीकार्य हैं: IP:PORT, LOGIN:PASSWORD@IP:PORT या IP:PORT:LOGIN:PASSWORD. |
| proxytype | स्ट्रिंग | नहीं | प्रॉक्सी का प्रकार: HTTP, HTTPS, SOCKS5 या SOCKS5H. |
| json | पूर्णांक डिफ़ॉल्ट: 0 | नहीं | 0 response को plain text के रूप में लौटाता है। 1 response को JSON के रूप में लौटाता है। |
CapSkip इस method के लिए प्रॉक्सी अनिवार्य नहीं करता, फिर भी इस पेज पर लगभग किसी भी दूसरी जगह की तुलना में यहाँ आपको प्रॉक्सी की ज़रूरत जल्दी पड़ेगी। सेवा हर रिक्वेस्ट के लिए काम की मात्रा खुद तय करती है, और जिन पतों को वह पहले से बहुत देख चुकी है उनके लिए यह आँकड़ा बढ़ा देती है: एक ही पते से एक sitekey पर मापने पर, परीक्षण के एक सत्र के दौरान difficulty सेटिंग लगातार बढ़ती गई, और एक नए पते तथा बहुत इस्तेमाल हो चुके पते के बीच प्रकाशित अंतर उसी token के लिए लगभग तीस गुना काम तक पहुँच जाता है। परीक्षण और कभी-कभार के हल के लिए एक पता ठीक है। उससे आगे CapSkip में एक प्रॉक्सी पूल कॉन्फ़िगर करें और उसे लोड बाँटने दें, या जब किसी हल का किसी ख़ास नेटवर्क से आना ज़रूरी हो तो प्रति-रिक्वेस्ट प्रॉक्सी भेजें।
अपने CapSkip API endpoint पर एक HTTP GET या POST request सबमिट करें (/in.php) के साथ method=friendly_captcha। फ़ॉर्म फ़ील्ड, query string और JSON body, तीनों एक ही फ़ील्ड नामों के साथ स्वीकार किए जाते हैं, क्योंकि इस method में अपलोड करने के लिए कोई छवि नहीं होती।
Friendly Captcha सबमिट करें (फ़ॉर्म फ़ील्ड):
curl -X POST \ -d "key=YOUR_API_KEY" \ -d "method=friendly_captcha" \ -d "sitekey=FCMEXAMPLE1234AB" \ -d "pageurl=https://www.example.com/signup" \ -d "version=v2" \ -d "json=1" \ http://127.0.0.1:8080/in.php
Friendly Captcha सबमिट करें (JSON body, स्पष्ट version के बजाय स्क्रिप्ट URL के साथ):
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"key": "YOUR_API_KEY",
"method": "friendly_captcha",
"sitekey": "FCMEXAMPLE1234AB",
"pageurl": "https://www.example.com/signup",
"module_script": "https://cdn.example.com/@friendlycaptcha/[email protected]/site.min.js",
"nomodule_script": "https://cdn.example.com/@friendlycaptcha/[email protected]/site.compat.js",
"json": 1
}' \
http://127.0.0.1:8080/in.php
अगर सब कुछ सही है, तो CapSkip CAPTCHA ID को plain text के रूप में लौटाता है: OK|2122988149। अगर json=1 parameter भेजा गया था, तो इसके बजाय response एक JSON envelope होता है। दोनों ही स्थितियों में, लौटाया गया मान वही CAPTCHA ID है जिसके लिए आप result poll करते हैं।
{
"status": 1,
"request": "2122988149"
}
अन्यथा CapSkip एक उपयुक्त error code लौटाता है। गुम sitekey या अनुपयोगी पेज URL को पोलिंग के बाद नहीं, बल्कि सबमिट रिक्वेस्ट पर ही अस्वीकार कर दिया जाता है, ताकि आपको उसी रिक्वेस्ट पर पता चल जाए जो ग़लत थी।
लगभग 5 सेकंड प्रतीक्षा करें, फिर result endpoint (/res.php) पर आपको मिली CAPTCHA ID के साथ एक HTTP GET request भेजें।
GET request parameters की सूची
| पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| key | स्ट्रिंग | हाँ* | आपकी CapSkip API key। सिर्फ़ तब ज़रूरी जब API Key सत्यापन सक्षम है। |
| action | स्ट्रिंग | हां | निर्दिष्ट करें get कैप्चा का हल प्राप्त करने के लिए। |
| id | पूर्णांक | हां | इसके द्वारा लौटाई गई CAPTCHA ID in.php request। |
| json | पूर्णांक डिफ़ॉल्ट: 0 | नहीं | 0 response को plain text के रूप में लौटाता है। 1 response को JSON के रूप में लौटाता है। |
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=2122988149&json=1"
अगर कैप्चा हल हो चुका है, तो CapSkip token को JSON फ़ॉर्मैट में लौटाता है। token यहाँ होता है: request, और solution.token उन क्लाइंट्स के लिए भी वही स्ट्रिंग रखता है जो उसे वहाँ पाने की उम्मीद करते हैं:
{
"status": 1,
"request": "c62c4da36bbaf7f253873035832709ef.aqwpWwdbzRWKY/UQAQwwpgAAAAAAAAAAM7hBvJOzqjc=.AAAAAArcCQABAAAAxv8QAAIAAACKYRgA.AgAB",
"solution": {
"token": "c62c4da36bbaf7f253873035832709ef.aqwpWwdbzRWKY/UQAQwwpgAAAAAAAAAAM7hBvJOzqjc=.AAAAAArcCQABAAAAxv8QAAIAAACKYRgA.AgAB"
},
"cost": "0.00299",
"createTime": 1789667786,
"endTime": 1789667807,
"errorId": 0,
"solveCount": 1
}
अगर आप नहीं भेजते json=1, तो वही token सादे टेक्स्ट में OK| उपसर्ग के बाद आता है, और यही वह है जो res.php को टेक्स्ट की तरह पढ़ने वाला क्लाइंट लौटाएगा:
OK|c62c4da36bbaf7f253873035832709ef.aqwpWwdbzRWKY/UQAQwwpgAAAAAAAAAAM7hBvJOzqjc=.AAAAAArcCQABAAAAxv8QAAIAAACKYRgA.AgAB
अगर CAPTCHA अभी तक हल नहीं हुआ है, तो CapSkip यह लौटाता है: CAPCHA_NOT_READY, ठीक इसी वर्तनी के साथ, जैसा हर दूसरे method पर होता है। 5 सेकंड प्रतीक्षा करें और request दोहराएँ।
हर परिणाम एक ही बार दिया जाता है। पहला सफल पोल token लौटाकर उसे हटा देता है, और उसी ID के लिए हर बाद का पोल खाली body लौटाता है, इसलिए token को उसी जवाब से सहेज लें जो उसे लेकर आया था।
दोनों वर्शन बहुत अलग आकार और लंबाई के token बनाते हैं। v1 token डॉट से अलग किए गए चार हिस्सों का होता है और कुछ सौ अक्षरों तक जाता है, जैसा ऊपर दिखाया गया है। v2 token एक अकेली अपारदर्शी स्ट्रिंग होती है जो इससे शुरू होती है: AQQA. और लगभग छह किलोबाइट लंबी होती है, इसलिए यह पक्का कर लें कि जो भी उसे ले जा रहा हो, चाहे कोई छिपा हुआ फ़ील्ड, डेटाबेस कॉलम या प्रॉक्सी से गुज़रने वाली रिक्वेस्ट, उसका आकार उतना हो।
Token सबमिट करना
token उसी छिपे हुए फ़ील्ड में जाता है जिसे विजेट ने खुद भरा होता, और दोनों वर्शन एक ही फ़ील्ड नाम इस्तेमाल नहीं करते। यही बात उन लोगों को फँसाती है जो चलता हुआ v1 इंटीग्रेशन किसी v2 साइट पर ले जाते हैं।
| version | वह फ़ॉर्म फ़ील्ड जिसमें token जाता है |
|---|---|
| v1 | frc-captcha-solution |
| v2 | frc-captcha-response |
<!-- वर्शन 1 --> <input type="hidden" name="frc-captcha-solution" value="c62c4da3...AgAB"> <!-- वर्शन 2 --> <input type="hidden" name="frc-captcha-response" value="AQQA.vW7kd3CujKT8PaQgEcW18QaH...">
token को हूबहू सबमिट करें। उसे trim न करें, दोबारा एनकोड न करें और ऐसे अक्षर न हटाएँ जो padding जैसे लगते हों: उसका हर हिस्सा उसी चैलेंज के विरुद्ध जाँचा जाता है जिसके लिए वह जारी हुआ था, इसलिए कोई भी बदलाव उसे अमान्य कर देता है।
कोई भी साइट उस फ़ील्ड का नाम बदल सकती है, और कुछ बदलती भी हैं। जिस पेज से आप इंटीग्रेट कर रहे हैं अगर वह कोई दूसरा नाम इस्तेमाल करता है, तो नाम विजेट एलिमेंट से पढ़ें और वही इस्तेमाल करें। अगर पेज विजेट के लिए कोई callback परिभाषित करता है, तो उसे token के साथ एकमात्र आर्गुमेंट के रूप में कॉल करने से भी वही काम हो जाता है।
डेटा रेजिडेंसी
Friendly Captcha अलग-अलग data residency क्षेत्रों के लिए अलग endpoint चलाता है, और हर sitekey उनमें से किसी एक का होता है। दोनों ही एक ही sitekey के लिए token जारी कर देंगे, इसलिए ग़लत endpoint पर रिक्वेस्ट भेजने से ऐसा token बनता है जो यहाँ बिल्कुल सही दिखता है और लक्ष्य साइट उसे ठुकरा देती है, बिना इससे ज़्यादा कुछ बताए कि सत्यापन विफल रहा।
विजेट अपना क्षेत्र इस data-api-endpoint एट्रिब्यूट में बताता है। अगर लक्ष्य पेज पर यह मौजूद हो, तो वही मान इस रूप में भेजें: api_server. यह पैरामीटर केवल CapSkip में है और कहीं और इसका कोई समकक्ष नहीं है, इसलिए किसी दूसरी सेवा के लिए लिखा गया क्लाइंट इसे नहीं भेजेगा: जब लक्ष्य पेज किसी क्षेत्रीय endpoint पर हो, तो इसे आप स्वयं जोड़ें।
| api_server | यह क्या चुनता है |
|---|---|
| global | डिफ़ॉल्ट। तब इस्तेमाल होता है जब यह एट्रिब्यूट मौजूद न हो, जो आम स्थिति है। |
| eu | यूरोपीय endpoint, जिसे इससे चुना जाता है: data-api-endpoint="eu". |
| A full URL | स्वयं होस्ट किया गया या किसी और तरह का कस्टम डिप्लॉयमेंट। endpoint को ठीक वैसे ही भेजें जैसे पेज उसे देता है। |
DataDome कई बड़ी दुकानों, समाचार साइटों और मार्केटप्लेस के पीछे काम करने वाली बॉट सुरक्षा है। जब इसे किसी विज़िटर पर शक होता है, तो साइट अपनी सामग्री के बजाय एक ब्लॉक पेज दिखाती है, और उस पेज पर एक स्लाइडर या एक छोटा डिवाइस चेक होता है। इसे पास करने पर एक datadome cookie सेट होती है, और जिन अनुरोधों में यह cookie होती है उन्हें आगे जाने दिया जाता है। CapSkip आपके भेजे गए चैलेंज को पास करता है और cookie लौटाता है, ताकि जिस स्क्रिप्ट के पास अपना कोई ब्राउज़र नहीं है, वह भी साइट को फ़ेच करती रह सके।
यह कैसे काम करता है
ब्लॉक किया गया अनुरोध स्टेटस 403 (कभी-कभी 401) और एक छोटे HTML पेज के साथ वापस आता है। उस पेज में एक script ऑब्जेक्ट होता है, var dd={...}, और यह चैलेंज को एक iframe में लोड करता है, जिसका स्रोत है geo.captcha-delivery.com। CapSkip को इसी iframe के पते की ज़रूरत होती है: इसे कहा जाता है captcha_url देखें।
DataDome दो तरह के चैलेंज दिखाता है, और CapSkip इसी एक मेथड से दोनों को संभालता है:
- स्लाइडर। iframe का पथ होता है
/captcha/और विज़िटर एक स्लाइडर खींचता है, कभी-कभी किसी पज़ल पीस पर। - डिवाइस चेक। iframe का पथ होता है
/interstitial/और पेज पर कुछ सेकंड तक “Verifying the device” लिखा दिखता है। जब चेक संतुष्ट नहीं होता, तो DataDome स्लाइडर पर चला जाता है, और CapSkip भी उसके साथ आगे बढ़ता है।
पूरा चक्र चार चरणों का है:
- लक्ष्य पेज का अनुरोध करें और DataDome ब्लॉक पेज प्राप्त करें।
- उस पेज से (नीचे देखें)
captcha_urlबनाएँ, और उसे सबमिट करें:/in.phpके साथmethod=datadome. - जब तक token तैयार न हो जाए, तब तक
/res.phpजब तक कुकी तैयार न हो जाए। - cookie, उसी User-Agent और उसी IP पते के साथ अपना अनुरोध दोहराएँ।
एक हल में आम तौर पर 3 से 20 सेकंड लगते हैं। डिवाइस चेक इस सीमा के कम समय वाले छोर पर होते हैं और स्लाइडर ज़्यादा समय वाले छोर पर।
Cookie एक IP और एक ब्राउज़र से जुड़ी होती है
DataDome cookie को उस IP पते और User-Agent से जोड़ देता है जिनसे वह हासिल की गई थी। किसी दूसरे पते से, या किसी दूसरे User-Agent के साथ दोबारा भेजी गई cookie आम तौर पर अस्वीकार कर दी जाती है और ब्लॉक पेज वापस आ जाता है। इससे दो नियम निकलते हैं:
- हल उसी पते से होना चाहिए जिससे आप cookie का उपयोग करेंगे। अगर आपके अनुरोध किसी प्रॉक्सी से होकर जाते हैं, तो वही प्रॉक्सी टास्क के साथ भेजें। अगर वे CapSkip चलाने वाले कंप्यूटर से जाते हैं, तो कोई प्रॉक्सी न भेजें।
- वही User-Agent भेजें जिसका आप उपयोग करेंगे। यह Windows के लिए Chrome होना चाहिए, और इसका मुख्य संस्करण उसी ब्राउज़र जैसा होना चाहिए जिससे CapSkip हल करता है। कोई भी दूसरा User-Agent ऐसी cookie बनाएगा जिसे साइट अस्वीकार कर देती है, इसलिए उसे शुरुआत में ही इस त्रुटि के साथ अस्वीकार कर दिया जाता है:
ERROR_WRONG_USERAGENT। Firefox, Safari, Edge और मोबाइल User-Agent भी इसी कारण से अस्वीकार किए जाते हैं।
जब ब्लॉक पेज खुद बताता है कि पता प्रतिबंधित है, तो उस पते से भेजा गया कुछ भी पास नहीं हो सकता, इसलिए टास्क को तुरंत ERROR_PROXY_BANNED के साथ अस्वीकार कर दिया जाता है, उसे आज़माया नहीं जाता। आप इसे पहले ही पहचान सकते हैं: dd ऑब्जेक्ट में यह होता है: 't':'bv' के बजाय 't':'fe'। पता बदलें और पेज का दोबारा अनुरोध करें।
captcha_url बनाना
अगर आपको मिले ब्लॉक पेज में iframe पहले से मौजूद है, तो उसका src एट्रिब्यूट जैसा है वैसा ही ले लें। ज़्यादातर ब्लॉक पेज iframe को script से बनाते हैं, इसलिए आप वही पता dd ऑब्जेक्ट से जोड़कर बनाते हैं। एक ब्लॉक पेज ऐसा दिखता है:
<script>
var dd={'rt':'c','cid':'AHrlqAAAAAMA7KBvCr0n4cEAG330MA==','hsh':'D013AA612AB2224D03B2318D0F5B19','t':'fe','s':45225,'e':'549255a0289eaf17af60822309ab8db4','host':'geo.captcha-delivery.com','cookie':'KzE6_pZBBTHdCdvZkauT9VAshi0wS7~v5_M_MacEtdw8'}
</script>
<script src="https://ct.captcha-delivery.com/c.js"></script>
इसका मान rt पथ तय करता है: c नहीं भेजते, तो इसका मतलब होता है https://geo.captcha-delivery.com/captcha/ और i नहीं भेजते, तो इसका मतलब होता है https://geo.captcha-delivery.com/interstitial/। क्वेरी स्ट्रिंग बाकी फ़ील्ड से बनती है:
| URL पैरामीटर | मान |
|---|---|
| initialCid | The cid फ़ील्ड। |
| hash | The hsh फ़ील्ड। |
| cid | The cookie फ़ील्ड। |
| t | The t फ़ील्ड। केवल /captcha/ पर मौजूद होता है। |
| referer | उस पेज का URL जिसका आपने अनुरोध किया था। |
| s | The s फ़ील्ड। |
| e | The e फ़ील्ड, अगर मौजूद हो। |
| b | The b फ़ील्ड। केवल /interstitial/ पर मौजूद होता है। |
| dm | हमेशा cd. |
हर मान को URL encode करें। JavaScript में:
const dd = JSON.parse(html.match(/var dd=(\{[^}]*\})/)[1].replace(/'/g, '"'));
const path = dd.rt === 'i' ? 'interstitial' : 'captcha';
const q = new URLSearchParams({ initialCid: dd.cid, hash: dd.hsh, cid: dd.cookie });
if (dd.t) q.set('t', dd.t);
q.set('referer', pageUrl);
q.set('s', dd.s);
if (dd.e) q.set('e', dd.e);
if (dd.b) q.set('b', dd.b);
q.set('dm', 'cd');
const captchaUrl = `https://${dd.host || 'geo.captcha-delivery.com'}/${path}/?${q}`;
हर ब्लॉक पेज एक नया चैलेंज होता है। इसे मिलते ही जल्द सबमिट करें, और अगले टास्क के लिए पेज का फिर से अनुरोध करें, दोबारा इस्तेमाल न करें कोई पुराना captcha_url.
POST Request Parameters की सूची
| पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| key | स्ट्रिंग | हाँ* | आपकी CapSkip API key। सिर्फ़ तब ज़रूरी जब API Key सत्यापन सक्षम है। |
| method | स्ट्रिंग | हां | होना ही चाहिए datadome। यह बताता है कि आप DataDome चैलेंज सबमिट कर रहे हैं। |
| captcha_url | स्ट्रिंग | हां | चैलेंज iframe का पता, जो इस पर होता है: geo.captcha-delivery.com। नीचे captcha_url बनाना ऊपर देखें। |
| pageurl | स्ट्रिंग | हां | उस पेज का पूरा URL जिसने ब्लॉक पेज लौटाया। |
| userAgent | स्ट्रिंग | नहीं | वह User-Agent जिसे आप cookie के साथ भेजेंगे: Windows के लिए Chrome, जिसका मुख्य संस्करण उसी ब्राउज़र जैसा हो जिससे CapSkip हल करता है। अगर आप इसे नहीं भेजते, तो CapSkip उस ब्राउज़र का User-Agent इस्तेमाल करता है, और उत्तर में उसका नाम दिया जाता है ताकि आप उसे जस का तस कॉपी कर सकें। |
| proxy | स्ट्रिंग | नहीं | प्रॉक्सी का पता। ये formats स्वीकार्य हैं: IP:PORT, LOGIN:PASSWORD@IP:PORT या IP:PORT:LOGIN:PASSWORD। वही प्रॉक्सी भेजें जिसका उपयोग आपके बाद के अनुरोध करेंगे। |
| proxytype | स्ट्रिंग | नहीं | प्रॉक्सी का प्रकार: HTTP, HTTPS, SOCKS5 या SOCKS5H. |
| json | पूर्णांक डिफ़ॉल्ट: 0 | नहीं | 0 response को plain text के रूप में लौटाता है। 1 response को JSON के रूप में लौटाता है। |
CapSkip इस मेथड के लिए प्रॉक्सी अनिवार्य नहीं करता। परीक्षण और कभी-कभार के हल के लिए एक पता काफ़ी है। उससे आगे, DataDome पते को उतना ही परखता है जितना ब्राउज़र को, और एक ही IP से लगातार आने वाले ब्लॉक पेज के कारण अंत में साइट पर उस IP पर प्रतिबंध लग जाता है। बड़ी मात्रा में, अपने अनुरोध और अपने टास्क रेज़िडेंशियल प्रॉक्सी के एक पूल से भेजें, हर टास्क के लिए एक प्रॉक्सी, और हर cookie का उपयोग उसी प्रॉक्सी से करें जिसने उसे हासिल किया। स्टिकी प्रॉक्सी इस्तेमाल करें, यानी ऐसे प्रॉक्सी जो कम से कम कुछ मिनट तक एक ही एग्ज़िट IP बनाए रखें। जो प्रॉक्सी हर कनेक्शन पर अपना IP बदलता है, वह काम करने वाली cookie नहीं बना सकता: चैलेंज कई पतों से लोड होता है, और अगले पते पर cookie अस्वीकार कर दी जाती है।
CapSkip की अपनी एक DataDome प्रॉक्सी सूची भी है, जो यहाँ मिलती है: सेटिंग्स, कैप्चा टाइप्स, DataDome, प्रॉक्सी कॉन्फ़िगर करें। बिना प्रॉक्सी के भेजे गए टास्क उसी सूची के ज़रिए हल किए जाते हैं। इसे खाली छोड़ दें, जब तक कि cookie वाले अनुरोध भी उन्हीं प्रॉक्सी से होकर न जाते हों, क्योंकि cookie केवल उसी पते से काम करेगी जिसने उसे हल किया। उत्तर में हर टास्क द्वारा इस्तेमाल किया गया प्रॉक्सी बताया जाता है। टास्क के साथ भेजे गए प्रॉक्सी को हमेशा सूची से ज़्यादा प्राथमिकता मिलती है।
अपने CapSkip API endpoint पर एक HTTP GET या POST request सबमिट करें (/in.php) के साथ method=datadome। फ़ॉर्म फ़ील्ड, क्वेरी स्ट्रिंग और JSON बॉडी, तीनों एक जैसे फ़ील्ड नामों के साथ स्वीकार किए जाते हैं।
DataDome सबमिट करें:
curl -X POST \ --data-urlencode "key=YOUR_API_KEY" \ --data-urlencode "method=datadome" \ --data-urlencode "captcha_url=https://geo.captcha-delivery.com/captcha/?initialCid=AHrlqAAAAAMA7KBvCr0n4cEAG330MA%3D%3D&hash=D013AA612AB2224D03B2318D0F5B19&cid=KzE6_pZBBTHdCdvZkauT9VAshi0wS7~v5_M_MacEtdw8&t=fe&referer=https%3A%2F%2Fwww.example.com%2F&s=45225&e=549255a0289eaf17af60822309ab8db4&dm=cd" \ --data-urlencode "pageurl=https://www.example.com/" \ --data-urlencode "userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36" \ --data-urlencode "proxy=login:[email protected]:8080" \ --data-urlencode "proxytype=HTTP" \ --data-urlencode "json=1" \ http://127.0.0.1:8080/in.php
अगर सब कुछ सही है, तो CapSkip CAPTCHA ID को plain text के रूप में लौटाता है: OK|2122988149। अगर json=1 parameter भेजा गया था, तो इसके बजाय response एक JSON envelope होता है। दोनों ही स्थितियों में, लौटाया गया मान वही CAPTCHA ID है जिसके लिए आप result poll करते हैं।
{
"status": 1,
"request": "2122988149"
}
अन्यथा CapSkip कोई भी काम शुरू होने से पहले, सबमिट अनुरोध पर ही एक त्रुटि कोड लौटाता है:
| त्रुटि | कारण |
|---|---|
| ERROR_BAD_PARAMETERS | captcha_url गायब है या DataDome चैलेंज का पता नहीं है। |
| ERROR_PAGEURL | pageurl गायब है या http या https पता नहीं है। |
| ERROR_WRONG_USERAGENT | User-Agent Windows के लिए उस मुख्य संस्करण वाला Chrome नहीं है जिससे CapSkip हल करता है। |
| ERROR_PROXY_BANNED | ब्लॉक पेज बताता है कि यह पता प्रतिबंधित है (t=bv). |
| ERROR_PROXY_FORMAT | proxy मान पढ़ा नहीं जा सका। |
लगभग 5 सेकंड प्रतीक्षा करें, फिर result endpoint (/res.php) पर आपको मिली CAPTCHA ID के साथ एक HTTP GET request भेजें।
GET request parameters की सूची
| पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| key | स्ट्रिंग | हाँ* | आपकी CapSkip API key। सिर्फ़ तब ज़रूरी जब API Key सत्यापन सक्षम है। |
| action | स्ट्रिंग | हां | निर्दिष्ट करें get कैप्चा का हल प्राप्त करने के लिए। |
| id | पूर्णांक | हां | इसके द्वारा लौटाई गई CAPTCHA ID in.php request। |
| json | पूर्णांक डिफ़ॉल्ट: 0 | नहीं | 0 response को plain text के रूप में लौटाता है। 1 response को JSON के रूप में लौटाता है। |
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=2122988149&json=1"
अगर चैलेंज पास हो गया है, तो CapSkip cookie को ठीक वैसे ही लौटाता है जैसे DataDome ने उसे सेट किया था, एट्रिब्यूट समेत:
{
"status": 1,
"request": "datadome=FAPPpli4jkT1MZGtgF8ez7mjSz8MrJ9fGRNE51Gj79cq9fXp5xn~F1P5APWjqvJojf4U9dq0R81Xaj2hpYtjle95mkg; Max-Age=31536000; Domain=.example.com; Path=/; Secure; SameSite=Lax",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36",
"proxy": "203.0.113.10:8080"
}
userAgent वह User-Agent है जिससे cookie हासिल की गई: जो आपने भेजा, या आपके न भेजने पर जिसे CapSkip ने इस्तेमाल किया। cookie वाले हर अनुरोध के साथ इसे भेजें।
proxy केवल तब दिखता है जब आपके टास्क ने कोई प्रॉक्सी नहीं भेजा और CapSkip ने अपनी DataDome प्रॉक्सी सूची से एक प्रॉक्सी लिया। यह उसी प्रॉक्सी को host:portके रूप में दिखाता है, उसके लॉगिन के बिना, और cookie केवल उसी के ज़रिए काम करती है। अगर टास्क ने अपना प्रॉक्सी भेजा था, या CapSkip ने बिना प्रॉक्सी के हल किया, तो यह फ़ील्ड नहीं होता।
अगर आप नहीं भेजते json=1, cookie OK| प्रीफ़िक्स के बाद सादे टेक्स्ट के रूप में आती है, और वही दो मान X-DataDome-User-Agent और X-DataDome-Proxy रिस्पॉन्स हेडर में आते हैं:
OK|datadome=FAPPpli4jkT1MZGtgF8ez7mjSz8MrJ9fGRNE51Gj79cq9fXp5xn~F1P5APWjqvJojf4U9dq0R81Xaj2hpYtjle95mkg; Max-Age=31536000; Domain=.example.com; Path=/; Secure; SameSite=Lax
अगर चैलेंज अभी तक पास नहीं हुआ है, तो CapSkip यह लौटाता है: CAPCHA_NOT_READY, ठीक इसी वर्तनी के साथ, जैसा हर दूसरे method पर होता है। 5 सेकंड प्रतीक्षा करें और request दोहराएँ।
हर परिणाम केवल एक बार दिया जाता है। पहला सफल पोल cookie लौटाता है और उसे हटा देता है, इसलिए उसे उसी उत्तर से सहेज लें जिसमें वह आई थी।
जो टास्क पास नहीं हो सका, वह यह लौटाता है: ERROR_CAPTCHA_UNSOLVABLE। दो विफलताओं में इसके बजाय पते का उल्लेख होता है, क्योंकि उसी पते से दोबारा सबमिट करने पर फिर से विफलता होगी: ERROR_PROXY_BANNED जब हल के दौरान DataDome ने पते को प्रतिबंधित कर दिया, और ERROR_PROXY_CONNECT_REFUSED जब प्रॉक्सी तक पहुँचा नहीं जा सका।
कुकी का इस्तेमाल
पहले सेमीकोलन से पहले वाला हिस्सा ही असली cookie है। इसे अपने अगले अनुरोध के साथ भेजें, उसी प्रॉक्सी से और उसी User-Agent के साथ जो आपने टास्क में भेजा था:
curl "https://www.example.com/" \ -x "http://login:[email protected]:8080" \ -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36" \ -b "datadome=FAPPpli4jkT1MZGtgF8ez7mjSz8MrJ9fGRNE51Gj79cq9fXp5xn~F1P5APWjqvJojf4U9dq0R81Xaj2hpYtjle95mkg"
अगर आप cookie jar रखते हैं, तो आप इसके बजाय पूरी स्ट्रिंग सहेज सकते हैं: Domain, Path और Max-Age वे मान हैं जो DataDome ने साइट के लिए चुने हैं।
DataDome बाद के उत्तरों में एक नई datadome cookie भेज सकता है। सबसे नई cookie रखें, जैसे कोई ब्राउज़र रखता। अगर फिर भी ब्लॉक पेज वापस आता है, तो साइट ने दोबारा चैलेंज करने का फ़ैसला किया है: उससे एक नया captcha_url बनाएँ और एक नया टास्क सबमिट करें।
MTCaptcha एक टेक्स्ट कैप्चा है जो लॉगिन, साइन-अप और संपर्क फ़ॉर्म पर इस्तेमाल होता है। विज़िटर एक तस्वीर में दिखाए गए बिगड़े हुए अक्षर टाइप करता है, और विजेट फ़ॉर्म में एक सत्यापित token डाल देता है। CapSkip आपके भेजे गए sitekey और पेज पते को लेता है और एक मान्य MTCaptcha token लौटाता है, जो फ़ॉर्म के साथ भेजने के लिए तैयार होता है।
यह कैसे काम करता है
MTCaptcha विजेट पेज पर एक sitekey से कॉन्फ़िगर किया जाता है, जिसकी शुरुआत होती है MTPublic- से। जब कोई विज़िटर चैलेंज पास करता है, तो MTCaptcha एक token जारी करता है जिसकी शुरुआत होती है v1( से, और विजेट उसे एक छिपे हुए फ़ॉर्म फ़ील्ड में लिखता है जिसका नाम है mtcaptcha-verifiedtoken। फ़ॉर्म आने पर साइट उस token को MTCaptcha से जाँचती है।
CapSkip को सिर्फ़ sitekey और पेज का पता चाहिए। आपको विजेट खुद लोड या हल नहीं करना है: आपके ब्राउज़र में दिखने वाली तस्वीर कभी नहीं भेजी जाती, और CapSkip जो token लौटाता है वह अपने आप में स्वीकार होता है। पूरा चक्र तीन चरणों का है:
- sitekey और पेज URL इस पर भेजें:
/in.phpके साथmethod=mt_captcha. - जब तक token तैयार न हो जाए, तब तक
/res.phpको poll करते रहें। - फ़ॉर्म इस फ़ील्ड में token के साथ भेजें:
mtcaptcha-verifiedtoken.
Sitekey खोजना
ज़्यादातर पेज विजेट को पेज सोर्स में एक mtcaptchaConfig ऑब्जेक्ट से कॉन्फ़िगर करते हैं:
<script>
var mtcaptchaConfig = {
"sitekey": "MTPublic-KzqLY1cKH",
"action": "login"
};
</script>
sitekey को ठीक वैसे ही कॉपी करें जैसा वह दिखता है। अगर ऑब्जेक्ट action भी सेट करता है, तो वह मान भी भेजें। अगर विजेट पहले से स्क्रीन पर है, तो वही sitekey उसके iframe के पते में मिलता है, जो इस पर है: service.mtcaptcha.com, उसकी query string में इस नाम से: sitekey.
POST Request Parameters की सूची
| पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| key | स्ट्रिंग | हाँ* | आपकी CapSkip API key। सिर्फ़ तब ज़रूरी जब API Key सत्यापन सक्षम है। |
| method | स्ट्रिंग | हां | होना ही चाहिए mt_captcha। बताता है कि आप एक MTCaptcha चैलेंज भेज रहे हैं। mtcaptcha भी स्वीकार किया जाता है। |
| sitekey | स्ट्रिंग | हां | पेज का MTCaptcha sitekey, जिसकी शुरुआत होती है MTPublic-. |
| pageurl | स्ट्रिंग | हां | उस पेज का पूरा URL जिस पर विजेट है। MTCaptcha सिर्फ़ उन्हीं डोमेन के लिए token जारी करता है जिनके लिए sitekey रजिस्टर है, इसलिए असली पेज का पता भेजें। |
| action | स्ट्रिंग | नहीं | वह action नाम जो पेज अपने mtcaptchaConfig ऑब्जेक्ट में सेट करता है, अगर वह सेट हो। |
| userAgent | स्ट्रिंग | नहीं | MTCaptcha को भेजा जाने वाला User-Agent। अगर आप कोई नहीं भेजते, तो CapSkip Windows के Chrome का User-Agent इस्तेमाल करता है। |
| proxy | स्ट्रिंग | नहीं | प्रॉक्सी का पता। ये formats स्वीकार्य हैं: IP:PORT, LOGIN:PASSWORD@IP:PORT या IP:PORT:LOGIN:PASSWORD. |
| proxytype | स्ट्रिंग | नहीं | प्रॉक्सी का प्रकार: HTTP, HTTPS, SOCKS4, SOCKS5 या SOCKS5H. |
| json | पूर्णांक डिफ़ॉल्ट: 0 | नहीं | 0 response को plain text के रूप में लौटाता है। 1 response को JSON के रूप में लौटाता है। |
CapSkip इस मेथड के लिए प्रॉक्सी ज़रूरी नहीं करता। टेस्टिंग और कभी-कभार हल करने के लिए एक पता काफ़ी है। उससे ज़्यादा पर प्रॉक्सी पूल सेट करें: हर हल MTCaptcha की सेवा से नए चैलेंज माँगता है, और एक ही पते से लगातार आने वाली माँगें ठीक वही हैं जिन्हें रेट लिमिटिंग पकड़ने के लिए बनी है। पूल यहाँ जोड़ें: सेटिंग्स, कैप्चा टाइप्स, MTCaptcha, प्रॉक्सी कॉन्फ़िगर करें, और बिना प्रॉक्सी भेजे गए टास्क उस पर बाँट दिए जाते हैं। जब हल किसी ख़ास नेटवर्क से आना ज़रूरी हो, तो टास्क के साथ proxy भेजें। टास्क के साथ भेजा गया प्रॉक्सी हमेशा सूची से ऊपर प्राथमिकता पाता है।
अपने CapSkip API endpoint पर एक HTTP GET या POST request सबमिट करें (/in.php) के साथ method=mt_captcha। फ़ॉर्म फ़ील्ड, क्वेरी स्ट्रिंग और JSON बॉडी, तीनों एक जैसे फ़ील्ड नामों के साथ स्वीकार किए जाते हैं।
MTCaptcha भेजें:
curl -X POST \ --data-urlencode "key=YOUR_API_KEY" \ --data-urlencode "method=mt_captcha" \ --data-urlencode "sitekey=MTPublic-KzqLY1cKH" \ --data-urlencode "pageurl=https://www.example.com/login" \ --data-urlencode "action=login" \ --data-urlencode "json=1" \ http://127.0.0.1:8080/in.php
अगर सब कुछ सही है, तो CapSkip CAPTCHA ID को plain text के रूप में लौटाता है: OK|2122988149। अगर json=1 parameter भेजा गया था, तो इसके बजाय response एक JSON envelope होता है। दोनों ही स्थितियों में, लौटाया गया मान वही CAPTCHA ID है जिसके लिए आप result poll करते हैं।
{
"status": 1,
"request": "2122988149"
}
अन्यथा CapSkip कोई भी काम शुरू होने से पहले, सबमिट अनुरोध पर ही एक त्रुटि कोड लौटाता है:
| त्रुटि | कारण |
|---|---|
| ERROR_BAD_PARAMETERS | sitekey मौजूद नहीं है या MTCaptcha sitekey नहीं है (MTPublic- के बाद अक्षर, अंक, - या _). |
| ERROR_PAGEURL | pageurl गायब है या http या https पता नहीं है। |
| ERROR_PROXY_FORMAT | proxy मान पढ़ा नहीं जा सका। |
लगभग 5 सेकंड प्रतीक्षा करें, फिर result endpoint (/res.php) पर आपको मिली CAPTCHA ID के साथ एक HTTP GET request भेजें।
GET request parameters की सूची
| पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| key | स्ट्रिंग | हाँ* | आपकी CapSkip API key। सिर्फ़ तब ज़रूरी जब API Key सत्यापन सक्षम है। |
| action | स्ट्रिंग | हां | निर्दिष्ट करें get कैप्चा का हल प्राप्त करने के लिए। |
| id | पूर्णांक | हां | इसके द्वारा लौटाई गई CAPTCHA ID in.php request। |
| json | पूर्णांक डिफ़ॉल्ट: 0 | नहीं | 0 response को plain text के रूप में लौटाता है। 1 response को JSON के रूप में लौटाता है। |
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=2122988149&json=1"
अगर चैलेंज पास हो गया है, तो CapSkip MTCaptcha token लौटाता है:
{
"status": 1,
"request": "v1(23ed91f2,61d9f4fe,MTPublic-KzqLY1cKH,079c683122559a6f**)"
}
अगर आप नहीं भेजते json=1, टोकन OK| प्रीफ़िक्स के बाद सादे टेक्स्ट के रूप में आती है:
OK|v1(23ed91f2,61d9f4fe,MTPublic-KzqLY1cKH,079c683122559a6f**)
अगर चैलेंज अभी तक पास नहीं हुआ है, तो CapSkip यह लौटाता है: CAPCHA_NOT_READY, ठीक इसी वर्तनी के साथ, जैसा हर दूसरे method पर होता है। 5 सेकंड प्रतीक्षा करें और request दोहराएँ।
हर परिणाम एक ही बार दिया जाता है। पहला सफल पोल टोकन लौटाता है और उसे हटा देता है, इसलिए जिस रिप्लाई में टोकन आया, उसी से उसे सहेज लें।
जो टास्क पास नहीं हो सका, वह यह लौटाता है: ERROR_CAPTCHA_UNSOLVABLE। दो विफलताएँ इसके बजाय टास्क की ही समस्या बताती हैं, क्योंकि उसे बिना बदले दोबारा भेजने पर फिर विफलता मिलेगी: ERROR_RECAPTCHA_INVALID_SITEKEY जब MTCaptcha sitekey को नहीं पहचानता, और ERROR_RECAPTCHA_INVALID_DOMAIN जब sitekey को इसके डोमेन पर अनुमति नहीं है: pageurl। दोनों कोड अपने पुराने नाम रखते हैं और हर मेथड पर लागू होते हैं।
Token सबमिट करना
token को इस फ़ॉर्म फ़ील्ड में रखें: mtcaptcha-verifiedtoken और फ़ॉर्म वैसे ही भेजें जैसे पेज भेजता। अगर आप फ़ॉर्म खुद भेजते हैं:
curl -X POST "https://www.example.com/login" \ --data-urlencode "username=alice" \ --data-urlencode "password=YOUR_PASSWORD" \ --data-urlencode "mtcaptcha-verifiedtoken=v1(23ed91f2,61d9f4fe,MTPublic-KzqLY1cKH,079c683122559a6f**)"
जिस ब्राउज़र को आप नियंत्रित करते हैं, उसमें फ़ॉर्म भेजे जाने से पहले छिपा हुआ फ़ील्ड सेट करें:
document.querySelector('input[name="mtcaptcha-verifiedtoken"]').value = token;
token थोड़े समय के लिए और सिर्फ़ एक बार इस्तेमाल के लिए होता है: MTCaptcha उसे एक ही बार, और जारी होने के कुछ ही मिनटों के भीतर स्वीकार करता है। मिलते ही उसका इस्तेमाल करें, और हर फ़ॉर्म भेजने के लिए नया token माँगें। साइट अपने सर्वर पर MTCaptcha की checktoken कॉल से token जाँचती है, जो sitekey और डोमेन दोनों जाँचती है, इसलिए token सिर्फ़ उसी साइट पर काम करता है जिसके लिए उसे माँगा गया था।
प्रॉक्सी का उपयोग
reCAPTCHA v2, v3, Invisible, Enterprise, Cloudflare, GeeTest, ALTCHA, CaptchaFox, Capy Puzzle और Friendly Captcha के लिए, आप हर task के साथ एक प्रॉक्सी भेज सकते हैं। CapSkip उस कैप्चा को CapSkip application में कॉन्फ़िगर किए गए proxy pool का इस्तेमाल करने के बजाय उस प्रॉक्सी के ज़रिए हल करेगा।
यह तब उपयोगी है जब लक्षित वेबसाइट जाँचती है कि कैप्चा token उसी IP address से बना है जिससे आपकी अपनी requests आती हैं, उदाहरण के लिए, Cloudflare के पीछे की साइटें, सख़्त reCAPTCHA scoring, या geo-restricted पेज।
POST Request Parameters की सूची
| पैरामीटर | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
| proxy | स्ट्रिंग | नहीं | प्रॉक्सी पता। IP authentication के लिए format: IP:PORT (उदाहरण: 123.123.123.123:3128). login/password authentication के लिए format: login:password@IP:PORT |
| proxytype | स्ट्रिंग | नहीं | प्रॉक्सी का प्रकार। समर्थित values: HTTP, HTTPS, SOCKS5, SOCKS5H। डिफ़ॉल्ट: HTTP जब proxy प्रदान किया गया है पर proxytype छोड़ दिया जाता है। |
एरर कोड
| कोड | अर्थ |
|---|---|
ERROR_KEY_DOES_NOT_EXIST | अमान्य API key। |
ERROR_WRONG_USER_KEY | API key गायब या खाली है। |
ERROR_WRONG_METHOD | अमान्य HTTP method या action पैरामीटर। |
ERROR_WRONG_ID_FORMAT | अमान्य कैप्चा ID फॉर्मैट। |
ERROR_BAD_PARAMETERS | आवश्यक parameters गायब या अमान्य हैं। |
ERROR_UPLOAD | कोई image data नहीं दिया गया या अपलोड नाकाम रहा। |
ERROR_INVALID_IMAGE | अमान्य image format या दूषित image डेटा। |
ERROR_INVALID_BASE64 | अमान्य base64 एन्कोडिंग। |
ERROR_TOO_BIG_CAPTCHA_FILESIZE | इमेज का साइज़ 600 kB से अधिक है या आयाम 1000px से अधिक हैं। |
ERROR_CAPTCHA_UNSOLVABLE | कैप्चा हल करने में विफल। एक नया task सबमिट करें और पुनः प्रयास करें। |
ERROR_GOOGLEKEY | अमान्य googlekey पैरामीटर। |
ERROR_PAGEURL | अमान्य pageurl पैरामीटर। |
ERROR_ZERO_BALANCE | इस method के लिए API key में कोई credits नहीं बचे हैं। |
ERROR_PROXY_FORMAT | The proxy value को parse नहीं किया जा सका। |
ERROR_TASK_NOT_SUPPORTED | यह टास्क प्रकार समर्थित नहीं है, या CapSkip में इसकी सेटिंग बंद है। |
ERROR_PROXY_MISSING | इस टास्क के लिए प्रॉक्सी ज़रूरी है और अनुरोध में कोई इस्तेमाल योग्य प्रॉक्सी नहीं थी। |
ERROR_WRONG_USERAGENT | अनुरोध में दिया गया User-Agent इस टास्क के लिए इस्तेमाल नहीं किया जा सकता। |
ERROR_PROXY_BANNED | लक्षित साइट ने प्रॉक्सी पते को ब्लॉक कर दिया। कोई दूसरी प्रॉक्सी इस्तेमाल करें। |
ERROR_PROXY_CONNECT_REFUSED | प्रॉक्सी के ज़रिए लक्षित साइट तक नहीं पहुँचा जा सका। |
ERROR_RECAPTCHA_INVALID_SITEKEY | The sitekey मौजूद नहीं है, या CAPTCHA सेवा ने इसे इस पेज के लिए अस्वीकार कर दिया। |
ERROR_RECAPTCHA_INVALID_SITEKEY | कैप्चा प्रदाता sitekey को नहीं पहचानता। अपना भेजा हुआ sitekey जाँचें। |
ERROR_RECAPTCHA_INVALID_DOMAIN | sitekey को इसके डोमेन पर अनुमति नहीं है: pageurl। उस पेज का पता भेजें जिस पर विजेट सच में है। |
CAPCHA_NOT_READY | कैप्चा अभी भी प्रोसेस हो रहा है। पोल करते रहें। |
| (खाली response) | परिणाम पहले ही प्राप्त किया जा चुका है, या ID मौजूद नहीं है। |
