Python में data-s पैरामीटर के साथ reCAPTCHA कैसे हल करें

recaptcha data-s parameter - How to Solve reCAPTCHA with the data-s Parameter in Python

Google के अपने पेज reCAPTCHA widget पर एक अतिरिक्त वैल्यू भेजते हैं, और उसे कहते हैं data-s। ऐसे किसी widget को सामान्य तरीक़े से हल करें और आपको जो token मिलता है, पेज उसे ठुकरा देता है। इसका हल एक और आर्गुमेंट है: पेज के HTML में से data-s पढ़ें, उसे solver को पास करें, और token तुरंत सबमिट कर दें।

recaptcha data-s पैरामीटर वही हिस्सा है जिसे लगभग हर कोई चूक जाता है, ज़्यादातर इसलिए कि सामान्य साइटों पर यह होता ही नहीं। यहाँ बताया गया है कि यह कहाँ मिलता है, इसे किस नाम से भेजें, और एक ऐसी script जो शुरू से आख़िर तक काम करती है।

data-s असल में है क्या

यह एक अल्पकालिक, एक बार इस्तेमाल होने वाली वैल्यू है जिसे Google अपनी ही प्रॉपर्टीज़ पर reCAPTCHA widgets के साथ जोड़ता है। Google Search का “unusual traffic” इंटरस्टिशियल वह है जिससे आपका सामना सबसे ज़्यादा होगा। यह वैल्यू challenge को उसी ख़ास पेज लोड से बाँध देती है, इसलिए आपको जो token मिलता है वह सिर्फ़ उसी request context के लिए वैध होता है।

इससे तीन बातें निकलती हैं, और तीनों ही नाकामी की वजह बनती हैं:

  • यह एक्सपायर होती है। इसे nonce की तरह मानें। पेज fetch करें, हल करें, सबमिट करें। रन के बीच इसे cache न करें।
  • यह सिर्फ़ Google पर होती है। किसी और की साइट के reCAPTCHA में जो चीज़ नहीं होती, वह है data-s। इसे फिर भी भेजना पैरामीटर एरर है, कोई हानिरहित अतिरिक्त चीज़ नहीं।
  • यह Enterprise flag नहीं है। इन दोनों को अक्सर आपस में मिला दिया जाता है। data-s और enterprise अलग-अलग विकल्प हैं जो अलग-अलग समस्याएँ हल करते हैं, और reCAPTCHA Enterprise सॉल्वर पेज दूसरे वाले के बारे में बताता है।

आपको क्या चाहिए

  • CapSkip लोकल रूप से चल रहा हो। यह डिफ़ॉल्ट रूप से 127.0.0.1:8080 पर सुनता है, और सेटअप गाइड पेज इंस्टॉल करना बताता है।
  • Python 3.10 या उससे नया।
  • SDK और एक HTTP client।
# the CapSkip SDK plus requests for fetching the page
pip install capskip requests

data-s वैल्यू कहाँ मिलती है

आपको जिन दोनों वैल्यू की ज़रूरत है, वे एक ही element पर होती हैं। widget एक ऐसा div बनाता है जिसमें data-sitekey होता है और, सिर्फ़ Google के पेजों पर, data-s:

<div class="g-recaptcha"
     data-sitekey="6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
     data-s="SGVsbG8gdGhlcmUsIHRoaXMgaXMgYSBvbmUtdGltZSB2YWx1ZQ">
</div>

sitekey स्थिर होती है और आप उसे hardcode कर सकते हैं। data-s वैल्यू हर लोड पर बदलती है, इसलिए इसे रन-टाइम पर scrape करना पड़ता है:

# pip install capskip requests
import re
import requests

PAGE = "https://www.google.com/search?q=example"

# Keep one session. The value is tied to the request that
# produced it, cookies included.
session = requests.Session()
html = session.get(PAGE, timeout=30).text

sitekey = re.search(r'data-sitekey="([^"]+)"', html).group(1)
datas   = re.search(r'data-s="([^"]+)"', html).group(1)

print(sitekey, datas)   # second value is single use

