दोबारा समाधान कराए बिना Python SDK की त्रुटियाँ संभालें
कनेक्शन टाइमआउट से यह साबित नहीं होता कि टास्क निर्माण विफल हुआ। मूल टास्क इनपुट और requestId सुरक्षित रखें; दूसरा सॉल्व बनाने से पहले उस अनुरोध को रिकवर करें।
इस पेज पर
टास्क विफलताओं को HTTP त्रुटियों से अलग कैच करें
सिंक्रोनस Python SDK का solve मेथड टास्क एक बार बनाता है और उसके तैयार होने या त्रुटि उठने तक पोल करता है। SolvethreeError से पहले विशिष्ट एक्सेप्शन कैच करें, ताकि आप विफल सॉल्व और बीच में रुके HTTP अनुरोध में अंतर कर सकें।
SOLVETHREE_API_KEY और SOLVETHREE_PROXY सेट करें, फिर उदाहरण के होस्टनाम और ऐक्शन की जगह अपने लक्ष्य के मान डालें। सॉल्व करने से पहले साइट के लिए एक सक्रिय वर्कस्पेस प्रोफ़ाइल ज़रूरी है।
import os
import uuid
from solvethree import Solvethree, ApiError, TaskFailedError, SolvethreeError
client = Solvethree(os.environ["SOLVETHREE_API_KEY"])
task = {"site": "accounts.example.com", "action": "login", "proxy": os.environ["SOLVETHREE_PROXY"], "requestId": str(uuid.uuid4())}
try:
result = client.solve(task, timeout=180)
print("Ready task:", result["id"])
# Submit result["solution"] privately through the target application.
except TaskFailedError as error:
print("Failed task:", error.task_id, "code:", error.error_code)
# This task is terminal. Inspect it before starting different work.
except ApiError as error:
print("HTTP status:", error.status, "retry delay:", error.retry_after)
print("Recovery IDs:", error.request_id, error.task_id)
# A known task_id means resume get_task; otherwise replay the exact task
# with error.request_id. Do not generate a new logical request to recover it.
except SolvethreeError as error:
print("Recovery IDs:", error.request_id, error.task_id)
# Save these IDs and the original task inputs for explicit recovery.TaskFailedError: टास्क अंतिमfailedस्थिति तक पहुँच गया है।error.task_idऔरerror.error_codeजाँचें; उस टास्क की पोलिंग जारी न रखें।ApiError: कोई HTTP अनुरोध विफल हुआ।error.statusऔरerror.retry_afterजाँचें; बाद वाला सेकंड में मापा जाता है। यह टास्क की अंतिम विफलता के समान नहीं है।SolvethreeError: स्पष्ट रूप से रिकवरी करने के लिएerror.request_idऔरerror.task_idसुरक्षित रखें। यह मानने के बजाय कि निर्माण कभी हुआ ही नहीं, जो भी ID उपलब्ध हों उनका उपयोग करें।
उदाहरण रिकवरी की जानकारी प्रिंट करता है, लेकिन उसे स्थायी रूप से सेव नहीं करता और न ही रिकवरी करता है। ऐसे इंटीग्रेशन में जिसे प्रोसेस रीस्टार्ट के बाद भी काम जारी रखना हो, solve कॉल करने से पहले मूल टास्क इनपुट और अनुरोध ID सेव करें, फिर लौटाई गई किसी भी टास्क ID को सुरक्षित रखें। सेव किए गए उन इनपुट की सुरक्षा करें जिनमें प्रॉक्सी क्रेडेंशियल हैं।
टास्क ID से फिर शुरू करें; अनुरोध ID से निर्माण रिकवर करें
- 1.
यदि आपके पास task_id है, तो get_task फिर शुरू करें
दोबारा
solveकॉल करने के बजाय वही टास्क प्राप्त करें।get_taskटास्क ID औरwait_msआर्ग्युमेंट स्वीकार करता है; इसकी डिफ़ॉल्ट प्रतीक्षा 15000 मिलीसेकंड है। स्टेटसpendingयाsolvingरहने तक जारी रखें। समाधान का उपयोग केवलreadyस्टेटस पर करें, औरfailedपर रुक जाएँ। - 2.
यदि टास्क ID मिलने से पहले निर्माण बीच में रुक गया था, तो create_task दोबारा भेजें
उसी
requestIdके साथ बिल्कुल वही टास्क इनपुट भेजें; ज़रूरत पड़ने पर रिकवर की गईrequest_idका उपयोग करें। उसी अनुरोध के साथ उस ID का दोबारा उपयोग करने से मौजूदा टास्क लौटता है; इनपुट बदलने से कॉन्फ़्लिक्ट होता है। उसकी टास्क ID मिलने के बादget_taskसे आगे बढ़ें। - 3.
रिकवरी के दौरान दूसरी ID जनरेट न करें
उदाहरण
solveकॉल करने से पहले अपना UUID जनरेट करता है। रिकवरी करते समय वही मान रखें; टास्क निर्माण दोबारा चलाकर अनजाने में उसे बदल न दें। नई ID एक अलग अनुरोध दर्शाती है, बीच में रुके अनुरोध का दोबारा प्रयास नहीं।
यदि आप requestId नहीं देते, तो SDK इसे जनरेट करता है, त्रुटियों में रिकवरी ID उपलब्ध कराता है और टास्क निर्माण का कभी अपने-आप दोबारा प्रयास नहीं करता। solve के दौरान, यह सॉल्व की समय-सीमा के भीतर अस्थायी पोलिंग विफलताओं के लिए Retry-After का पालन करता है। यदि कॉल फिर भी एक्सेप्शन उठाती है, तो दूसरा सॉल्व शुरू करने के बजाय सेव की गई ID से फिर शुरू करें।
रिकवरी अमान्य अनुरोध दोहराने का कारण नहीं है
ApiError के लिए, कुछ भी दोबारा भेजने का निर्णय लेने से पहले HTTP त्रुटि जाँचें। परिणाम अनिश्चित होने पर बीच में रुके निर्माण को रिकवर करना उचित है; बिना बदले अमान्य इनपुट को आँख मूँदकर दोबारा भेजना नहीं।
TaskFailedError के मामले में टास्क समाप्त हो चुका है। प्राप्त किए गए विफल टास्क में errorCode और error होते हैं; Python एक्सेप्शन कोड को error.error_code के रूप में उपलब्ध कराता है। क्या बदलना है, यह तय करने के लिए उस जानकारी का उपयोग करें। उदाहरण के लिए, site-unreachable होने पर लक्ष्य तक पहुँच की जाँच करनी चाहिए, न कि यह मान लेना चाहिए कि खाते में क्रेडिट नहीं है। विफल सॉल्व का शुल्क वापस किया जाता है।
स्रोत और API संदर्भ
अपना पहला टास्क चलाएँ।
$5 वर्कस्पेस क्रेडिट के साथ शुरुआत करें।