ERROR_CAPTCHA_UNSOLVABLE कैसे ठीक करें और सुरक्षित रूप से दोबारा कोशिश करें

error_captcha_unsolvable - How to Fix ERROR_CAPTCHA_UNSOLVABLE and Retry Safely

संक्षिप्त जवाब: ERROR_CAPTCHA_UNSOLVABLE का मतलब है कि सॉल्वर ने आपका टास्क स्वीकार किया, कोशिश की, और उत्तर नहीं निकाल सका। आपकी की ठीक है, आपका सेटअप ठीक है, बस यह एक कोशिश विफल रही। दर्ज किया गया समाधान यह है कि एक नया टास्क भेजकर दोबारा कोशिश करें, न कि उसी captcha ID को फिर से पोल करें। यह गाइड बताती है कि दोबारा पोल करना कभी काम क्यों नहीं करता, हर कैप्चा प्रकार के लिए असल कारण क्या है, और ऐसा रीट्राई लूप कैसा हो जो अनंत तक न घूमे।

इस एरर का मतलब, और यह आता कहाँ से है

की या पैरामीटर की ग़लती के उलट, यह भेजते समय सामने नहीं आती। आपका /in.php कॉल सफल रहा और उसने एक ID लौटाई। विफलता बाद में तब दिखती है जब आप परिणाम के लिए /res.php पोल करते हैं।

# Submit: this part worked, you got an ID back
curl "http://127.0.0.1:8080/in.php?key=YOUR_API_KEY&method=userrecaptcha&googlekey=YOUR_SITEKEY&pageurl=https://example.com/page-with-recaptcha"
OK|2122988149

# Poll: the attempt finished, and it finished badly
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=2122988149"
ERROR_CAPTCHA_UNSOLVABLE

इसलिए यह क्रम अपने आप में काम की बात बताता है: भेजने तक की हर चीज़ सही थी। समस्या इसमें है कि आपने क्या भेजा, इसमें नहीं कि कैसे भेजा।

उसी ID को दोबारा आज़माना कभी क्यों काम नहीं आता

दो कारण, और दोनों ढाँचागत हैं।

पहला, वह कोशिश ख़त्म हो चुकी है। उस ID का परिणाम अंतिम है, और दोबारा पोल करने से दूसरी कोशिश शुरू नहीं होती। दूसरा, परिणाम सिर्फ़ एक बार पढ़े जा सकते हैं। एक बार आपने /res.phpसे परिणाम पढ़ लिया, तो उस ID के पास आपको देने को कुछ नहीं बचता।

अगर विफलता के बाद भी आपका एरर हैंडलिंग उसी ID पर घूमता रहेगा, तो वह आपके टाइमआउट तक घूमेगा और फिर टाइमआउट बताएगा, जिससे आप ग़लत चीज़ की जाँच में लग जाएँगे। दोबारा कोशिश का मतलब है फिर से /in.php कॉल करना और नई ID लेना। यह CAPCHA_NOT_READYके ठीक उलट है, जहाँ सही कदम यही है कि आपके पास मौजूद ID को पोल करते रहें।

कैप्चा प्रकार के अनुसार असली कारण

इमेज कैप्चा: समस्या आमतौर पर इनपुट में होती है

इमेज हल वही प्रकार है जहाँ सचमुच अनसुलझा इनपुट आम है, क्योंकि पिक्सेल आप देते हैं। सॉल्वर को दोष देने से पहले फ़ाइल जाँच लीजिए।

  • आकार की सीमाएँ। 600 kB से ऊपर या किसी भी दिशा में 1000px से ऊपर होने पर इस एरर के बजाय ERROR_TOO_BIG_CAPTCHA_FILESIZE मिलता है, पर इन सीमाओं के आसपास वाली तस्वीरें अक्सर पूरे पेज के स्क्रीनशॉट होती हैं।
  • आपने ग़लत हिस्सा काटा। ऐसी कटाई जिसमें लेबल, बॉर्डर या अगले फ़ील्ड का आधा हिस्सा आ जाए, अकेले कैप्चा से कहीं कठिन तस्वीर बनती है।
  • आपने प्लेसहोल्डर सेव कर लिया। इमेज URL को अलग से माँगने पर अक्सर एक नया, अलग कैप्चा मिलता है, या समाप्त हो चुका, या 1×1 पिक्सेल। वही बाइट लीजिए जो ब्राउज़र के पास पहले से हैं।
  • फ़ॉर्मेट। ख़राब या अप्रत्याशित फ़ॉर्मैट देता है ERROR_INVALID_IMAGE, और ग़लत बना data URI देता है ERROR_INVALID_BASE64.

