API दस्तावेज़ीकरण
API को अपने एप्लिकेशन में इंटीग्रेट करने के लिए उपलब्ध एंडपॉइंट्स, रिक्वेस्ट फॉर्मेट, पैरामीटर्स, और उदाहरण रिस्पॉन्स के लिए संदर्भ।
यह documentation उन developers के लिए है जो CapSkip को सीधे अपनी scripts, applications, या automation systems में इंटीग्रेट करना चाहते हैं। third party सॉफ़्टवेयर के उपयोगकर्ताओं को setup निर्देशों के लिए Tutorials अनुभाग का पालन करना चाहिए।
CapSkip व्यापक रूप से इस्तेमाल होने वाली कैप्चा हल करने वाली सेवाओं के APIs को एमुलेट करता है, जिससे यह बिना किसी बदलाव के कम्पैटिबल थर्ड-पार्टी सॉफ़्टवेयर से कनेक्ट हो पाता है। इंटीग्रेशन के लिए आमतौर पर सिर्फ़ CapSkip चलाना ही ज़रूरी होता है।
डॉक्यूमेंटेशन बताता है कि requests कैसे सबमिट करें और results कैसे प्राप्त करें। CapSkip कई API families को सपोर्ट करता है, जिनमें 2Captcha स्टाइल API (in.php / res.php), AntiCaptcha, CapMonster और CapSolver द्वारा उपयोग किया जाने वाला JSON createTask / getTaskResult API, और DeathByCaptcha REST API शामिल हैं। एक ही family की सेवाएँ समान endpoints, request और response format साझा करती हैं। प्रत्येक सेवा के लिए केवल base URL (host और port) अलग होता है।
| API परिवार | सेवाएँ |
|---|---|
| 2captcha-शैली | 2captcha.com, rucaptcha.com, solvecaptcha.com, captchas.io |
| JSON (createTask / getTaskResult) | anti-captcha.com, capmonster.cloud, capsolver.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: रिस्पॉन्स प्लेन टेक्स्ट के रूप में लौटाया जाता है 1: response JSON format में लौटाया जाता है |
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
अगर कैप्चा अभी तक हल नहीं हुआ है, तो 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
अगर कैप्चा अभी तक हल नहीं हुआ है, तो 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: रिस्पॉन्स प्लेन टेक्स्ट के रूप में लौटाया जाता है 1: response JSON format में लौटाया जाता है |
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"
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.phpJSON 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-urlencodedemail=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 | स्ट्रिंग | नहीं | दूसरी सर्विसेज़ के साथ कम्पैटिबिलिटी के लिए इसे स्वीकार किया जाता है, लेकिन लागू नहीं किया जाता। CapSkip असली browser में हल करता है और उसी browser की अपनी एक जैसी पहचान इस्तेमाल करता है। |
| 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"
},
"cost": "0.00145",
"createTime": 1788863246,
"endTime": 1788863262,
"errorId": 0,
"solveCount": 1
}request और solution.token हमेशा एक ही स्ट्रिंग होते हैं, इसलिए आपका क्लाइंट जिसकी अपेक्षा करता हो, उसे पढ़ लें। बिना 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 सबमिट करना
CaptchaFox widget अपना token एक form फ़ील्ड में रखता है, जिसका नाम है cf-captcha-response। token को उसी field में हूबहू सबमिट करें, ठीक वैसे ही जैसे widget ने किया होता:
POST https://www.example.com/signup Content-Type: application/x-www-form-urlencodedemail=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 को ठीक वैसे ही भेजें जैसे पेज उसे देता है। |
प्रॉक्सी का उपयोग
reCAPTCHA v2, v3, Invisible, Enterprise और Cloudflare के लिए, आप हर 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 नहीं किया जा सका। |
CAPCHA_NOT_READY | कैप्चा अभी भी प्रोसेस हो रहा है। पोल करते रहें। |
| (खाली response) | परिणाम पहले ही प्राप्त किया जा चुका है, या ID मौजूद नहीं है। |
