טיפול בשגיאות SDK ב-Python בלי לשכפל פעולות פתרון
חריגה מהזמן הקצוב לחיבור אינה מוכיחה שיצירת המשימה נכשלה. שמרו את הקלטים המקוריים של המשימה ואת requestId; שחזרו את הבקשה הזו לפני יצירת פעולת פתרון נוספת.
בדף הזה
תפיסת כשלי משימה בנפרד משגיאות HTTP
המתודה solve של ה-SDK הסינכרוני של Python יוצרת משימה פעם אחת ומתשאלת עד שהיא מוכנה או עד שהיא מעלה שגיאה. תפסו את החריגות הספציפיות לפני 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לצורך שחזור מפורש. השתמשו במזהים הזמינים במקום להניח שהיצירה מעולם לא התרחשה.
הדוגמה מדפיסה פרטי שחזור, אך אינה שומרת אותם באחסון מתמשך ואינה מבצעת שחזור. באינטגרציה שחייבת להמשיך לפעול גם לאחר הפעלה מחדש של התהליך, שמרו את הקלטים המקוריים של המשימה ואת מזהה הבקשה לפני הקריאה ל-solve, ואז שמרו כל מזהה משימה שיוחזר. הגנו על קלטים שמורים המכילים פרטי גישה לפרוקסי.
המשך לפי מזהה משימה; שחזור יצירה לפי מזהה בקשה
- 1.
אם יש לכם task_id, המשיכו עם get_task
שלפו את המשימה הזו במקום לקרוא שוב ל-
solve. get_taskמקבלת את מזהה המשימה ואת הארגומנטwait_ms; זמן ההמתנה שלה כברירת מחדל הוא 15000 אלפיות שנייה. המשיכו כל עוד הסטטוס הואpendingאוsolving. השתמשו בפתרון רק כשהסטטוס הואready, והפסיקו ב-failed. - 2.
אם היצירה נקטעה לפני שקיבלתם מזהה משימה, שלחו שוב את create_task
שלחו קלטים זהים של המשימה עם אותו
requestId, והשתמשו ב-request_idששוחזר בעת הצורך. שימוש חוזר באותו מזהה עם אותה בקשה מחזיר את המשימה הקיימת; שינוי הקלטים גורם להתנגשות. לאחר שקיבלתם את מזהה המשימה שלה, המשיכו עםget_task. - 3.
אל תיצרו מזהה נוסף במהלך השחזור
הדוגמה יוצרת את ה-UUID שלה לפני הקריאה ל-
solve. שמרו את הערך הזה בעת השחזור; אל תריצו שוב את בניית המשימה ותחליפו אותו בטעות. מזהה חדש מייצג בקשה נפרדת, לא ניסיון חוזר של הבקשה שנקטעה.
ה-SDK יוצר requestId אם לא ציינתם אותו, חושף מזהי שחזור בשגיאות ולעולם אינו מנסה שוב ליצור משימה באופן אוטומטי. במהלך solve, הוא מכבד את Retry-After עבור כשלי תשאול זמניים במסגרת הזמן המוקצב לפתרון. אם הקריאה בכל זאת מעלה חריגה, השתמשו במזהים השמורים כדי להמשיך במקום להתחיל פעולת פתרון נוספת.
שחזור אינו סיבה לחזור על בקשות לא תקינות
במקרה של ApiError, בדקו את שגיאת ה-HTTP לפני שתחליטו לשלוח דבר כלשהו מחדש. שחזור יצירה שנקטעה מתאים כשהתוצאה אינה ודאית; שליחה חוזרת ועיוורת של קלטים לא תקינים שלא שונו אינה מתאימה.
במקרה של TaskFailedError, המשימה הסתיימה. משימה שנכשלה ונשלפה מכילה את errorCode ואת error; החריגה של Python חושפת את הקוד בתור error.error_code. השתמשו במידע הזה כדי להחליט מה צריך לשנות. לדוגמה, site-unreachable מחייב לבדוק את הנגישות ליעד, ולא להניח שאין יתרה בחשבון. התשלום על פעולות פתרון שנכשלו מוחזר.
מקורות ותיעוד API
הפעלת המשימה הראשונה שלך.
התחילו עם $5 בקרדיט לסביבת העבודה.