सबमिट पर ERROR_GOOGLEKEY और ERROR_PAGEURL कैसे ठीक करें

error_googlekey - How to Fix ERROR_GOOGLEKEY and ERROR_PAGEURL on Submit

संक्षिप्त जवाब: ERROR_GOOGLEKEY का मतलब है कि यह मान खारिज हुआ: googlekey जो आपने भेजा था, और ERROR_PAGEURL का मतलब है कि यह मान खारिज हुआ: pageurl मान खारिज हुआ। दोनों यहाँ से आते हैं: /in.php सबमिट के वक्त, इसलिए कोई टास्क बना ही नहीं और पोल करने के लिए कोई कैप्चा ID नहीं है। दस में से नौ बार वजह पैरामीटर का नाम होता है: reCAPTCHA चाहता है googlekey, Turnstile चाहता है sitekey, और गलत वाला भेजने पर ठीक यही होता है। दोनों को कैसे पहचानें और हर एक को कैसे ठीक करें, नीचे बताया गया है।

ये दोनों कोड असल में क्या जाँचते हैं

कोडदस्तावेज़ी अर्थकौन सा पैरामीटर
ERROR_GOOGLEKEYInvalid googlekey पैरामीटर अमान्य हैवह sitekey जो आप पेज से पढ़ते हैं
ERROR_PAGEURLInvalid pageurl पैरामीटर अमान्य हैउस पेज का URL जिस पर विजेट है

ये वैलिडेशन की विफलताएँ हैं, सॉल्व की नहीं। अभी कुछ आज़माया ही नहीं गया और कतार में कुछ नहीं है।

सबमिट का वक्त, पोल का नहीं

यह फ़र्क बहुत सारी डिबगिंग बचाता है। API के दो चरण हैं, और हर चरण त्रुटियों का अपना परिवार पैदा करता है।

# Stage 1: submit. These codes appear HERE.
curl -X POST http://127.0.0.1:8080/in.php \
  -d "key=YOUR_API_KEY" -d "method=userrecaptcha" \
  -d "sitekey=YOUR_SITEKEY" \
  -d "pageurl=https://example.com/page-with-recaptcha"

ERROR_GOOGLEKEY   # no ID came back, so there is nothing to poll

इसकी तुलना एक सही सबमिट से करें, जो लौटाता है OK|2122988149 और फिर, अगर विफल होता भी है, तो यहाँ होता है /res.php। पोल के वक्त की विफलता का मतलब है कि आपके पैरामीटर स्वीकार हुए और सॉल्व खुद नहीं हुआ, जो बिलकुल अलग जाँच है। उसके लिए देखें ERROR_CAPTCHA_UNSOLVABLE , और ERROR_KEY_DOES_NOT_EXIST अगर की खुद ही इन दोनों जाँचों से पहले खारिज हो रही हो।

मान क्यों खारिज होता है

लगभग सब कुछ तीन वजहों में सिमट जाता है, इसी क्रम में।

पहली वजह: googlekey बनाम sitekey

2captcha-अनुरूप API हर मेथड के लिए अलग पैरामीटर नाम इस्तेमाल करता है, और वे आपस में बदले नहीं जा सकते।

तरीकाकी पैरामीटरगलत नाम देता है
userrecaptchagooglekeyERROR_GOOGLEKEY
turnstilesitekeyERROR_BAD_PARAMETERS
geetestgt साथ में challengeERROR_BAD_PARAMETERS

फँसाने वाली बात यह है कि बातचीत में हर कोई इस मान को sitekey कहता है, और HTML एट्रिब्यूट reCAPTCHA तथा Turnstile दोनों में सचमुच यही है: data-sitekey । सिर्फ़ reCAPTCHA के सबमिट पैरामीटर का नाम Google पर रखा गया है। अगर आपने चलता हुआ Turnstile कॉल कॉपी किया और बदल दिया method को userrecaptcha, तो यही आपका बग है।

SDK यह फ़र्क पूरी तरह छिपा देते हैं। solver.recaptcha(sitekey, url) और solver.turnstile(sitekey, url) दोनों एक ही पहला आर्ग्युमेंट लेते हैं और आपके लिए उसे सही वायर नाम पर मैप कर देते हैं, जो इनमें से किसी एक को इस्तेमाल करने की अच्छी वजह है।

दूसरी वजह: की पुरानी, कटी हुई या खाली है