अगर दूसरा match ख़ाली आता है, तो आप Google के पेज पर नहीं हैं और आपको यह पैरामीटर बिल्कुल भी नहीं चाहिए। उसे इसके बजाय एक सामान्य v2 challenge की तरह हल करें।

इसे datas के रूप में भेजें, data-s के रूप में नहीं

यही नाम वाला जाल है। रॉ HTTP API पैरामीटर ठीक वैसे ही लेता है जैसे वह HTML में दिखता है, data-s। SDKs उस नाम का इस्तेमाल नहीं कर सकते, क्योंकि Python के keyword argument में हाइफ़न वैध नहीं है, इसलिए हर SDK इसे इस नाम से देता है datas.

कहाँनाम
पेज का HTMLdata-s
रॉ API, पता in.phpdata-s
Python, Node.js, PHP, .NET के SDKsdatas

यह तय हो जाने के बाद, हल करना बस एक call है:

from capskip import CapSkip

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

result = solver.recaptcha(
    sitekey=sitekey,
    url=PAGE,
    datas=datas,      # the data-s value, scraped seconds ago
)

print(result["code"])   # g-recaptcha-response token

पूरा चलने वाला उदाहरण

Fetch करें, scrape करें, हल करें, सबमिट करें, सब एक ही session पर, ताकि cookies और IP एक जैसे बने रहें:

# pip install capskip requests
import re
import requests
from capskip import (
    CapSkip, ApiException, NetworkException, TimeoutException,
)

PAGE = "https://www.google.com/search?q=example"

session = requests.Session()
solver = CapSkip(host="127.0.0.1", port=8080, recaptchaTimeout=300)

html = session.get(PAGE, timeout=30).text
sitekey = re.search(r'data-sitekey="([^"]+)"', html).group(1)
datas   = re.search(r'data-s="([^"]+)"', html).group(1)

try:
    result = solver.recaptcha(sitekey=sitekey, url=PAGE, datas=datas)
except NetworkException:
    raise SystemExit("CapSkip is not running on 127.0.0.1:8080")
except TimeoutException:
    raise SystemExit("solve took longer than recaptchaTimeout")
except ApiException as err:
    raise SystemExit(f"API refused the task: {err}")

# Submit immediately. The token is good for about two minutes.
response = session.post(
    PAGE,
    data={"g-recaptcha-response": result["code"]},
    timeout=30,
)
print(response.status_code)

इसमें दो बातें दिखने से ज़्यादा मायने रखती हैं। एक ही session दोबारा इस्तेमाल होता है, इसलिए हल करना और सबमिट करना एक ही cookies साझा करते हैं। और सबमिट हल के तुरंत बाद होता है, क्योंकि reCAPTCHA token जारी होने के लगभग दो मिनट बाद स्वीकार होना बंद कर देता है।

प्रॉक्सी के पीछे

अगर आपने पेज किसी प्रॉक्सी के ज़रिए fetch किया है, तो हल भी उसी के ज़रिए करें। challenge उसी request से बँधा होता है जिसने उसे बनाया, और किसी दूसरे network path से किया गया हल token अस्वीकार होने की दूसरी सबसे आम वजह है।

result = solver.recaptcha(
    sitekey=sitekey,
    url=PAGE,
    datas=datas,
    proxy={"type": "HTTPS", "uri": "user:[email protected]:3128"},
)

प्रॉक्सी reCAPTCHA, Turnstile और GeeTest के लिए काम करती हैं। image कैप्चा के लिए वे कुछ नहीं करतीं, क्योंकि वे target साइट को कभी छूते ही नहीं।

वही call, बिना SDK के

API 2captcha कम्पैटिबल है और आपकी अपनी मशीन पर चलता है, इसलिए कोई भी HTTP client चलेगा। यहाँ पैरामीटर अपना हाइफ़न बनाए रखता है:

# submit the task, get an ID back
curl -s -X POST "http://127.0.0.1:8080/in.php" \
  -d "key=capskip" \
  -d "method=userrecaptcha" \
  -d "googlekey=YOUR_SITEKEY" \
  -d "pageurl=https://www.google.com/search?q=example" \
  -d "data-s=THE_DATA_S_VALUE" \
  -d "json=1"