आप जो बाइट भेज रहे हैं, ठीक वही डिस्क पर सेव करके खोलिए। इमेज की आधी विफलताएँ दो सेकंड में दिख जाती हैं। image कैप्चा सॉल्वर पेज पर स्वीकार किए जाने वाले इनपुट रूप दिए हैं: फ़ाइल पथ, दूरस्थ URL, या एक data:image/png;base64, URI.

reCAPTCHA: पुराना sitekey या ग़लत पेज URL

कैश किए गए पेज सोर्स से पढ़ा गया या स्टेजिंग से कॉपी किया गया sitekey बिना दिक्कत भेजा जाता है और फिर विफल होता है। ऐसा ही उस pageurl के साथ है जो उस पेज से मेल नहीं खाता जहाँ विजेट असल में है, जिसमें स्कीम का न होना या रीडायरेक्ट का पालन न करना भी शामिल है।

Enterprise दूसरा आम कारण है। अगर साइट reCAPTCHA Enterprise चलाती है और आप enterprise फ़्लैग के बिना भेजते हैं, तो टास्क ग़लत कॉन्फ़िगरेशन के हिसाब से हल होता है। v3 के लिए भी यही: भेजिए version, और डिफ़ॉल्ट के बजाय साइट का असली action मान भेजिए verify.

CapSkip v3 के लिए min_score स्वीकार करता है, ताकि किसी दूसरी सेवा से लाया गया कोड चलता रहे, लेकिन इससे token नहीं बदलता, क्योंकि स्कोर Google तय करता है। यह इस एरर का कारण भी नहीं है।

Turnstile: चैलेंज पेज को sitekey से ज़्यादा चाहिए

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

GeeTest: आमतौर पर जवाब यही है कि चैलेंज समाप्त हो चुका था

The gt मान हर साइट के लिए स्थिर होता है। challenge मान एक ही बार इस्तेमाल होता है और लगभग एक मिनट में समाप्त हो जाता है। अगर आप चैलेंज लेकर कुछ और काम करते हैं और फिर भेजते हैं, तो वह पहले ही मर चुका हो सकता है। हल करने से ठीक पहले लीजिए। विवरण इस पेज पर है GeeTest सॉल्वर पेज पर हैं।

एक ऐसा रीट्राई लूप जो सचमुच दोबारा कोशिश करता है

फिर से भेजिए, कोशिशों की सीमा तय कीजिए, और बीच में रुकिए। तीन कोशिशें एक समझदार अधिकतम सीमा है: अगर कोई लक्ष्य तीन नई कोशिशों में विफल हो जाए, तो इनपुट ग़लत है और चौथी उसे ठीक नहीं करेगी।

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

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

def solve_with_retry(sitekey, url, attempts=3):
    for n in range(attempts):
        try:
            # A fresh call means a fresh task, which is the fix.
            return solver.recaptcha(sitekey=sitekey, url=url)
        except ApiException as e:
            if "UNSOLVABLE" not in str(e) or n == attempts - 1:
                raise
            time.sleep(2 ** n)   # 1s, then 2s

token = solve_with_retry("YOUR_SITEKEY", "https://example.com/page-with-recaptcha")
print(token["code"][:40])

ध्यान दीजिए यह क्या नहीं करता: यह ValidationExceptionको दोबारा नहीं आज़माता, क्योंकि ग़लत पैरामीटर हर बार एक जैसे विफल होते हैं; और यह NetworkExceptionको भी दोबारा नहीं आज़माता, क्योंकि उसका मतलब है कि ऐप पहुँच में नहीं है और बाकी सारे लक्ष्य भी अभी विफल होने वाले हैं।

Node.js में यही ढाँचा:

// npm install capskip
const { CapSkip } = require('capskip');

const solver = new CapSkip({ host: '127.0.0.1', port: 8080 });

async function solveWithRetry(sitekey, url, attempts = 3) {
  for (let n = 0; n < attempts; n++) {
    try {
      return await solver.recaptcha(sitekey, url);
    } catch (e) {
      const last = n === attempts - 1;
      if (last || !String(e).includes('UNSOLVABLE')) throw e;
      await new Promise(r => setTimeout(r, 1000 * 2 ** n));
    }
  }
}