अगर पैरामीटर का नाम सही है, तो अगला संदिग्ध मान खुद है।

  • आपने उसे कोड में हार्डकोड कर दिया। साइटें sitekey बदलती रहती हैं। पिछले महीने चलने वाला कॉन्स्टेंट आज मरा हुआ हो सकता है।
  • वह कैश किए हुए पेज सोर्स से आया। ब्राउज़र में व्यू-सोर्स आपको उससे पुरानी कॉपी दे सकता है जिससे विजेट असल में रेंडर हुआ था।
  • आपने गलत एट्रिब्यूट उठा लिया। मान इसमें रहता है data-sitekey, इसमें नहीं id, name या iframe के इस एट्रिब्यूट में title.
  • शेल वैरिएबल अपने साथ न्यूलाइन ले आया। कमांड सब्स्टिट्यूशन आखिरी व्हाइटस्पेस बनाए रखता है, और व्हाइटस्पेस वैध की का हिस्सा नहीं है।
  • वह खाली है। बिना सेट किया वैरिएबल कुछ भी नहीं बनता, और रिक्वेस्ट इसके साथ चली जाती है googlekey=.

कॉन्स्टेंट पर भरोसा करने की जगह इसे लाइव DOM से पढ़ें:

// Run in the page, or via your automation tool's evaluate().
// reCAPTCHA and Turnstile both expose it as data-sitekey.
const recaptchaKey = document.querySelector('.g-recaptcha')?.dataset.sitekey;
const turnstileKey = document.querySelector('.cf-turnstile')?.dataset.sitekey;

// Fallback: reCAPTCHA also carries it as k= in the widget iframe URL.
const iframe = document.querySelector('iframe[src*="/recaptcha/"]');
const fromSrc = iframe ? new URL(iframe.src).searchParams.get('k') : null;

console.log(recaptchaKey || fromSrc);

The k= फ़ॉलबैक उन साइटों पर मायने रखता है जो विजेट को JavaScript से रेंडर करती हैं और DOM में कभी यह एलिमेंट छोड़ती ही नहीं .g-recaptcha

तीसरी वजह: pageurl को अमान्य क्या बनाता है

ERROR_PAGEURL एक ज़्यादा संकरी और आम तौर पर यांत्रिक समस्या है।

  • कोई स्कीम नहीं। example.com/login URL नहीं है। भेजें https://example.com/login.
  • सापेक्ष पथ। /login वह है जो आपके स्क्रैपर के हाथ में था, वह नहीं जो API को चाहिए।
  • GET में कटाव। अगर पेज URL में उसकी अपनी क्वेरी स्ट्रिंग है और आप उसे बिना एन्कोड किए GET से भेजते हैं, तो पहले ऐम्परसैंड के बाद सब कुछ आपके ही API कॉल के पैरामीटर के रूप में पढ़ा जाता है। POST करें, या इस्तेमाल करें --data-urlencode.
  • व्हाइटस्पेस या कोट्स। कॉन्फ़िग फ़ाइल से पढ़ा गया URL ऐसे कोट्स में लिपटा आ सकता है जिन्हें कभी हटाया ही नहीं गया।

ज़रूरी नहीं कि URL उस मशीन से पहुँच में हो जिस पर CapSkip चल रहा है, और यह भी ज़रूरी नहीं कि यह वही URL हो जिस पर आप आखिर में फ़ॉर्म POST करेंगे। यह वही पेज होना चाहिए जिसमें विजेट लगा है, क्योंकि टोकन उसी से बँधता है।

SDK से यह कैसा दिखता है

SDK साफ़ दिखने वाली दिक्कतें आपकी प्रोसेस से कुछ भी बाहर जाने से पहले पकड़ लेते हैं, और बाकी को आगे भेज देते हैं। दो अलग एक्सेप्शन, दो अलग हल।

# pip install capskip
from capskip import CapSkip, ApiException, ValidationException

solver = CapSkip(host="127.0.0.1", port=8080)

try:
    result = solver.recaptcha(
        sitekey=sitekey_from_dom,
        url="https://example.com/page-with-recaptcha",
    )
except ValidationException:
    # Caught locally: empty sitekey, malformed URL, missing argument.
    print("fix the values before sending")
except ApiException as e:
    # Came back from the API: GOOGLEKEY or PAGEURL rejected.
    print(f"rejected at submit: {e}")

A ValidationException का मतलब है कि आप API तक पहुँचे ही नहीं। इन कोड में से किसी एक को लिए हुए ApiException का मतलब है कि आप पहुँचे थे, और मान ठुकरा दिया गया। C# में भी यही विचार, जहाँ काम बेस टाइप करता है:

using CapSkip;

var solver = new CapSkipClient(host: "127.0.0.1", port: 8080);

try
{
    var result = await solver.RecaptchaAsync(sitekey, pageUrl);
}
catch (ApiException ex)
{
    // ERROR_GOOGLEKEY or ERROR_PAGEURL arrives here.
    Console.WriteLine(ex.Message);
}
catch (CapSkipError ex)
{
    // Everything else the SDK can throw.
    Console.WriteLine(ex.Message);
}

