שימוש ב-SDK של Node.js ב-AWS Lambda
השתמשו ב-Node.js 22 ואילך וארזו את ה-SDK הרשמי יחד עם פונקציית הטיפול שלכם. הגדירו ל-SDK מועד סיום מוקדם מזמן ההרצה שנותר ל-Lambda, כדי שלפונקציה יישאר זמן להחזיר מזהי משימות ושגיאות.
בדף הזה
ארזו את ה-SDK והגדירו את היעד
- 1.
התקינו את התלות
אתחלו חבילת npm בתיקיית בנייה נקייה. השתמשו ב-npm כדי להתקין את קובץ ה-tarball הרשמי בכתובת
https://solvethree.com/downloads/solvethree-sdk-0.1.0.tgz. הוא מספק את הייבוא@solvethree/sdk; אל תניחו שקיימת גרסה שפורסמה במאגר npm. - 2.
הגדירו את סביבת העבודה ואת היעד
הגדירו ב-Lambda משתני סביבה פרטיים בשם
SOLVETHREE_API_KEY,CAPTCHA_SITEו-SOLVETHREE_PROXY. השתמשו במפתח API של סביבת עבודה, בשם המארח של היעד במקום בכתובת URL מלאה ובפרוקסי למשימה הזו. בסביבת העבודה חייב כבר להיות פרופיל פעיל לאתר הזה; ראו הגדרת פרופיל אתר. - 3.
שמרו וארזו את פונקציית הטיפול
שמרו את הדוגמה שלהלן בשם
index.mjs. צרו קובץ ZIP שמכיל אתindex.mjs, את מטא-נתוני החבילה ואת תיקייתnode_modulesהמותקנת בשורש הארכיון — ולא בתוך תיקיית פרויקט עוטפת. אל תכללו פרטי הזדהות ב-ZIP. - 4.
פרסו באמצעות תהליך ה-Lambda הקיים שלכם
השתמשו בסביבת הריצה Node.js 22 והגדירו את פונקציית הטיפול ל-
index.handler. הפעילו אותה דרך צד השרת המורשה שלכם או תהליך IAM, תוך אספקתrequestIdקבוע לעבודה הלוגית. שמרו על פרטיות נתוני הפתרון שהוחזרו.
הדוגמה משתמשת בפעולה login; לפני הפריסה, שנו אותה לפעולה שהיעד שלכם מצפה לה. היא שולחת proxy אחד ומשתמשת בסוג הבקשה המוגדר כברירת מחדל, enterprise-v3. אל תוסיפו שדות reCAPTCHA מסוג type או url.
הגבילו את המתנת ה-SDK לפי תקציב הזמן להפעלה
import { Solvethree, SolvethreeError, TaskFailedError, ApiError } from '@solvethree/sdk';
const client = new Solvethree({ apiKey: process.env.SOLVETHREE_API_KEY });
export const handler = async (event, context) => {
const timeoutMs = Math.min(180000, context.getRemainingTimeInMillis() - 1500);
if (timeoutMs < 1000) throw new Error('Not enough execution time to start a task');
// The caller supplies one stable ID for this logical job; Lambda retries must
// reuse it. awsRequestId changes with invocations and is not that logical ID.
if (!event.requestId) throw new Error('Provide a stable requestId');
try {
return await client.solve({
site: process.env.CAPTCHA_SITE, action: 'login', proxy: process.env.SOLVETHREE_PROXY,
requestId: event.requestId,
}, { timeoutMs, signal: AbortSignal.timeout(timeoutMs) });
} catch (error) {
if (error instanceof TaskFailedError) return { status: 'failed', id: error.taskId, errorCode: error.errorCode };
if (error instanceof ApiError) return { apiError: error.status, requestId: error.requestId };
if (error instanceof SolvethreeError) return { interrupted: true, requestId: error.requestId, taskId: error.taskId };
throw error;
}
};
// Invoke through your authorized backend/IAM flow. The return value is private
// solution data; do not attach this handler to an unauthenticated public URL.פונקציית הטיפול קוראת את זמן ההרצה שנותר ל-Lambda, משאירה רזרבה של 1,500 אלפיות שנייה ומגבילה את המתנת ה-SDK ל-180,000 אלפיות שנייה. המגבלה הזו שייכת לדוגמה הזו; היא אינה מגבלת הרצה כללית של Lambda. אם לאחר הפחתת הרזרבה נותרת פחות משנייה אחת, פונקציית הטיפול מסרבת להתחיל.
גם הזמן הקצוב של ה-SDK וגם אות הביטול משתמשים במועד הסיום המחושב. solve יוצרת את המשימה פעם אחת ומתשאלת עד שהיא מוכנה או שמתרחשת שגיאה. הרזרבה משאירה זמן לטיפול בשגיאות כדי להחזיר מידע לשחזור, אך סיום כפוי של Lambda עדיין עלול למנוע כל תגובה.
הקוד הקורא חייב לשמור על event.requestId בין ניסיונות הפעלה חוזרים. השתמשו ב-1–64 תווי ASCII מסוג אותיות, ספרות, קווים תחתונים או מקפים. אל תשתמשו ב-awsRequestId: הוא מזהה הפעלה, ולא את בקשת הפתרון הלוגית.
טפלו בכשלים בלי להתחיל פתרון נוסף באופן עיוור
| תוצאה | מה לעשות |
|---|---|
משימה במצב ready | השתמשו בפתרון שלה. יצירת משימה או תגובת HTTP מוצלחת לבדן אינן מספיקות. |
status: failed | תעדו את id ואת errorCode. אחזרו את המשימה אם אתם זקוקים להודעת השגיאה שלה, אך הפסיקו לתשאל את המשימה שנכשלה. |
apiError | תעדו את קוד מצב ה-HTTP ואת מזהה הבקשה שהוחזר. זו שגיאה בבקשת API, ולא כישלון סופי של משימה; בדקו את הסיבה לפני שתנסו שוב עם קלט שלא השתנה. |
interrupted: true | שמרו כל taskId ו-requestId שהוחזרו, לצד מזהה הבקשה הלוגית המקורי של הקוד הקורא, לצורך שחזור. |
שגיאות אימות נתונים ושגיאות לא צפויות נזרקות מחדש. פונקציית הטיפול לא הופכת כל חריגה לתגובת קטיעה.
- 1.
שחזרו באמצעות מזהה המשימה כשהוא זמין
אחזרו את המשימה הקיימת באמצעות
getTask. המצביםpendingו-solvingמציינים שהיא עדיין פועלת; רקreadyמכיל פתרון שמיש. הגבילו כל המתנה נוספת לתקציב הזמן שנותר להפעלה החדשה. - 2.
אחרת, שחזרו באמצעות מזהה הבקשה הלוגית
שלחו שוב את אותה בקשת משימה עם ה־
requestIdהמקורי של הגורם הקורא. קלטים זהים מחזירים את המשימה הקיימת; קלטים שונים יוצרים התנגשות. במהלך ההתאוששות, אל תשנו את האתר, הפעולה והפרוקסי, גם אם התצורה השתנתה.
חריגה מזמן ההמתנה לחיבור אינה מוכיחה שיצירת המשימה נכשלה. שחזרו את המשימה הקיימת לפני שתקצו מזהה בקשה לוגי חדש. החוזים שעליהם מבוססת התנהגות זו מתוארים בתשאול משימות ובטיפול בשגיאות API.
שלחו באמצעות אותו פרוקסי וזהות הדפדפן שהוחזרה
ה־SDK מחזיר נתוני פתרון; הוא אינו מחיל אותם על היעד. כשהיישום שלכם שולח אותם, השתמשו בפרוקסי שהוגדר ובערכי userAgent ו־secChUa שהוחזרו. אל תחליפו אותם בזהות דפדפן או בכתובת URL של יעד שאינן קשורות. משימה מוכנה פירושה שנוצר פתרון — לא שהיעד קיבל את הבקשה שנשלחה לאחר מכן.
מקורות ותיעוד API
הפעלת המשימה הראשונה שלך.
התחילו עם $5 בקרדיט לסביבת העבודה.