किसी नतीजे के लिए Polling करते समय CAPCHA_NOT_READY कैसे ठीक करें

capcha_not_ready - How to Fix CAPCHA_NOT_READY When Polling for a Result

संक्षिप्त जवाब: CAPCHA_NOT_READY कोई त्रुटि नहीं है। यह API आपको बता रहा है कि कैप्चा अभी भी हल हो रहा है और आपने बहुत जल्दी पूछ लिया। आपकी request में ठीक करने के लिए कुछ नहीं है। आपको बस सही polling लय चाहिए, और एक ऐसा loop जो जानता हो कि कब रुकना है। यह गाइड दोनों को कवर करती है, साथ ही वह read-once व्यवहार भी जो एक काम करती script को उलझन भरी बना देता है।

CAPCHA_NOT_READY का असल में क्या मतलब है

जब आप किसी को कैप्चा submit करते हैं /in.php आपको एक ID वापस मिलती है, कोई उत्तर नहीं। हल बैकग्राउंड में होता है। फिर आप poll करते हैं /res.php उस ID के साथ जब तक जवाब तैयार न हो जाए।

जब तक ऐसा नहीं होता, हर poll वही string लौटाता है:

# Poll for the result. Note action=get and the id from /in.php.
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=CAPTCHA_ID"

# Still working:
CAPCHA_NOT_READY

# Done:
OK|03AGdBq26Sxo...

और हाँ, इसकी वर्तनी है CAPCHA, नहीं CAPTCHA। वह टाइपो 2captcha API में शुरू से ही है। CapSkip उस API के साथ drop-in कंपैटिबल है, इसलिए यह गलत वर्तनी जानबूझकर बनाए रखी गई है। अगर इसे ठीक कर दिया जाता, तो हर मौजूदा क्लाइंट लाइब्रेरी जो सटीक स्ट्रिंग की जाँच करती है वह टूट जाती। अपने कोड में इसे बिल्कुल वैसा ही मिलाएँ।

सही schedule पर poll करें

ज़्यादातर लोग इससे लगातार टकराते हैं क्योंकि वे सबमिट करने के तुरंत बाद poll करते हैं। अलग-अलग कैप्चा प्रकारों में बहुत अलग-अलग समय लगता है, इसलिए पहली जांच सभी के लिए एक ही पल में नहीं होनी चाहिए।

Typeपहली जाँच से पहले रुकेंफिर हर बार फिर से आज़माएँ
Image / text1 सेकंड5 सेकंड
reCAPTCHA v215 से 20 सेकंड5 सेकंड
reCAPTCHA v310 से 15 सेकंड5 सेकंड
GeeTestलगभग 5 सेकंड5 सेकंड
Cloudflare Turnstileलगभग 5 सेकंड5 सेकंड

हर 5 सेकंड से तेज़ polling करने से कुछ भी जल्दी हल नहीं होता। यह बस requests बर्बाद करता है।

एक polling loop जो समाप्त हो जाता है

शेल वर्शन, शेप को स्पष्ट रूप से दिखाते हुए:

# Submit, capture the id, give it a head start, then poll.
ID=$(curl -s "http://127.0.0.1:8080/in.php?key=YOUR_API_KEY&method=userrecaptcha&googlekey=YOUR_SITEKEY&pageurl=https://example.com" | cut -d'|' -f2)

sleep 15
while :; do
  RES=$(curl -s "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=$ID")
  [ "$RES" = "CAPCHA_NOT_READY" ] || break
  sleep 5
done
echo "$RES"

उस लूप में एक खामी है जिसका ज़िक्र ज़रूरी है: अगर अपस्ट्रीम में कुछ गलत हो जाए तो यह हमेशा चलता रहता है। असली कोड में, इसे सीमित करें।

# pip install requests
import time
import requests

BASE = "http://127.0.0.1:8080"

def solve_recaptcha(sitekey, page_url, api_key="YOUR_API_KEY", timeout=180):
    task = requests.get(BASE + "/in.php", params={
        "key": api_key,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": page_url,
        "json": 1,
    }).json()
    task_id = task["request"]

    time.sleep(15)                      # reCAPTCHA needs a head start
    deadline = time.monotonic() + timeout

    while time.monotonic() < deadline:
        res = requests.get(BASE + "/res.php", params={
            "key": api_key,
            "action": "get",
            "id": task_id,
        }).text.strip()

        if res.startswith("OK|"):
            return res.split("|", 1)[1]

        # Anything that is not the pending string is terminal.
        if res != "CAPCHA_NOT_READY":
            raise RuntimeError(res or "empty response: already read, or bad id")

        time.sleep(5)

    raise TimeoutError("gave up after %ss" % timeout)

तीन चीज़ें इसे सुरक्षित बनाती हैं: एक deadline ताकि यह अटक न सके, किसी भी non-pending string को terminal मानना ताकि असली errors तुरंत सामने आ जाएँ, और answer को ठीक एक बार पढ़ना।

या loop को पूरी तरह छोड़ दें

अगर आप किसी आधिकारिक SDK का उपयोग कर रहे हैं, तो ऊपर दी गई कोई भी बात आपकी समस्या नहीं है। Polling call के अंदर ही होती है और आपको token सीधे वापस मिल जाता है, इसलिए CAPCHA_NOT_READY कभी आपके कोड तक नहीं पहुँचता।

# pip install capskip
from capskip import CapSkip

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

# Submit and poll happen inside this one call.
result = solver.recaptcha(
    sitekey="YOUR_SITEKEY",
    url="https://example.com/page-with-recaptcha",
)