दो मिनट की चेकलिस्ट

  1. आप जो सटीक रिक्वेस्ट बॉडी भेज रहे हैं, उसे प्रिंट करें। वैरिएबल नहीं, बॉडी।
  2. पैरामीटर का नाम मेथड से मिलाएँ: googlekey reCAPTCHA के लिए, sitekey Turnstile के लिए।
  3. पक्का करें कि मान खाली नहीं है और उसके अंत में न्यूलाइन नहीं है।
  4. sitekey को लाइव पेज से दोबारा पढ़ें और भेजे गए मान से मिलाएँ।
  5. पक्का करें कि pageurl इससे शुरू होता है: http:// या https://.
  6. अगर पेज URL में क्वेरी स्ट्रिंग है तो कॉल को POST पर बदल दें।

पहला कदम इसे बाकी पाँचों के मिलेजुले से ज़्यादा बार हल कर देता है, क्योंकि गड़बड़ी आम तौर पर उसमें होती है जो आप सोचते हैं कि भेज रहे हैं और जो असल में तार पर जा रहा है।

आसपास के कोड और उनका मतलब

कोडअर्थ
ERROR_WRONG_USER_KEYAPI की गायब है या खाली है; इन दोनों से पहले जाँची जाती है
ERROR_WRONG_METHODThe method या action मान ऐसा नहीं है जिसे API जानता हो
ERROR_BAD_PARAMETERSउस मेथड के लिए आवश्यक पैरामीटर पूरी तरह गायब है
ERROR_CAPTCHA_UNSOLVABLEसबमिट चला, सॉल्व नहीं। पोल का वक्त, सबमिट का नहीं
CAPCHA_NOT_READYत्रुटि नहीं। उसी ID को पोल करते रहें

हर कोड और उसकी सटीक शब्दावली यहाँ सूचीबद्ध है: API डॉक्युमेंटेशन.

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

क्या ERROR_GOOGLEKEY के बाद दोबारा कोशिश करनी चाहिए?

नहीं। वही मान हर बार उसी तरह खारिज होंगे, इसलिए रिट्राई लूप सिर्फ़ समय बर्बाद करता है और असली समस्या छिपा देता है। मान ठीक करें, फिर एक बार सबमिट करें। रिट्राई पोल के वक्त की विफलता का सही जवाब है, सबमिट के वक्त की नहीं।

मेरा sitekey सही है फिर भी खारिज हो रहा है। अब क्या?

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

क्या pageurl का सार्वजनिक रूप से पहुँच में होना ज़रूरी है?

नहीं। यह बताता है कि विजेट किस पेज का है, इसलिए लॉगिन के पीछे का पेज भी चलता है। यह प्लेसहोल्डर नहीं हो सकता: विजेट वाले डोमेन की जगह कोई और डोमेन भेजने पर ऐसा टोकन बनता है जिसे साइट ठुकरा देगी, भले ही सबमिट कामयाब हो जाए।

क्या Turnstile सॉल्व कभी ERROR_GOOGLEKEY लौटाते हैं?

नहीं लौटाने चाहिए, क्योंकि यह मेथड turnstile कभी यह पैरामीटर पढ़ता ही नहीं googlekey । अगर वह किसी Turnstile कॉल से वापस आ रहा है, तो लगभग हमेशा इसका मतलब है कि method अब भी इस पर सेट है userrecaptcha , किसी कॉपी की गई रिक्वेस्ट से। मेथड ठीक करें, फिर भेजें sitekey के बजाय googlekey.

सारांश

इसे error_googlekey और ERROR_PAGEURL को विफलता नहीं, वर्तनी की गलती मानें। कोई टास्क नहीं बना, कोई कोशिश नहीं हुई, और दोबारा कुछ करने की ज़रूरत नहीं। पैरामीटर का नाम मेथड से मिलाएँ, sitekey को कॉन्स्टेंट की जगह लाइव DOM से पढ़ें, और पेज URL उसकी स्कीम के साथ भेजें। हर मेथड के लिए पूरे पैरामीटर टेबल इस पेज पर हैं: reCAPTCHA सॉल्वर पेज पर हैं।

इसे डिबग करना सस्ता है जब आपके पास लोकल रूप से चलने वाला असीमित कैप्चा सॉल्वर हो। खारिज हुए सबमिट न क्रेडिट जलाते हैं और न कोटा खर्च करते हैं, इसलिए जब तक आप यह पता करें कि कौन सा कैरेक्टर गलत है, तब तक वही रिक्वेस्ट बीस बार दाग सकते हैं।