# {"status":1,"request":"2122988149"}

फिर token के लिए res.php को poll करें। पूरा दो-call वाला flow, polling delays समेत, यहाँ दिया गया है: cURL से कैप्चा हल करना.

दूसरे SDKs भी वही datas स्पेलिंग इस्तेमाल करते हैं। Node.js इसे options object में लेता है, और .NET इसे options dictionary में रखता है:

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

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

const result = await solver.recaptcha(sitekey, pageUrl, {
  datas: dataS,        // same value, same rules
});

console.log(result.code);

आम errors

आप जो देखते हैंकारणफिक्स
ERROR_GOOGLEKEYsitekey request में पहुँची ही नहीं, या regex ने ग़लत attribute match कर लियाहल करने से पहले scrape की गई वैल्यू print करें। पूरी जानकारी यहाँ: ERROR_GOOGLEKEY ठीक करना
ERROR_BAD_PARAMETERSdata-s ख़ाली स्ट्रिंग के रूप में भेजा गया, या किसी ग़ैर-Google पेज पर भेजा गयाइसे तभी भेजें जब attribute वाक़ई मौजूद हो
ERROR_CAPTCHA_UNSOLVABLEआमतौर पर एक बासी data-s: पेज हल करने से कई मिनट पहले fetch किया गया थाfetch और हल एक के बाद एक करें। देखें ERROR_CAPTCHA_UNSOLVABLE
token solver ने स्वीकार किया, Google ने ठुकरा दियाfetch और सबमिट के बीच अलग cookies या अलग IPएक ही session दोबारा इस्तेमाल करें, और दोनों के लिए एक ही प्रॉक्सी
NetworkExceptionCapSkip चल नहीं रहाऐप शुरू करें, settings में port की पुष्टि करें

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

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

क्या सामान्य वेबसाइट पर मुझे data-s चाहिए?

नहीं। यह सिर्फ़ Google के अपने पेजों पर दिखती है। अगर data-s HTML में नहीं है, तो आर्गुमेंट पूरी तरह छोड़ दें और उसे एक standard v2 challenge की तरह हल करें, जैसा reCAPTCHA v2 सॉल्वर पेज में बताया गया है।

क्या data-s वही है जो Enterprise flag है?

नहीं, और ये दोनों एक-दूसरे से स्वतंत्र हैं। enterprise=1 solver को बताता है कि वह किस reCAPTCHA प्रोडक्ट से निपट रहा है। datas पेज से एक बार इस्तेमाल होने वाली वैल्यू लेकर चलता है। Google Search के challenge को दूसरा वाला चाहिए, और अगर किसी पेज को वाक़ई ज़रूरत हो तो आप दोनों भेज सकते हैं।

यह वैल्यू कब तक चलती है?

मिनट नहीं, सेकंड मानकर चलें। यह पेज के साथ जारी होती है और पेज के साथ ही ख़त्म हो जाती है। अगर आपका scraper पेजों को queue करके बाद में हल करता है, तो वैल्यू सहेजने के बजाय हल करते समय पेज दोबारा fetch करें।

code में datas और HTML में data-s क्यों है?

क्योंकि Python के keyword argument या C# identifier में हाइफ़न नहीं आ सकता। SDKs उसे हटा देते हैं और आपके लिए हाइफ़न वाला नाम wire पर भेज देते हैं। रॉ in.php call को अब भी यही चाहिए: data-s.

सारांश

एक ही element से data-sitekey और data-s scrape करें, और दूसरे वाले को इस रूप में भेजें: datas, और token को उसी session पर कुछ ही मिनटों के भीतर सबमिट करें। इन तीनों में से कोई भी छोड़ें और आपको ऐसा token मिलेगा जो देखने में ठीक लगेगा पर चलेगा नहीं।

बाक़ी Python इंटरफ़ेस Python कैप्चा सॉल्वर पेज पर है। CapSkip यह सब आपकी अपनी मशीन पर एक लोकल कैप्चा बायपास service के रूप में करता है, इसलिए ताज़ा वैल्यू पाने के लिए पेज को दोबारा scrape करने में एक request के सिवा कुछ ख़र्च नहीं होता।