קריאה ל-solvethree מצד שרת של Flask
השתמשו בנתיבי Flask נפרדים ליצירה ולאחזור של משימת solvethree. בקשת ה־POST שלהלן חוזרת בלי להמתין לסיום הפתרון כולו; הפונה שומר את מזהה המשימה ובודק את נתיב ה־GET עד שהמשימה מוכנה או נכשלת.
בדף הזה
התקנת תלויות והגדרת היעד
- 1.
השתמשו ב־Python בגרסה 3.10 ואילך
התקינו את Flask באמצעות
python -m pip install flask. התקינו את ה־SDK הרשמי של Python באמצעותpython -m pip install https://solvethree.com/downloads/solvethree_sdk-0.1.0-py3-none-any.whl. - 2.
הגדרת משתני הסביבה של השרת
הגדירו את
SOLVETHREE_API_KEYלמפתח ה־API של סביבת העבודה שלכם, ואתINTEGRATION_KEYלסוד שהפונה המורשה ישלח בכותרתX-Integration-Key. הגדירו אתCAPTCHA_SITEלשם המארח של היעד, ולא לכתובת URL מלאה, ואתSOLVETHREE_PROXYלכתובת URL של פרוקסי HTTP או HTTPS המשמש למשימה הזאת. שמרו את הערכים האלה בשרת. - 3.
הפעלת פרופיל האתר
הגדירו במסוף solvethree פרופיל פעיל לשם המארח הזה, שזמין לסביבת העבודה שלכם. הגדרת
CAPTCHA_SITEאינה יוצרת פרופיל. ראו הגדרת פרופיל אתר אם היעד עדיין אינו מוגדר.
הדוגמה קובעת את הפעולה ל־login ומשתמשת במשימת ברירת המחדל של reCAPTCHA Enterprise v3. שנו את הפעולה כך שתתאים לפעולה ביעד לפני ההרצה. הפונה אינו יכול לעקוף את הגדרות האתר, הפעולה או הפרוקסי דרך גוף הבקשה.
הוספת נתיבי היצירה והאחזור
# pip install flask and the official solvethree SDK wheel.
import hmac
import os
from flask import Flask, abort, jsonify, request
from solvethree import Solvethree, SolvethreeError
app = Flask(__name__)
def client():
return Solvethree(os.environ["SOLVETHREE_API_KEY"])
@app.before_request
def authorize():
if not hmac.compare_digest(request.headers.get("x-integration-key", ""), os.environ["INTEGRATION_KEY"]):
abort(401)
@app.errorhandler(SolvethreeError)
def task_error(error):
return jsonify(requestId=error.request_id, taskId=error.task_id), 502
@app.errorhandler(ValueError)
def invalid_input(error):
return jsonify(error="Invalid task input or ID"), 400
@app.post("/captcha/tasks")
def create():
task = {"site": os.environ["CAPTCHA_SITE"], "action": "login", "proxy": os.environ["SOLVETHREE_PROXY"]}
if request.headers.get("x-request-id"):
task["requestId"] = request.headers["x-request-id"]
return jsonify(client().create_task(task, wait_ms=0, timeout=20))
@app.get("/captcha/tasks/<task_id>")
def retrieve(task_id):
return jsonify(client().get_task(task_id, wait_ms=15000, timeout=25))שמרו את הדוגמה בשם app.py. לאחר הגדרת משתני הסביבה, הפעילו אותה מקומית באמצעות python -m flask --app app run. הנתיבים הם POST /captcha/tasks ו־GET /captcha/tasks/<task_id>. Flask אינו זקוק ל־URLconf נפרד: הדקורטורים רושמים את שני הנתיבים. ראו את מדריך ההתחלה המהירה של Flask לפרטי ההפעלה המקומית; שמרו על תצורת ה־WSGI הקיימת שלכם לסביבת הייצור.
היצירה משתמשת ב־wait_ms=0 עם זמן קצוב של 20 שניות לפעולת הרשת. כך מדלגים על ההמתנה לפתרון, לא על בקשת ה־HTTP עצמה. האחזור מאפשר המתנה של עד 15 שניות לעדכון המשימה, עם זמן קצוב של 25 שניות לפעולת הרשת. שתי פונקציות התצוגה משתמשות ב־SDK הסינכרוני, ולכן כל אחת תופסת את תהליך העבודה שמטפל בבקשה שלה כל עוד קריאת ה־SDK פועלת.
שמרו את מזהה הבקשה לפני שליחת ה-POST
- 1.
צרו מזהה בקשה אחד לכל משימה לוגית
שמרו אותו לפני הקריאה ל-
POST /captcha/tasks, ואז שלחו אותו בתורX-Request-IDלצדX-Integration-Key. השתמשו ב-1–64 אותיות ASCII, ספרות, קווים תחתונים או מקפים. בקשת POST זו אינה זקוקה לגוף משימה, כי השרת בונה את המשימה מהתצורה הקבועה שלו. - 2.
שמרו את מזהה המשימה שהוחזר
לאחר תגובת HTTP מוצלחת, שמרו את ה-
idשל התוצאה. אחזרו אותה באמצעותGET /captcha/tasks/<task_id>, ושלחו שוב אתX-Integration-Key. - 3.
שחזרו יצירה שתוצאתה אינה ודאית במקום ליצור משימה נוספת
אם הזמן הקצוב לחיבור ה-POST פג, ייתכן שהיצירה בכל זאת הצליחה. אחזרו את המשימה אם יש לכם את המזהה שלה. אחרת, חזרו על ה-POST עם אותו
X-Request-IDועם קלטי משימה ללא שינוי כדי לשחזר את המשימה הקיימת. שימוש חוזר במזהה לאחר שינוי האתר, הפעולה או הפרוקסי יוצר התנגשות.
הכותרת אופציונלית בדוגמה, אך השמטתה מבטלת את אפשרות השחזור הזו כאשר היצירה מצליחה והתגובה אובדת. אל תייצרו מזהה חדש רק משום שפג הזמן הקצוב לבקשה הראשונה.
טפלו בשגיאות HTTP לפני בדיקת סטטוס המשימה
בדקו תחילה את סטטוס ה-HTTP של תגובת Flask. הדוגמה מחזירה 401 כאשר מפתח האינטגרציה חסר או שגוי, 400 כאשר נתפס ValueError, ו-502 כאשר נתפס SolvethreeError. גוף תגובת ה-502 חושף את requestId ואת taskId לצורך שחזור; הוא אינו מטען נתונים של סטטוס משימה, ואינו מעיד כשלעצמו שהמשימה נכשלה.
| סטטוס משימה | פעולת הפונה |
|---|---|
| בהמתנה | שמרו על אותו מזהה משימה ואחזרו שוב. |
| בפתרון | שמרו על אותו מזהה משימה ואחזרו שוב. |
| מוכן | הפסיקו את התשאול וקראו את הפתרון. |
| failed | הפסיקו את התשאול ובדקו את errorCode ואת error. ניתן החזר כספי על פתרונות שנכשלו. |
שליחת הטוקן עם הפרוקסי המקורי והזהות שהוחזרה
רק תוצאה במצב ready מכילה פתרון שמיש. שלחו את solution.token ליעד המיועד — לא את מזהה המשימה — והשתמשו בזהות הדפדפן שהוחזרה בשדות solution.userAgent ו-solution.secChUa.
בצעו את השליחה דרך אותו פרוקסי ששימש ליצירת המשימה. הדוגמה משתמשת ב-SOLVETHREE_PROXY קבוע אחד, לכן שמרו את תצורת הפרוקסי המקורית הזו עם המשימה, במקום להניח שערך משתנה הסביבה הנוכחי עדיין יתאים בהמשך. נתיבי Flask מחזירים את תוצאת ה-SDK; הם אינם מבצעים את השליחה ליעד או מגדירים את הפרוקסי של הגורם הקורא.
שמרו יחד את הטוקן, הפרוקסי, זהות הדפדפן והיעד המיועד. משימה מוכנה פירושה ש-solvethree יצר פתרון; הקבלה נקבעת לפי תגובת היעד לבקשת האפליקציה שנשלחת לאחר מכן.
מקורות ותיעוד API
הפעלת המשימה הראשונה שלך.
התחילו עם $5 בקרדיט לסביבת העבודה.