בדיקת ה-API של CAPTCHA באמצעות HTTPie
השתמשו ב-HTTPie כדי ליצור משימה אחת, לשמור את המזהה שלה ואז לאחזר את אותה משימה. תעדו requestId לפני ה-POST כדי שחריגה מזמן החיבור הקצוב לא תחייב אתכם ליצור משימה לוגית נוספת.
בדף הזה
הכנת הבקשה
- התקינו את HTTPie ואת jq והריצו את הדוגמה ב-Bash. הפקודות האלה משתמשות בקובץ ההפעלה
httpשל HTTPie, ולא ב-curl או בכינוי מעטפת ל-curl. - הגדירו את משתנה הסביבה
SOLVETHREE_API_KEYלמפתח ה-API של סביבת העבודה שלכם. הריצו זאת במחשב מהימן; אל תכללו את המפתח בקוד דפדפן. - הגדירו במסוף פרופיל פעיל לשם המארח של היעד שלכם. שליחת שם מארח ופעולה לא יוצרת פרופיל. ראו הגדרת פרופיל אתר.
- החליפו את שם המארח, הפעולה וכתובת ה-URL של הפרוקסי שבדוגמה. השתמשו בכתובת URL של פרוקסי HTTP או HTTPS ללא נתיב, מחרוזת שאילתה או מקטע.
- החליפו את מציין המיקום של requestId במזהה ייחודי למשימה הלוגית הזו: 1–64 תווים הכוללים אותיות ASCII, ספרות, קווים תחתונים או מקפים. שמרו אותו לפני שליחת הבקשה.
הבקשה מיועדת ל-reCAPTCHA Enterprise: ברירת המחדל של recaptchaType היא enterprise-v3. נדרשים בה site, action ובדיוק אחד מהשדות proxy או proxyCandidates; הדוגמה הזו משתמשת בפרוקסי אחד. אל תוסיפו שדות type או url.
יצירת המשימה ושמירת המזהה שלה
set -eu
umask 077
# Install HTTPie and jq. Keep the same request.json for recovery.
cat > request.json <<'JSON'
{
"site": "accounts.example.com",
"action": "login",
"proxy": "http://USER:PASSWORD@PROXY:PORT",
"requestId": "replace-with-one-unique-logical-task-id"
}
JSON
# This file contains proxy credentials; keep it private.
http --check-status --timeout=30 POST https://api.solvethree.com/v1/tasks \
Authorization:"Bearer $SOLVETHREE_API_KEY" waitMs==0 < request.json > task.json
TASK_ID=$(jq -r '.id' task.json)
http --check-status --timeout=30 GET "https://api.solvethree.com/v1/tasks/$TASK_ID" \
Authorization:"Bearer $SOLVETHREE_API_KEY" waitMs==15000
# pending/solving: retrieve the same ID again, within a finite deadline.
# ready: use solution. failed: stop and inspect errorCode/error.
# A timed-out POST is recovered with the unchanged file and requestId.מחרוזות ה-JSON שבמירכאות נכתבות אל request.json, שאותו HTTPie קורא מ-stdin. כותרת Authorization שולחת את המפתח שלכם באמצעות אימות Bearer. שמרו על פרטיותו של request.json כי הוא מכיל פרטי גישה לפרוקסי.
waitMs==0 ו-waitMs==15000 הם פרמטרי שאילתה של HTTPie, ולא שדות בגוף ה-JSON. ה-POST מבקש ללא המתנה; ה-GET משתמש בהמתנה של 15,000 אלפיות שנייה. האפשרות הנפרדת --timeout=30 של HTTPie מגדירה זמן קצוב של 30 שניות בצד הלקוח.
תגובת ה-POST נשמרת ב-task.json, ו-jq מחלץ ממנה את id עבור ה-GET. הריצו את הפקודות לפי הסדר. set -eu עוצר את הסקריפט אם HTTPie מדווח על כשל, לפני שניתן להשתמש בתגובה חלקית לאחזור.
הצלחת HTTP לא אומרת שהפתרון מוכן
--check-status מזהה תגובות HTTP לא מוצלחות. טפלו בהן לפני שאתם מתייחסים לגוף התגובה כתגובת משימה מוצלחת. בקשת HTTP מוצלחת עדיין יכולה להחזיר משימה שלא הסתיימה או שנכשלה; לאחר מכן בדקו את status ב-JSON.
| מצב | הפעולה הבאה |
|---|---|
| pending או solving | אחזרו שוב את אותו מזהה משימה, במסגרת מגבלת זמן סופית שתבחרו. אל תיצרו משימה נוספת רק מפני שזו עדיין לא מוכנה. |
| מוכן | השתמשו בפתרון שהוחזר. זהו הסטטוס היחיד שבו יש פתרון שניתן להשתמש בו. |
| failed | הפסיקו לתשאל ובדקו את errorCode ואת error. ניתן החזר על פתרונות שנכשלו; אל תנסו שוב באופן עיוור עם אותו קלט לא תקין. |
הדוגמה מבצעת אחזור אחד, ולא לולאת תשאול. כשאתם שולחים פתרון מוכן ליעד המיועד שלו, השתמשו ב-userAgent וב-secChUa שהוחזרו עם הפרוקסי שהצליח. מצב מוכן מציין ש-solvethree יצר פתרון — לא שבקשת האפליקציה שלכם הצליחה.
שחזור POST שחרג מהזמן הקצוב
חריגה מהזמן הקצוב בצד הלקוח לא מוכיחה שיצירת המשימה נכשלה. אם כבר יש לכם מזהה משימה, אחזרו אותה. אם ה-POST חרג מהזמן הקצוב לפני שקיבלתם מזהה, הריצו שוב את ה-POST עם request.json ללא שינוי, כולל requestId המקורי שלו. אותו מזהה ואותם נתוני קלט למשימה מחזירים את המשימה הקיימת.
אל תחלצו מזהה מתוך task.json ריק או חלקי; שחזרו קודם את ה-POST. אל תשנו את הפרוקסי, הפעולה או נתוני קלט אחרים למשימה תוך שימוש חוזר באותו requestId — נתוני קלט שונים גורמים להתנגשות. השתמשו ב-requestId חדש רק כשבכוונתכם ליצור משימה לוגית חדשה.
מקורות ותיעוד API
הפעלת המשימה הראשונה שלך.
התחילו עם $5 בקרדיט לסביבת העבודה.