ביטול ההמתנה המקומית באמצעות ה-SDK ל-Node.js
יש להעביר אות של AbortController ל-solve כדי להפסיק את ההמתנה המקומית. יש לשמור את קלט המשימה המלא, כולל ה-requestId שלה, לפני הקריאה ל-SDK, כדי לאפשר שחזור גם אם הקריאה מסתיימת לפני שמתקבל מזהה משימה.
בדף הזה
שמרו את הבקשה ואז העבירו את האות
יש להשתמש ב-SDK הרשמי של JavaScript ב-Node.js 22 ואילך, ולשמור את מפתח ה-API בצד השרת. יש להחליף את שם המארח והפעולה שבדוגמה בערכי היעד שלכם, להגדיר פרופיל אתר פעיל ולהגדיר את משתנה הסביבה של הפרוקסי.
הדוגמה מייצרת requestId לפני הקריאה ל-solve. יש לשמור באופן מתמשך את המזהה הזה ואת קלט המשימה ללא שינוי לפני הקריאה — ולא רק במטפל השגיאות. יצירת מזהה חדש במהלך השחזור תאבד את הקשר לבקשה המקורית.
import { randomUUID } from 'node:crypto';
import { Solvethree, SolvethreeError, TaskFailedError } from '@solvethree/sdk';
const client = new Solvethree({ apiKey: process.env.SOLVETHREE_API_KEY });
const task = { site: 'accounts.example.com', action: 'login', proxy: process.env.SOLVETHREE_PROXY, requestId: randomUUID() };
const controller = new AbortController();
const timer = setTimeout(() => controller.abort(), 5000);
try {
const result = await client.solve(task, { signal: controller.signal, timeoutMs: 180000 });
console.log('Ready task:', result.id);
// Submit this result with its browser identity and original proxy.
} catch (error) {
if (error instanceof TaskFailedError) {
console.error('Failed task:', error.taskId, error.errorCode);
} else if (error instanceof SolvethreeError) {
console.error('Recovery IDs:', error.requestId ?? task.requestId, error.taskId);
// If taskId exists, retrieve it. Otherwise replay the unchanged task with
// this requestId. Canceling local waiting did not cancel the remote task.
}
throw error;
} finally { clearTimeout(timer); }הטיימר של חמש השניות קורא ל-abort; האות signal מחבר את הבקר הזה לפעולת ה-SDK. הערך הנפרד timeoutMs מגדיר לפתרון זמן קצוב של 180 שניות. כל אחד מהם יכול לסיים את ההמתנה, לכן יש לשמור מידע לשחזור בשני המקרים. הבלוק finally מנקה את הטיימר אם הפעולה מסתיימת קודם.
שחזרו באמצעות המזהים שכבר ברשותכם
בלוק ה-catch רושם ביומן את מזהי השחזור וזורק מחדש את השגיאה; הוא אינו ממשיך את המשימה. הקוד הקורא צריך לשמור את המזהים האלה ולבחור את מסלול השחזור המתאים.
- כשל סופי: יש לטפל תחילה ב-
TaskFailedError, כמו בדוגמה. יש לבדוק אתerrorCodeואת הודעת השגיאה, ואז להפסיק לתשאל את המשימה שנכשלה. - מזהה משימה ידוע: אם
SolvethreeError.taskIdקיים, יש להמשיך את האחזור באמצעותgetTaskעם אותו מזהה. אין לקרוא שוב ל-solveרק כדי להמשיך בתשאול. - ללא מזהה משימה: יש לשחזר את היצירה על ידי העברת המשימה השמורה ללא שינוי ל-
createTaskעם אותוrequestId. יש להשתמש ב-requestIdשל השגיאה כשהוא זמין, ואחרת במזהה שנשמר לפני הקריאה. חיבור שנקטע אינו מוכיח שהיצירה נכשלה.
שליחה חוזרת של קלט זהה עם אותו requestId מחזירה את המשימה הקיימת. שינוי הקלט תוך שימוש חוזר במזהה הזה יוצר התנגשות, לכן אין לשנות את הפרוקסי, שם המארח או הפעולה במהלך השחזור.
בעת אחזור המשימה, pending ו-solving מציינים שיש להמשיך להמתין במסגרת המגבלה המקומית שבחרתם. רק ready מכיל פתרון שניתן להשתמש בו. יש לעצור ב-failed ולבדוק את פרטי השגיאה שלו.
בדקו ביטול ושחזור עם זמן המתנה מוגבל
- 1.
שמרו בקשת בדיקה אחת
יש לתעד את קלט המשימה המלא ואת ה-requestId שלה לפני הרצת הדוגמה. יש לשמור את הערכים האלה לאורך כל הבדיקה.
- 2.
בדקו כיצד הקריאה הראשונה מסתיימת
אם הפעולה עדיין ממתינה כשהטיימר של חמש השניות מופעל, יש ללכוד את השגיאה שהתקבלה ואת מזהי השחזור. תוצאה מוכנה או כשל סופי עשויים להגיע קודם; במקרה כזה, הריצה לא בדקה את הביטול.
- 3.
המשיכו את אותה משימה
יש להשתמש במסלול השחזור שלעיל כדי לקבל את מזהה המשימה, ואז לקרוא ל-getTask עם המזהה הזה ועם waitMs שמוגדר ל-15000. יש להגביל את מספר ניסיונות האחזור או להגדיר מועד סיום מקומי לבדיקה. אם המשימה נשארת בסטטוס pending או solving כשמגיעים למגבלה הזו, יש לשמור את המזהה שלה להמשך מאוחר יותר במקום ליצור משימה נוספת.
יש לבדוק שהשחזור מחזיר את מזהה המשימה המקורי בכל מקרה שבו הוא כבר היה ידוע. כך בודקים ביטול מקומי ושחזור משימה — לא אם אתר היעד מקבל טוקן שנוצר.
מקורות ותיעוד API
הפעלת המשימה הראשונה שלך.
התחילו עם $5 בקרדיט לסביבת העבודה.