שימוש ב-SDK של Node.js ב-AWS Lambda

מאת solvethree4 דקות קריאה

השתמשו ב-Node.js 22 ואילך וארזו את ה-SDK הרשמי יחד עם פונקציית הטיפול שלכם. הגדירו ל-SDK מועד סיום מוקדם מזמן ההרצה שנותר ל-Lambda, כדי שלפונקציה יישאר זמן להחזיר מזהי משימות ושגיאות.

בדף הזה

ארזו את ה-SDK והגדירו את היעד

  1. 1.

    התקינו את התלות

    אתחלו חבילת npm בתיקיית בנייה נקייה. השתמשו ב-npm כדי להתקין את קובץ ה-tarball הרשמי בכתובת https://solvethree.com/downloads/solvethree-sdk-0.1.0.tgz. הוא מספק את הייבוא @solvethree/sdk; אל תניחו שקיימת גרסה שפורסמה במאגר npm.

  2. 2.

    הגדירו את סביבת העבודה ואת היעד

    הגדירו ב-Lambda משתני סביבה פרטיים בשם SOLVETHREE_API_KEY,‏ CAPTCHA_SITE ו-SOLVETHREE_PROXY. השתמשו במפתח API של סביבת עבודה, בשם המארח של היעד במקום בכתובת URL מלאה ובפרוקסי למשימה הזו. בסביבת העבודה חייב כבר להיות פרופיל פעיל לאתר הזה; ראו הגדרת פרופיל אתר.

  3. 3.

    שמרו וארזו את פונקציית הטיפול

    שמרו את הדוגמה שלהלן בשם index.mjs. צרו קובץ ZIP שמכיל את index.mjs, את מטא-נתוני החבילה ואת תיקיית node_modules המותקנת בשורש הארכיון — ולא בתוך תיקיית פרויקט עוטפת. אל תכללו פרטי הזדהות ב-ZIP.

  4. 4.

    פרסו באמצעות תהליך ה-Lambda הקיים שלכם

    השתמשו בסביבת הריצה Node.js 22 והגדירו את פונקציית הטיפול ל-index.handler. הפעילו אותה דרך צד השרת המורשה שלכם או תהליך IAM, תוך אספקת requestId קבוע לעבודה הלוגית. שמרו על פרטיות נתוני הפתרון שהוחזרו.

הדוגמה משתמשת בפעולה login; לפני הפריסה, שנו אותה לפעולה שהיעד שלכם מצפה לה. היא שולחת proxy אחד ומשתמשת בסוג הבקשה המוגדר כברירת מחדל, enterprise-v3. אל תוסיפו שדות reCAPTCHA מסוג type או url.

הגבילו את המתנת ה-SDK לפי תקציב הזמן להפעלה

Lambda index.mjs · הגבלת ה-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. 1.

    שחזרו באמצעות מזהה המשימה כשהוא זמין

    אחזרו את המשימה הקיימת באמצעות getTask. המצבים pending ו-solving מציינים שהיא עדיין פועלת; רק ready מכיל פתרון שמיש. הגבילו כל המתנה נוספת לתקציב הזמן שנותר להפעלה החדשה.

  2. 2.

    אחרת, שחזרו באמצעות מזהה הבקשה הלוגית

    שלחו שוב את אותה בקשת משימה עם ה־requestId המקורי של הגורם הקורא. קלטים זהים מחזירים את המשימה הקיימת; קלטים שונים יוצרים התנגשות. במהלך ההתאוששות, אל תשנו את האתר, הפעולה והפרוקסי, גם אם התצורה השתנתה.

חריגה מזמן ההמתנה לחיבור אינה מוכיחה שיצירת המשימה נכשלה. שחזרו את המשימה הקיימת לפני שתקצו מזהה בקשה לוגי חדש. החוזים שעליהם מבוססת התנהגות זו מתוארים בתשאול משימות ובטיפול בשגיאות API.

שלחו באמצעות אותו פרוקסי וזהות הדפדפן שהוחזרה

ה־SDK מחזיר נתוני פתרון; הוא אינו מחיל אותם על היעד. כשהיישום שלכם שולח אותם, השתמשו בפרוקסי שהוגדר ובערכי userAgent ו־secChUa שהוחזרו. אל תחליפו אותם בזהות דפדפן או בכתובת URL של יעד שאינן קשורות. משימה מוכנה פירושה שנוצר פתרון — לא שהיעד קיבל את הבקשה שנשלחה לאחר מכן.

הפעלת המשימה הראשונה שלך.

התחילו עם $5 בקרדיט לסביבת העבודה.

יצירת סביבת עבודה
שימוש ב-SDK של Node.js ב-AWS Lambda · solvethree