इसे कम कैसे किया जाए

  • sitekey को लाइव DOM से पढ़िए, अपने कोड के किसी स्थिरांक से नहीं। साइटें इन्हें बदलती रहती हैं।
  • वही URL भेजिए जिस पर आप असल में हैं, रीडायरेक्ट के बाद, स्कीम सहित।
  • अल्पकालिक मान सबसे आखिर में लें। GeeTest चैलेंज और Turnstile का cData एक मिनट से भी कम में बासी हो जाते हैं।
  • तस्वीरें कसकर काटिए और वही बाइट भेजिए जो पेज पहले ही लोड कर चुका है।
  • हर विफलता के साथ captcha ID लॉग कीजिए। इससे पैटर्न दिखता है: एक ख़राब लक्ष्य है या आम समस्या।
  • पहले किसी ज्ञात रूप से चलने वाले पेज पर परखिए। अगर वह पेज भी विफल हो जो सामान्यतः चलता है, तो समस्या लक्ष्य में नहीं, आपके परिवेश में है।

आस-पास के त्रुटि कोड

नीचे वे हैं जिन्हें लोग अनसुलझे टास्क समझ बैठते हैं। इनके अर्थ अलग हैं और समाधान भी अलग।

कोडअर्थक्या करें
CAPCHA_NOT_READYअभी काम चल रहा हैउसी ID को पोल करते रहिए
ERROR_INVALID_IMAGEफ़ॉर्मैट ग़लत है या डेटा ख़राब हैतस्वीर दोबारा सेव कीजिए और बाइट जाँचिए
ERROR_TOO_BIG_CAPTCHA_FILESIZE600 kB से ऊपर, या 1000px से ऊपरसिर्फ़ कैप्चा तक काटिए
ERROR_INVALID_BASE64base64 सामग्री डिकोड नहीं होगीdata URI उपसर्ग हटाइए या पैडिंग ठीक कीजिए
ERROR_UPLOADकोई इमेज डेटा नहीं आयाफ़ील्ड का नाम और रिक्वेस्ट बॉडी जाँचिए
ERROR_GOOGLEKEYsitekey सीधे अस्वीकार कर दिया गयाइसे लाइव पेज से दोबारा पढ़िए
ERROR_PAGEURLपेज URL गलत बना है, उदाहरण के लिए उसमें स्कीम नहीं हैस्कीम सहित पूरा URL भेजें

API जो भी कोड लौटा सकता है, उसके सटीक अर्थ के साथ, इस पेज पर है API डॉक्युमेंटेशन.

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

क्या विफल हल का कोई ख़र्च पड़ता है?

नहीं। न प्रति-हल शुल्क है और न कोई बैलेंस, क्योंकि काम आपकी अपनी मशीन पर होता है। दोबारा कोशिश में आपका समय और CPU लगता है, इसके अलावा कुछ नहीं। इसीलिए यहाँ तीन कोशिशों वाला लूप उचित है।

क्या एक बार पढ़ने के बाद परिणाम दोबारा मिल सकता है?

नहीं। परिणाम एक ही बार पढ़े जा सकते हैं। token मिलते ही उसे सहेज लीजिए, और उसी ID को दूसरी बार पढ़ने को रिकवरी का तरीक़ा नहीं, अपने कोड की ग़लती मानिए।

क्या प्रॉक्सी से अनसुलझा इमेज कैप्चा ठीक होगा?

नहीं हो सकता। प्रॉक्सी reCAPTCHA, Turnstile, GeeTest और CaptchaFox पर लागू होती हैं, इमेज हल पर नहीं। इमेज टास्क पूरी तरह आपके भेजे पिक्सेल पर आँका जाता है, इसलिए इसके बजाय कटाई सुधारिए।

एक ही साइट के सारे टास्क विफल हो रहे हैं। क्या यह भी यही एरर है?

आमतौर पर यह हर जगह लगाया गया एक ही ग़लत स्थिरांक होता है: पुराना sitekey, गायब enterprise फ़्लैग, या चैलेंज पेज को विजेट मानकर भेजना। लक्ष्य को एक बार सुधारिए और पूरा सेट पास होने लगेगा।

सारांश

इसे error_captcha_unsolvable अपने भेजे गए टास्क पर आया फ़ैसला मानिए। पुरानी ID को पोल मत कीजिए। नई भेजिए, कोशिशें तीन तक सीमित रखिए, और जाँच का समय इनपुट पर लगाइए: sitekey, पेज URL, कटाई, और वह सब कुछ जो अल्पजीवी था और आपने बहुत पहले ले लिया।

लोकल लोकल captcha सॉल्वर चलाने की अच्छी बात यह है कि यह एक सस्ती विफलता है। न कोई क्रेडिट जलता है, न रेट लिमिट ख़र्च होती है, और आप उसी टास्क को उतनी बार दोहरा सकते हैं जितनी बार यह समझने में लगे कि कौन-सा मान ग़लत था।