Scarnox · Blog

Python में Selenium कैप्चा सॉल्वर: काम करने वाला उदाहरण (2026)

Selenium एक असली ब्राउज़र चलाता है, इसलिए पेज रेंडर होता है और उसकी स्क्रिप्ट वैसे ही चलती है जैसे किसी इंसान के लिए। एक ही चरण जो वह नहीं कर सकता वह है PopularCaptcha विजेट को हल करना। यह गाइड वह चरण जोड़ती है: रेंडर्ड पेज से sitekey पढ़ें, एक API कॉल से टोकन लें, उसे फॉर्म में लिखें, और सबमिट करें।

यह गाइड PopularCaptcha विजेट को कवर करती है, जिसे Scarnox आज proxyless आधार पर हल करता है। मुफ्त ट्रायल क्रेडिट के साथ शुरू करें, कार्ड की ज़रूरत नहीं और पहले किसी टेस्ट फ़ॉर्म पर स्क्रिप्ट आज़माएं।

Selenium को क्या करना है

फ़्लो के चार हिस्से हैं:

  1. पेज लोड करें और विजेट के रेंडर होने का इंतज़ार करें।
  2. विजेट से data-sitekey एट्रिब्यूट पढ़ें।
  3. API से टोकन लें और उसे फॉर्म में रखें।
  4. टोकन समाप्त होने से पहले फॉर्म सबमिट करें।

कैप्चा को छूने वाला केवल तीसरा चरण है। बाकी सब सामान्य Selenium का काम है।

पैकेज इंस्टॉल करें

pip install selenium requests

Selenium 4.6 और बाद के संस्करण अपने आप मेल खाता ChromeDriver ढूंढ लेते हैं, इसलिए ड्राइवर हाथ से डाउनलोड करने की ज़रूरत नहीं।

पूरी स्क्रिप्ट

import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait

API_KEY = "scarnox_YOURAPIKEY"
API_URL = "https://api.scarnox.com/api/tasks/create"
PAGE_URL = "https://example.com/signup"


def solve(sitekey: str, page_url: str, invisible: bool = False) -> str:
    body = {
        "captcha_type": "PopularCaptchaTaskProxyless",
        "site_key": sitekey,
        "site_url": page_url,
    }
    if invisible:
        body["is_invisible"] = True

    r = requests.post(
        API_URL,
        headers={"Authorization": f"Bearer {API_KEY}"},
        json=body,
        timeout=185,  # टोकन तैयार होने तक रुकता है
    )
    data = r.json()
    if data.get("errorId") != 0:
        raise RuntimeError(f"{data.get('errorCode')}: {data.get('errorDescription')}")
    return data["solution"]["token"]


INJECT_TOKEN_JS = """
const token = arguments[0];
let field = document.querySelector('[name="h-captcha-response"]');
if (!field) {
    field = document.createElement("textarea");
    field.name = "h-captcha-response";
    field.style.display = "none";
    document.querySelector("form").appendChild(field);
}
field.value = token;
let extra = document.querySelector('[name="g-recaptcha-response"]');
if (!extra) {
    extra = document.createElement("textarea");
    extra.name = "g-recaptcha-response";
    extra.style.display = "none";
    document.querySelector("form").appendChild(extra);
}
extra.value = token;
"""


def main() -> None:
    driver = webdriver.Chrome()
    try:
        driver.get(PAGE_URL)

        widget = WebDriverWait(driver, 15).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, "[data-sitekey]"))
        )
        sitekey = widget.get_attribute("data-sitekey")
        invisible = widget.get_attribute("data-size") == "invisible"

        token = solve(sitekey, driver.current_url, invisible=invisible)

        # पहले बाकी फ़ील्ड भरें, फिर सबमिट से ठीक पहले टोकन डालें,
        # क्योंकि टोकन लगभग दो मिनट में समाप्त हो जाता है।
        driver.find_element(By.NAME, "email").send_keys("you@example.com")
        driver.execute_script(INJECT_TOKEN_JS, token)

        driver.find_element(By.CSS_SELECTOR, "form button[type=submit]").click()
        WebDriverWait(driver, 15).until(EC.url_changes(PAGE_URL))
        print("Submitted. Now at:", driver.current_url)
    finally:
        driver.quit()


if __name__ == "__main__":
    main()

proxyless PopularCaptcha सॉल्व के लिए स्क्रिप्ट को प्रॉक्सी की ज़रूरत नहीं है। proxy फ़ील्ड छोड़ दें, ताकि साइट आपका सामान्य कनेक्शन देखे।

ऑपरेशन का क्रम वही हिस्सा है जो सबसे ज़्यादा गलत होता है। पहले फॉर्म के बाकी हिस्से भरें, फिर सॉल्व करें, फिर टोकन डालें, फिर क्लिक करें। अगर आप दूसरे फ़ील्ड में टाइप करने से पहले सॉल्व करते हैं, तो धीमा पेज या धीमा फॉर्म सबमिट को टोकन की उम्र के बाद धकेल सकता है। सॉल्व और क्लिक के बीच का अंतराल जितना हो सके छोटा रखें, और कैप्चा पास होने मान लेने से पहले नतीजा पेज पर एरर जांचें।

टोकन JavaScript से क्यों डाला जाता है

ज़्यादातर PopularCaptcha विजेट, जब एक इंसान उन्हें हल करता है, तो टोकन h-captcha-response नाम के छिपे textarea में लिखते हैं। चूंकि Selenium किसी इंसान को नहीं देखता, स्क्रिप्ट वही फ़ील्ड खुद लिखती है। INJECT_TOKEN_JS स्निपेट दो काम करता है:

यह g-recaptcha-response भी भरता है, क्योंकि कई साइटें संगतता के लिए उस नाम को पढ़ती हैं।

Invisible विजेट

Invisible विजेट में कोई चेकबॉक्स नहीं होता। वह पृष्ठभूमि में चलता है और आम तौर पर फॉर्म सबमिट पर ट्रिगर होता है। स्क्रिप्ट data-size="invisible" जांचती है, और उसे दिखने पर is_invisible: true भेजती है। कुछ साइटें विजेट से JavaScript callback भी जोड़ती हैं। अगर टोकन डालने के बाद भी फॉर्म वहीं रहता है, तो data-callback एट्रिब्यूट देखें और उस फ़ंक्शन को टोकन के साथ कॉल करें। इस स्थिति को अदृश्य कैप्चा गाइड कवर करती है।

टेस्ट में इस्तेमाल

Selenium end-to-end टेस्ट के लिए भी आम उपकरण है। अगर आपकी अपनी staging साइट पर कैप्चा दिखता है, तो वही कोड टेस्ट को उसे पास करने देता है। टेस्ट वातावरण को प्रोडक्शन से अलग रखें, और उन साइटों पर न चलाएं जो आपकी नहीं हैं। टेस्ट सूट का सेटअप ऑटोमेटेड टेस्ट में कैप्चा में है।

आम समस्याएं

कीमत

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

अगले कदम