Python के लिए Playwright से CAPTCHA समाधान सबमिट करें
पहले CAPTCHA हल करें, फिर उसी प्रॉक्सी और लौटाई गई ब्राउज़र पहचान का उपयोग करके Playwright कॉन्टेक्स्ट बनाएँ। solution.token को उस फ़ील्ड के माध्यम से सबमिट करें जिसे आपका एप्लिकेशन वास्तव में भेजता है।
नीचे दिया गया उदाहरण आपके नियंत्रण वाले पेज पर फ़ॉर्म सबमिट करता है। यह एप्लिकेशन के POST रिस्पॉन्स का इंतज़ार करता है; यह reCAPTCHA को इंटरसेप्ट नहीं करता और न ही किसी सार्वभौमिक CAPTCHA कॉलबैक पर निर्भर करता है।
इस पेज पर
लक्ष्य और परिवेश तैयार करें
Python 3.10+ का उपयोग करें, Playwright और उसका Chromium ब्राउज़र इंस्टॉल करें, और आधिकारिक solvethree Python SDK व्हील इंस्टॉल करें। वर्कस्पेस API कुंजी Python प्रोसेस में रखें, ब्राउज़र JavaScript में नहीं।
TARGET_URL: आपके फ़ॉर्म पेज का पूरा URL। उदाहरण समाधान अनुरोध के लिए इससे होस्टनेम निकालता है।SOLVETHREE_PROXY: प्रॉक्सी URL, जिसमें आवश्यकता होने पर प्रमाणीकरण क्रेडेंशियल भी शामिल हों। समाधान और ब्राउज़र ट्रैफ़िक के लिए एक ही प्रॉक्सी उपयोग होती है।SOLVETHREE_API_KEY: आपकी वर्कस्पेस API कुंजी।
लक्ष्य होस्टनेम के लिए आपके वर्कस्पेस में उपलब्ध सक्रिय प्रोफ़ाइल आवश्यक है। उदाहरण चलाने से पहले साइट प्रोफ़ाइल सेट करें। उदाहरण के login ऐक्शन को अपने इंटीग्रेशन के लिए आवश्यक ऐक्शन से बदलें; होस्टनेम और ऐक्शन भेजने से प्रोफ़ाइल नहीं बनती। अनुरोध डिफ़ॉल्ट रूप से reCAPTCHA Enterprise v3 का उपयोग करता है।
हल करें, Chromium कॉन्फ़िगर करें और सबमिट करें
# Install playwright and the official Python SDK; run playwright install chromium.
import asyncio
import os
from urllib.parse import urlsplit, unquote
from playwright.async_api import async_playwright
from solvethree import Solvethree
async def main():
target = os.environ["TARGET_URL"]
proxy = urlsplit(os.environ["SOLVETHREE_PROXY"])
client = Solvethree(os.environ["SOLVETHREE_API_KEY"])
task = {"site": urlsplit(target).hostname, "action": "login", "proxy": os.environ["SOLVETHREE_PROXY"]}
result = await asyncio.to_thread(client.solve, task, timeout=180)
solution = result["solution"]
async with async_playwright() as playwright:
browser = await playwright.chromium.launch()
try:
netloc = proxy.netloc.rsplit("@", 1)[-1]
context = await browser.new_context(
proxy={"server": f"{proxy.scheme}://{netloc}", "username": unquote(proxy.username or ""), "password": unquote(proxy.password or "")},
user_agent=solution["userAgent"], extra_http_headers={"sec-ch-ua": solution["secChUa"]})
page = await context.new_page()
await page.goto(target)
field = page.locator('[name="g-recaptcha-response"]')
await field.wait_for(state="attached")
await field.evaluate("(field, token) => { field.value=token; field.dispatchEvent(new Event('input',{bubbles:true})); }", solution["token"])
async with page.expect_response(lambda r: r.request.method == "POST" and urlsplit(r.url).netloc == urlsplit(target).netloc) as outcome:
await page.get_by_role("button", name="Submit", exact=True).click()
print("Application HTTP status:", (await outcome.value).status)
# Check the application's actual response; adapt form/CSRF/session setup.
await context.close()
finally:
await browser.close()
asyncio.run(main())Solvethree सिंक्रोनस है। asyncio.to_thread के माध्यम से client.solve कॉल करने से उसका टास्क बनाने और पोल करने का ऑपरेशन Playwright के इवेंट लूप को ब्लॉक नहीं करता। यह तैयार परिणाम लौटाता है या अपवाद उठाता है; SDK में मूल async क्लाइंट नहीं है।
ब्राउज़र कॉन्टेक्स्ट solution.userAgent और solution.secChUa का उपयोग करता है। उदाहरण प्रॉक्सी सर्वर को उसके यूज़रनेम और पासवर्ड से अलग भी करता है और क्रेडेंशियल को Playwright को देने से पहले डिकोड करता है। चूँकि यह टास्क एक प्रॉक्सी उपयोग करता है, इसलिए उम्मीदवार चुनने का कोई चरण नहीं है।
- 1.
एप्लिकेशन के टोकन इनपुट के अनुसार सेट करें
उदाहरण फ़ील्ड के अटैच होने का इंतज़ार करता है, solution.token असाइन करता है और input इवेंट डिस्पैच करता है। इसके लिए फ़ील्ड का दिखाई देना आवश्यक नहीं है। यदि आपका एप्लिकेशन कोई दूसरा फ़ील्ड सबमिट करता है या टोकन की स्थिति कहीं और से पढ़ता है, तो इस हस्तांतरण को उसके आउटगोइंग अनुरोध के अनुसार बदलें।
- 2.
फ़ॉर्म की सेशन संबंधी आवश्यकताएँ जोड़ें
उदाहरण एक नए ब्राउज़र कॉन्टेक्स्ट से शुरू होता है। सबमिट करने से पहले अपने एप्लिकेशन के लिए आवश्यक सेशन, फ़ॉर्म तैयारी या CSRF प्रबंधन जोड़ें।
- 3.
सही POST का इंतज़ार करें
सबमिट बटन क्लिक करने से पहले रिस्पॉन्स का इंतज़ार रजिस्टर किया जाता है। उसकी शर्त लक्ष्य URL के नेटवर्क स्थान पर जाने वाले POST से मेल खाती है। यदि पेज वहाँ अन्य POST अनुरोध भेजता है, तो शर्त को अपने सबमिशन एंडपॉइंट तक सीमित करें।
एप्लिकेशन का रिस्पॉन्स पढ़ें
प्रिंट किया गया HTTP स्टेटस पुष्टि करता है कि मेल खाने वाला रिस्पॉन्स आया है। यह पता लगाने के लिए कि सबमिशन स्वीकार हुआ या नहीं, एप्लिकेशन की रिस्पॉन्स बॉडी या उसके बाद पेज की स्थिति जाँचें। solvethree टास्क तैयार होने का अर्थ है कि समाधान जनरेट हुआ है, यह नहीं कि लक्ष्य ने उसे स्वीकार कर लिया।
- एप्लिकेशन तैयार टोकन को अस्वीकार कर देता है।
एक और समाधान के लिए भुगतान करने से पहले आउटगोइंग फ़ॉर्म अनुरोध की जाँच करें।
यह आज़माएँ: पुष्टि करें कि उसमें टास्क ID या पुराने मान के बजाय solution.token है। जाँचें कि सबमिशन में समाधान की प्रॉक्सी, लौटाए गए user agent और client hints तथा निर्धारित लक्ष्य का उपयोग हो रहा है।
- रिस्पॉन्स का इंतज़ार किसी असंबंधित अनुरोध को कैप्चर कर लेता है।
कैप्चर किए गए POST URL की तुलना वास्तविक फ़ॉर्म एंडपॉइंट से करें।
यह आज़माएँ: एक ही नेटवर्क स्थान पर जाने वाले हर POST से मिलान करने के बजाय रिस्पॉन्स की शर्त को उस एंडपॉइंट के लिए विशिष्ट बनाएँ।
- ब्राउज़र सबमिशन से पहले solve कॉल अपवाद उठाता है।
HTTP अनुरोध की त्रुटि और अंतिम रूप से विफल टास्क में अंतर करें।
यह आज़माएँ: असफल HTTP रिस्पॉन्स को अलग से संभालें। विफल टास्क के लिए errorCode और error जाँचें और उन्हीं इनपुट के साथ दोबारा प्रयास करने के बजाय कारण ठीक करें। SDK का solve मेथड विफलता पर पहले ही रुक जाता है।
स्रोत और API संदर्भ
अपना पहला टास्क चलाएँ।
$5 वर्कस्पेस क्रेडिट के साथ शुरुआत करें।