שימוש בפותר CAPTCHA עם Puppeteer
השתמשו ב-SDK הרשמי ל-JavaScript כדי לקבל טוקן reCAPTCHA v3 Enterprise, ואז העבירו את solution.token לטופס שלכם דרך Puppeteer. ה-SDK פותר את המשימה; הוא אינו מחיל את הפתרון על דפדפן ואינו מספק תוסף לדפדפן.
הדוגמה הבאה מיועדת לטופס HTTPS בבעלותכם עם textarea בשם g-recaptcha-response וכפתור שליחה. אלה דרישות הטופס של ההדגמה, ולא ממשק אוניברסלי לדפים המוגנים באמצעות reCAPTCHA.
בדף הזה
הכנת התלויות והטופס שבבעלותכם
- 1.
התקנת Puppeteer וה-SDK
השתמשו ב-Node.js 22 ואילך. באמצעות npm, התקינו את
puppeteerואת קובץ ה-tarball הרשמי של ה-SDK בכתובתhttps://solvethree.com/downloads/solvethree-sdk-0.1.0.tgz. ה-SDK מיובא בשם@solvethree/sdk; השתמשו בכתובת ההורדה במקום להניח שקיימת גרסה במאגר npm. שמרו את הדוגמה כמודול ES, למשל בקובץ עם הסיומת.mjs. - 2.
הגדרת פרופיל האתר
הגדירו את שם המארח שבבעלותכם במסוף solvethree וודאו שהפרופיל שלו פעיל עבור סביבת העבודה שלכם. שליחת שם מארח ופעולה אינה יוצרת את הפרופיל הזה. הדוגמה משתמשת בפעולה
login; שנו אותה לפעולה שהוגדרה עבור היישום שלכם. - 3.
הגדרת משתני הסביבה
הגדירו את
TARGET_URLלכתובת טופס ה-HTTPS שבבעלותכם, אתSOLVETHREE_PROXYלכתובת פרוקסי ה-HTTP או ה-HTTPS שלכם ואתSOLVETHREE_API_KEYלמפתח סביבת העבודה שלכם. שמרו את המפתח בתהליך Node.js, ולא בקוד JavaScript של הדף. הדוגמה משתמשת בפרוקסי אחד הן לפתרון והן לשליחה מהדפדפן.
השדה site של המשימה הוא שם המארח שחולץ מ-TARGET_URL, ולא כתובת הדף המלאה. עבור reCAPTCHA, שלחו את site, את action ובדיוק אחד מהשדות proxy או proxyCandidates; אל תוסיפו שדה type או url. דוגמה זו משתמשת ב-proxy כדי ש-Puppeteer יוכל להשתמש באותו פרוקסי ישירות.
פתרון ולאחריו פתיחת Puppeteer עם אותה זהות
// Install puppeteer and the official solvethree SDK first.
import puppeteer from 'puppeteer';
import { Solvethree } from '@solvethree/sdk';
const target = new URL(process.env.TARGET_URL); // Your configured HTTPS page.
const proxy = new URL(process.env.SOLVETHREE_PROXY);
const client = new Solvethree({ apiKey: process.env.SOLVETHREE_API_KEY });
const result = await client.solve({
site: target.hostname, action: 'login', proxy: process.env.SOLVETHREE_PROXY,
});
const browser = await puppeteer.launch({
args: [`--proxy-server=${proxy.protocol}//${proxy.host}`],
});
try {
const page = await browser.newPage();
if (proxy.username) await page.authenticate({
username: decodeURIComponent(proxy.username),
password: decodeURIComponent(proxy.password),
});
await page.setUserAgent({ userAgent: result.solution.userAgent });
await page.setExtraHTTPHeaders({ 'sec-ch-ua': result.solution.secChUa });
await page.goto(target.href);
// Adapt these selectors and any required callback to your own form.
await page.waitForSelector('[name="g-recaptcha-response"]');
await page.$eval('[name="g-recaptcha-response"]', (field, token) => {
field.value = token;
field.dispatchEvent(new Event('input', { bubbles: true }));
}, result.solution.token);
await Promise.all([
page.waitForNavigation({ waitUntil: 'domcontentloaded' }),
page.click('button[type="submit"]'),
]);
// Check your application's success response here.
} finally {
await browser.close();
}client.solve יוצר את המשימה פעם אחת ומתשאל את מצבה עד שהיא מוכנה או עד שנזרקת חריגה. רק לאחר שהקריאה חוזרת, הדוגמה מפעילה את Puppeteer. הדפדפן משתמש בפרוקסי של המשימה, מבצע אימות כשיש פרטי גישה לפרוקסי ומחיל את solution.userAgent ואת solution.secChUa לפני הניווט.
אל תחליפו את הפרוקסי או את זהות הדפדפן האלה בערכים לא קשורים בעת שליחת הטוקן. אם תעברו בהמשך ל-proxyCandidates, השתמשו בפונקציית העזר successfulProxy של ה-SDK כדי לבחור עבור הדפדפן את הפרוקסי המקורי שהצליח.
אם הפתרון נכשל, בדקו את errorCode ואת error של המשימה במקום לנסות שוב עם אותם נתונים. שגיאות של בקשות HTTP נפרדות מכישלונות סופיים של משימות. בלוק finally סוגר את הדפדפן המקומי לאחר העבודה בו; סגירת דפים אינה מנגנון לביטול משימות מרוחקות.
החלפת הנחות ההדגמה לגבי הטופס
[name="g-recaptcha-response"]בוחר את ה-textarea של ההדגמה. החליפו אותו אם היישום שלכם מקבל את הטוקן דרך שדה אחר או פרמטר אחר של הבקשה. הערך שיש לשלוח הואsolution.token, ולא מזהה המשימה.button[type="submit"]בוחר את כפתור השליחה של ההדגמה. השתמשו בפקד או במנגנון השליחה שבהם היישום שלכם משתמש בפועל.- הדוגמה מציבה את הטוקן ומשגרת אירוע
input. הדבר אינו מחליף פונקציית callback ייעודית ליישום. הוסיפו לפני השליחה כל פונקציית callback, ערך CSRF, שדות התחברות והגדרת סשן שנדרשים. - החליפו את ההערה האחרונה לבדיקת הצלחה בבדיקת אימות מול תגובת היישום שלכם או המצב שנוצר בו. משימת פתרון מוכנה אינה מוכיחה שהיישום קיבל את הטוקן.
אם אתם משתמשים שוב בדפדפן שכבר פועל, בחרו במכוון את ה-BrowserContext שלו: דף חדש אינו סשן נפרד באופן אוטומטי. שמרו על דרישות הסשן של הטופס כמכלול, במקום לערבב דפים מתהליכי עבודה לא קשורים.
מקורות ותיעוד API
הפעלת המשימה הראשונה שלך.
התחילו עם $5 בקרדיט לסביבת העבודה.