aiohttp से reCAPTCHA हल करें और सबमिट करें
REST API के साथ सीधे aiohttp का उपयोग करें: एक टास्क बनाएँ, उसके तैयार होने तक पोलिंग करें, फिर लक्ष्य को solution.token भेजें। API और लक्ष्य अनुरोधों को अलग सेशन में रखें, ताकि आपका वर्कस्पेस Bearer टोकन कभी लक्ष्य तक न पहुँचे।
इस उदाहरण के लिए Python 3.11+ आवश्यक है और यह निर्माण, पोलिंग तथा लक्ष्य पर सबमिशन को एक ही 180-सेकंड की समय-सीमा के भीतर रखता है। यह एप्लिकेशन टाइमआउट है, सॉल्व होने के समय का वादा नहीं।
इस पेज पर
साइट, प्रॉक्सी और लक्ष्य अनुरोध सेट करें
- SOLVETHREE_API_KEY को अपनी वर्कस्पेस API कुंजी पर सेट करें। उसे सर्वर पर रखें।
- SOLVETHREE_PROXY को उस प्रॉक्सी URL पर सेट करें जिसका उपयोग सेवा को सॉल्विंग के लिए करना चाहिए। लक्ष्य पर सबमिशन भी उसी प्रॉक्सी का उपयोग करता है।
- accounts.example.com और login ऐक्शन को अपने इंटीग्रेशन में उपयोग किए जाने वाले होस्टनेम और ऐक्शन से बदलें। साइट के लिए आपके वर्कस्पेस में एक सक्रिय प्रोफ़ाइल उपलब्ध होनी चाहिए; टास्क बनाने से पहले प्रोफ़ाइल सेट अप करें।
- लक्ष्य लॉगिन URL और फ़ॉर्म डेटा को वास्तविक एप्लिकेशन अनुरोध से बदलें। उदाहरण केवल g-recaptcha-response भेजता है; अपने लक्ष्य के लिए आवश्यक अन्य फ़ील्ड जोड़ें और उसके अपेक्षित टोकन फ़ील्ड का उपयोग करें।
टास्क में site, action और एक proxy भेजे जाते हैं। यह डिफ़ॉल्ट रूप से reCAPTCHA Enterprise v3 का उपयोग करता है; type या url फ़ील्ड न जोड़ें। अगर लक्ष्य फ़्लो को किसी पिछले अनुरोध की कुकीज़ चाहिए, तो वे अनुरोध लक्ष्य सेशन से करें—उदाहरण एक नए सेशन से शुरू होता है।
एक बार बनाएँ, पोलिंग करें, फिर भेजें
# pip install aiohttp
import asyncio
import os
import uuid
from urllib.parse import urlsplit, unquote
import aiohttp
async def main():
api = "https://api.solvethree.com/v1"
proxy = os.environ["SOLVETHREE_PROXY"]
task = {"site": "accounts.example.com", "action": "login", "proxy": proxy, "requestId": str(uuid.uuid4())}
task_id = None
try:
async with asyncio.timeout(180):
async with aiohttp.ClientSession(headers={"Authorization": "Bearer " + os.environ["SOLVETHREE_API_KEY"]}) as client:
async with client.post(api + "/tasks", params={"waitMs": 0}, json=task, allow_redirects=False) as response:
response.raise_for_status()
if response.status >= 300: raise RuntimeError("Unexpected API redirect")
result = await response.json()
task_id = result["id"]
while result["status"] in ("pending", "solving"):
async with client.get(api + "/tasks/" + task_id, params={"waitMs": 15000}, allow_redirects=False) as response:
response.raise_for_status()
if response.status >= 300: raise RuntimeError("Unexpected API redirect")
result = await response.json()
if result["status"] in ("pending", "solving"): await asyncio.sleep(1)
if result["status"] != "ready":
raise RuntimeError("Task failed: " + str(result.get("errorCode", "unknown")))
solution = result["solution"]
# A separate session prevents the API Bearer header reaching the target.
proxy_url = urlsplit(proxy)
netloc = proxy_url.netloc.rsplit("@", 1)[-1]
server = f"{proxy_url.scheme}://{netloc}"
auth = aiohttp.BasicAuth(unquote(proxy_url.username), unquote(proxy_url.password or "")) if proxy_url.username else None
async with aiohttp.ClientSession() as target:
async with target.post("https://accounts.example.com/login", proxy=server, proxy_auth=auth,
headers={"User-Agent": solution["userAgent"], "sec-ch-ua": solution["secChUa"]},
data={"g-recaptcha-response": solution["token"]}, allow_redirects=False) as response:
print("Application HTTP status:", response.status)
except TimeoutError:
print("Timed out; recover requestId", task["requestId"], "taskId", task_id)
raise
asyncio.run(main())यह सीधे एसिंक्रोनस REST का उपयोग है, आधिकारिक Python SDK का कोई एसिंक्रोनस मेथड नहीं। यह बनाने के लिए /v1/tasks पर एक POST भेजता है, लौटाए गए id को सहेजता है और उस टास्क की पोलिंग के लिए GET अनुरोध करता है। pending और solving पर लूप जारी रहता है; ready पर सबमिशन किया जा सकता है; failed टास्क पर लूप रुक जाता है।
टास्क बॉडी में proxy, solvethree को बताता है कि किस प्रॉक्सी का उपयोग करना है। aiohttp के proxy और proxy_auth आर्ग्युमेंट केवल लक्ष्य HTTP कॉल पर दिए जाते हैं—API कॉल पर नहीं। उदाहरण प्रॉक्सी क्रेडेंशियल को प्रॉक्सी सर्वर URL से अलग करता है और लौटाए गए userAgent तथा secChUa के साथ टोकन भेजता है।
सेशन जानबूझकर अलग रखे गए हैं: केवल API सेशन में Authorization हेडर है। रीडायरेक्ट अक्षम हैं और API रीडायरेक्ट का अनुसरण करने के बजाय उन्हें त्रुटि माना जाता है।
- API अनुरोध HTTP त्रुटि लौटाता है।
उदाहरण सफलता पेलोड पढ़ने से पहले HTTP स्टेटस जाँचता है।
यह आज़माएँ: HTTP त्रुटि को टास्क की विफलता से अलग संभालें। दोबारा प्रयास करने से पहले अमान्य इनपुट या प्राधिकरण संबंधी समस्याएँ ठीक करें।
- टास्क की स्थिति failed हो जाती है।
टास्क रिस्पॉन्स में errorCode और error की जाँच करें। उदाहरण केवल errorCode के साथ अपवाद उठाता है।
यह आज़माएँ: उस टास्क की पोलिंग रोकें और बताए गए कारण को दूर करें। दोबारा प्रयास करने से पहले बताए गए कारण को ठीक करें।
- टास्क तैयार है, लेकिन एप्लिकेशन अनुरोध अस्वीकार कर देता है।
भेजे जा रहे टोकन फ़ील्ड, लक्ष्य URL, लौटाई गई ब्राउज़र पहचान और प्रॉक्सी के साथ-साथ सभी आवश्यक फ़ॉर्म फ़ील्ड या कुकीज़ की जाँच करें।
यह आज़माएँ: उसी प्रॉक्सी से लौटाई गई पहचान के साथ solution.token भेजें। उस लक्ष्य के सफलता मानदंडों के अनुसार एप्लिकेशन रिस्पॉन्स पढ़ें—केवल प्रिंट किया गया HTTP स्टेटस स्वीकृति साबित नहीं करता।
एक और सॉल्व खरीदे बिना टाइमआउट से रिकवर करें
टास्क बनाते समय टाइमआउट होने से यह साबित नहीं होता कि निर्माण विफल हुआ। उदाहरण मूल इनपुट task में रखता है और समय-सीमा समाप्त होने पर उसका requestId तथा task_id प्रिंट करता है। ये वेरिएबल केवल प्रोसेस के चलने तक रहते हैं; प्रिंट किए गए ID रिकवरी का पूरा रिकॉर्ड नहीं हैं।
- 1.
बनाने से पहले मूल अनुरोध सहेजें
रीस्टार्ट के बाद रिकवरी के लिए requestId और proxy सहित पूरी टास्क बॉडी सुरक्षित रूप से सहेजकर रखें। उदाहरण हर बार चलने पर नया UUID बनाता है, इसलिए उसे बस दोबारा चलाने से एक नया तार्किक अनुरोध बन जाता है।
- 2.
मौजूदा टास्क से आगे जारी रखें
अगर आपके पास task_id है, तो वह टास्क प्राप्त करें। अगर ID मिलने से पहले निर्माण का टाइमआउट हो गया था, तो सहेजी गई, बिना बदली टास्क बॉडी और requestId के साथ निर्माण दोहराएँ। API मौजूदा टास्क लौटाता है; उसी ID का दोबारा उपयोग करते हुए इनपुट बदलने से टकराव होता है।
- 3.
जाँचें कि सबमिशन पहले ही हो चुका है या नहीं
समय-सीमा में लक्ष्य POST भी शामिल है। अगर उस अनुरोध का टाइमआउट हुआ, तो दोबारा भेजने से पहले एप्लिकेशन का परिणाम जाँचें: संभव है कि उसे अनुरोध मिल गया हो, भले ही आपके क्लाइंट को रिस्पॉन्स न मिला हो। solvethree टास्क को रिकवर करने से यह पता नहीं चलता कि लक्ष्य पर क्या हुआ।
स्रोत और API संदर्भ
अपना पहला टास्क चलाएँ।
$5 वर्कस्पेस क्रेडिट के साथ शुरुआत करें।