קריאה ל-solvethree מצד שרת של Flask

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

השתמשו בנתיבי Flask נפרדים ליצירה ולאחזור של משימת solvethree. בקשת ה־POST שלהלן חוזרת בלי להמתין לסיום הפתרון כולו; הפונה שומר את מזהה המשימה ובודק את נתיב ה־GET עד שהמשימה מוכנה או נכשלת.

בדף הזה

התקנת תלויות והגדרת היעד

  1. 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. 2.

    הגדרת משתני הסביבה של השרת

    הגדירו את SOLVETHREE_API_KEY למפתח ה־API של סביבת העבודה שלכם, ואת INTEGRATION_KEY לסוד שהפונה המורשה ישלח בכותרת X-Integration-Key. הגדירו את CAPTCHA_SITE לשם המארח של היעד, ולא לכתובת URL מלאה, ואת SOLVETHREE_PROXY לכתובת URL של פרוקסי HTTP או HTTPS המשמש למשימה הזאת. שמרו את הערכים האלה בשרת.

  3. 3.

    הפעלת פרופיל האתר

    הגדירו במסוף solvethree פרופיל פעיל לשם המארח הזה, שזמין לסביבת העבודה שלכם. הגדרת CAPTCHA_SITE אינה יוצרת פרופיל. ראו הגדרת פרופיל אתר אם היעד עדיין אינו מוגדר.

הדוגמה קובעת את הפעולה ל־login ומשתמשת במשימת ברירת המחדל של reCAPTCHA Enterprise v3. שנו את הפעולה כך שתתאים לפעולה ביעד לפני ההרצה. הפונה אינו יכול לעקוף את הגדרות האתר, הפעולה או הפרוקסי דרך גוף הבקשה.

הוספת נתיבי היצירה והאחזור

Flask · יצירה ואחזור של אותה משימה
# 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. 1.

    צרו מזהה בקשה אחד לכל משימה לוגית

    שמרו אותו לפני הקריאה ל-POST /captcha/tasks, ואז שלחו אותו בתור X-Request-ID לצד X-Integration-Key. השתמשו ב-1–64 אותיות ASCII, ספרות, קווים תחתונים או מקפים. בקשת POST זו אינה זקוקה לגוף משימה, כי השרת בונה את המשימה מהתצורה הקבועה שלו.

  2. 2.

    שמרו את מזהה המשימה שהוחזר

    לאחר תגובת HTTP מוצלחת, שמרו את ה-id של התוצאה. אחזרו אותה באמצעות GET /captcha/tasks/<task_id>, ושלחו שוב את X-Integration-Key.

  3. 3.

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

    אם הזמן הקצוב לחיבור ה-POST פג, ייתכן שהיצירה בכל זאת הצליחה. אחזרו את המשימה אם יש לכם את המזהה שלה. אחרת, חזרו על ה-POST עם אותו X-Request-ID ועם קלטי משימה ללא שינוי כדי לשחזר את המשימה הקיימת. שימוש חוזר במזהה לאחר שינוי האתר, הפעולה או הפרוקסי יוצר התנגשות.

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

טפלו בשגיאות HTTP לפני בדיקת סטטוס המשימה

בדקו תחילה את סטטוס ה-HTTP של תגובת Flask. הדוגמה מחזירה 401 כאשר מפתח האינטגרציה חסר או שגוי, 400 כאשר נתפס ValueError, ו-502 כאשר נתפס SolvethreeError. גוף תגובת ה-502 חושף את requestId ואת taskId לצורך שחזור; הוא אינו מטען נתונים של סטטוס משימה, ואינו מעיד כשלעצמו שהמשימה נכשלה.

לאחר תגובת HTTP מוצלחת, בדקו את סטטוס המשימה.
לאחר תגובת HTTP מוצלחת, בדקו את סטטוס המשימה.
סטטוס משימהפעולת הפונה
בהמתנהשמרו על אותו מזהה משימה ואחזרו שוב.
בפתרוןשמרו על אותו מזהה משימה ואחזרו שוב.
מוכןהפסיקו את התשאול וקראו את הפתרון.
failedהפסיקו את התשאול ובדקו את errorCode ואת error. ניתן החזר כספי על פתרונות שנכשלו.

שליחת הטוקן עם הפרוקסי המקורי והזהות שהוחזרה

רק תוצאה במצב ready מכילה פתרון שמיש. שלחו את solution.token ליעד המיועד — לא את מזהה המשימה — והשתמשו בזהות הדפדפן שהוחזרה בשדות solution.userAgent ו-solution.secChUa.

בצעו את השליחה דרך אותו פרוקסי ששימש ליצירת המשימה. הדוגמה משתמשת ב-SOLVETHREE_PROXY קבוע אחד, לכן שמרו את תצורת הפרוקסי המקורית הזו עם המשימה, במקום להניח שערך משתנה הסביבה הנוכחי עדיין יתאים בהמשך. נתיבי Flask מחזירים את תוצאת ה-SDK; הם אינם מבצעים את השליחה ליעד או מגדירים את הפרוקסי של הגורם הקורא.

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

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

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

יצירת סביבת עבודה
קריאה ל-solvethree מצד שרת של Flask · solvethree