שימוש בשירות פתרון CAPTCHA ב-Express
השאירו את לקוח solvethree בשרת Express שלכם. השתמשו בנתיב POST מוגן באימות ליצירת משימה ובנתיב GET לאחזור שלה. קבעו את היעד והפרוקסי בתצורת השרת, כדי שהגורמים הקוראים לא יוכלו להפוך את נקודת הקצה לשירות ממסר שרירותי בתשלום.
בדף הזה
הגדירו את השרת והיעד
השתמשו ב-Node.js 22 ומעלה וב-Express 5. התקינו את ה-SDK הרשמי של JavaScript באמצעות התקנת tarball המתוארת בתיעוד, במקום להניח שהוא פורסם במאגר npm. הדוגמה יוצרת לקוח Solvethree אחד מחוץ לפונקציות הטיפול.
SOLVETHREE_API_KEY: מפתח ה-API של סביבת העבודה שלכם. שמרו אותו בשרת.INTEGRATION_KEY: סוד נפרד לגורמים קוראים פנימיים מהימנים. הדוגמה דורשת אותו בכותרתx-integration-key; אל תפיצו אותו ללקוחות דפדפן. אם כבר יש לכם שכבת ביניים לאימות, השתמשו בה במקום מנגנון ההגנה באמצעות מפתח משותף שבדוגמה.CAPTCHA_SITE: שם המארח של היעד, ולא כתובת URL מלאה. הגדירו פרופיל אתר פעיל לסביבת העבודה שלכם לפני יצירת משימות; שליחת שם מארח אינה יוצרת פרופיל.SOLVETHREE_PROXY: הפרוקסי עבור היעד הזה. הדוגמה מספקת פרוקסי יחיד ומקבעת את הפעולה ל-login. שנו את הפעולה בצד השרת אם היעד שלכם משתמש בפעולה אחרת.
הבקשה הזו משתמשת בתצורת ברירת המחדל של reCAPTCHA Enterprise. היא דורשת site, action ופרוקסי — לא type או url. ראו הגדרת פרופיל אתר אם היעד עדיין אינו מוגדר.
צרו פעם אחת, ואז אחזרו את המשימה
// npm install express and the official solvethree SDK tarball.
import express from 'express';
import { Solvethree, SolvethreeError } from '@solvethree/sdk';
const app = express();
const client = new Solvethree({ apiKey: process.env.SOLVETHREE_API_KEY });
const secret = process.env.INTEGRATION_KEY;
if (!secret) throw new Error('Set INTEGRATION_KEY');
app.use((request, response, next) => {
if (request.get('x-integration-key') !== secret) return response.sendStatus(401);
next();
});
app.post('/captcha/tasks', async (request, response) => {
const task = await client.createTask({
site: process.env.CAPTCHA_SITE, action: 'login', proxy: process.env.SOLVETHREE_PROXY,
requestId: request.get('x-request-id'),
}, { waitMs: 0, signal: AbortSignal.timeout(20000) });
response.json(task);
});
app.get('/captcha/tasks/:id', async (request, response) => {
response.json(await client.getTask(request.params.id, { waitMs: 15000, signal: AbortSignal.timeout(25000) }));
});
app.use((error, request, response, next) => {
if (error instanceof SolvethreeError) return response.status(502).json({ requestId: error.requestId, taskId: error.taskId });
response.status(400).json({ error: 'Invalid task input or ID' });
});
app.listen(3000);שני הנתיבים מוגנים באמצעות מנגנון האימות. פונקציית הטיפול ב-POST לוקחת את שם המארח, הפעולה והפרוקסי מתצורת השרת, ולא מגוף הבקשה. רק מזהה היצירה האופציונלי מגיע מהגורם הקורא.
- 1.
הקצו מזהה בקשה לפני היצירה
שלחו
x-request-idעם 1–64 אותיות ASCII, ספרות, קווים תחתונים או מקפים. שמרו אותו עם הבקשה הלוגית כדי שתוכלו לשחזר את היצירה אם הזמן הקצוב לחיבור יפוג. - 2.
שלחו POST אל
/captcha/tasksפעם אחתפונקציית הטיפול קוראת ל-
createTaskעםwaitMs: 0ומחזירה את המשימה. שמרו את המזהה שלה. תגובה מוצלחת פירושה שיש לכם משימה, ולא בהכרח פתרון. - 3.
אחזרו את הסטטוס באמצעות GET
קראו ל-
/captcha/tasks/:id. המשיכו לאחזר כל עוד הסטטוס הואpendingאוsolving; אל תחזרו על POST כדי לבדוק התקדמות. עצרו במצבreadyאוfailed. - 4.
השתמשו רק בפתרון מוכן
שלחו את הטוקן עם
userAgentו-secChUaשהוחזרו, באמצעות אותו פרוקסי מוגדר ולאותו יעד מיועד. ה-SDK אינו שולח אותו עבורכם. משימה מוכנה פירושה שנוצר פתרון, ולא שהיעד קיבל את בקשת האפליקציה שלכם.
טפלו בחריגות זמן בלי ליצור משימה נוספת
לקריאת ה-SDK של POST יש מגבלת זמן של 20 שניות באמצעות AbortSignal. קריאת GET מאפשרת המתנה של 15 שניות למשימה, במסגרת מגבלת זמן של 25 שניות לקריאת ה-SDK. תגובת GET עדיין עשויה להיות במצב שאינו סופי; בדקו את הסטטוס שלה במקום לראות בסיום ההמתנה כישלון של הפתרון.
חריגה מהזמן הקצוב ליצירה אינה מוכיחה ש-solvethree דחה את הבקשה. אם קיבלתם מזהה משימה, אחזרו אותה. אחרת, חזרו על היצירה עם אותו מזהה בקשה ועם קלטי משימה ללא שינוי כדי לשחזר את המשימה הקיימת. שימוש חוזר במזהה הזה עם קלטים שונים יוצר התנגשות. אם לא שמרתם מזהה בקשה, POST חדש עלול ליצור עבודה נפרדת.
Express 5 מעביר דחיות של פונקציות טיפול אסינכרוניות לשכבת הביניים לטיפול בשגיאות. הדוגמה מחזירה HTTP 502 עבור SolvethreeError, וחושפת רק את מזהי הבקשה והמשימה שלו — לא את השגיאה הגולמית, פרטי הגישה או הפתרון. תגובת ה-HTTP 400 החלופית שלה כללית; היא אינה מסווגת במדויק כל שגיאה שאינה שגיאת SDK, כולל שגיאות של חריגה ממגבלת זמן.
טפלו בשגיאות HTTP לפני קריאת נתוני תגובה מוצלחת. בנפרד מכך, משימה שאוחזרה יכולה להיות בסטטוס failed: בדקו את errorCode ואת error שלה, ואז הפסיקו את התשאול. ניתן החזר כספי על פתרונות שנכשלו, אך ניסיון חוזר עם קלטים לא תקינים שלא שונו לא יתקן אותם. השתמשו במדריך שגיאות ה-API כדי לאבחן את הכשל שדווח.
מקורות ותיעוד API
הפעלת המשימה הראשונה שלך.
התחילו עם $5 בקרדיט לסביבת העבודה.