print(result["code"])   # token, ready to inject
// npm install capskip
const { CapSkip } = require('capskip');

const solver = new CapSkip({ host: '127.0.0.1', port: 8080 });
const result = await solver.recaptcha('YOUR_SITEKEY', 'https://example.com/page-with-recaptcha');

console.log(result.code);
// composer require capskip/capskip
use CapSkip\CapSkip;

$solver = new CapSkip(['host' => '127.0.0.1', 'port' => 8080]);
$result = $solver->recaptcha('YOUR_SITEKEY', 'https://example.com/page-with-recaptcha');

echo $result['code'];
// dotnet add package CapSkip
using CapSkip;

var solver = new CapSkipClient(host: "127.0.0.1", port: 8080);
var result = await solver.RecaptchaAsync("YOUR_SITEKEY", "https://example.com/page-with-recaptcha");

Console.WriteLine(result.Code);

चारों भाषाओं के लिए पूरे method signatures इस पर हैं कैप्चा हल करने वाला SDK पेज। ऊपर दिया raw loop अभी भी वही है जो आपको Go, Java, Ruby, या किसी भी बिना आधिकारिक package वाली चीज़ के लिए चाहिए।

read-once जाल

यह वह है जो एक पूरी दोपहर बर्बाद कर देता है। हर परिणाम केवल एक बार पढ़ा जा सकता है। एक सफल रीड के बाद फिर से पोल करें और आपको एक खाली रिस्पॉन्स मिलता है, न कि वह टोकन जो आपके पास पहले से था।

तो एक खाली body का मतलब “अभी भी काम कर रहा है” नहीं होता। इसका मतलब दो में से एक बात है:

  • आप पहले ही यह result प्राप्त कर चुके हैं और इसे फेंक चुके हैं
  • ID मौजूद नहीं है, आम तौर पर parsing से आई कोई विकृत या कटी-फटी ID OK|ID

token मिलते ही उसे स्टोर करें। इसे “confirm” करने के लिए दोबारा poll न करें।

जब यह वाकई एक समस्या हो

अगर CAPCHA_NOT_READY कभी हल नहीं होता, pending स्ट्रिंग कारण के बजाय एक लक्षण है। इन्हें क्रम में जाँचें:

रिस्पॉन्सइसका क्या मतलब हैफिक्स
ERROR_CAPTCHA_UNSOLVABLEहल का प्रयास किया गया और विफल रहासत्यापित करें कि sitekey और pageurl लाइव वाले हैं, फिर दोबारा सबमिट करें
ERROR_WRONG_ID_FORMATID एक वैध integer नहीं हैआप पार्स कर रहे हैं OK|ID गलत। pipe पर split करें, फ़ील्ड 2 लें
ERROR_GOOGLEKEYsitekey को सबमिट के समय अस्वीकार कर दिया गयाइसे लाइव पेज से फिर से पढ़ें, cached source से नहीं
खाली bodyपहले ही पढ़ा जा चुका, या अज्ञात IDपहली रीड पर परिणाम संग्रहीत करें
3 मिनट से ज़्यादा लंबितsolver चल नहीं रहा है या पहुंच योग्य नहीं हैपुष्टि करें कि service कॉन्फ़िगर किए गए port पर चालू है। देखें सेटअप गाइड

error strings की पूरी सूची इसमें है the API डॉक्युमेंटेशन.

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

क्या CAPCHA_NOT_READY एक एरर है जिसे मुझे लॉग करना चाहिए?

किसी error के रूप में नहीं। यह सामान्य in-progress स्थिति है और आप इसे प्रति हल कई बार देखेंगे। अगर लॉग करना ही है तो इसे debug level पर करें, वरना आप असली failures को शोर के नीचे दबा देंगे।

क्या तेज़ी से poll करने से answer जल्दी मिलता है?

नहीं। हल का समय इस बात से स्वतंत्र है कि आप कितनी बार पूछते हैं। हर 5 सेकंड प्रलेखित अंतराल है और इससे तेज़ कुछ भी बेकार requests हैं।

इसकी वर्तनी CAPCHA क्यों है, CAPTCHA क्यों नहीं?

यह मूल 2captcha API में एक पुराना टाइपो है जो contract का हिस्सा बन गया। CapSkip उस API के साथ drop-in कंपैटिबल है, इसलिए स्ट्रिंग को बिल्कुल वैसा ही बनाए रखा गया है। वर्तनी ठीक करने से हर वह क्लाइंट टूट जाएगा जो इसकी जाँच करता है।

क्या मुझे pending स्थिति JSON के रूप में मिल सकती है?

हाँ। जोड़ें json=1 request में, और responses एक ऑब्जेक्ट के रूप में वापस आते हैं जिसमें status और request सादे टेक्स्ट के बजाय फ़ील्ड। pending स्ट्रिंग खुद अपरिवर्तित रहती है।

सारांश

अपनी पहली जाँच से पहले हल को एक head start दें, हर 5 सेकंड में दोबारा कोशिश करें, और इसके अलावा किसी भी चीज़ को मानें CAPCHA_NOT_READY terminal के रूप में, loop को एक deadline के साथ सीमित करें, और परिणाम को ठीक एक बार पढ़ें। यही पूरा pattern है।

अगर आप loop बिल्कुल न लिखना चाहें, तो CapSkip एक है कैप्चा सॉल्वर जो लोकल रूप से चलता है और Python, Node.js, PHP और .NET के लिए SDK देता है जो आपके लिए polling संभालते हैं।