פתרון reCAPTCHA Enterprise באמצעות Python
השתמשו ב-SDK הרשמי ל-Python כדי לבקש טוקן reCAPTCHA v3 Enterprise, ואז שלחו את solution.token עם זהות הדפדפן שהוחזרה ובאמצעות אותו פרוקסי. נדרשים Python 3.10 ומעלה, מפתח API של סביבת העבודה ופרופיל פעיל לאתר היעד.
בדף הזה
התקנת ה-SDK והגדרת האתר
התקינו את ה-SDK הרשמי ל-Python:
python -m pip install https://solvethree.com/downloads/solvethree_sdk-0.1.0-py3-none-any.whl- 1.
יצירת פרופיל האתר
הגדירו את שם המארח של היעד בקונסולת solvethree וודאו שהפרופיל שלו פעיל וזמין לסביבת העבודה שלכם. שליחת שם מארח בבקשת פתרון אינה יוצרת פרופיל. אם עדיין לא הגדרתם פרופיל, ראו הגדרת פרופיל אתר.
- 2.
הגדרת SOLVETHREE_API_KEY
במעטפת הפקודות או בסביבת הפריסה שבה יופעל הסקריפט, הגדירו את
SOLVETHREE_API_KEYלמפתח ה-API של סביבת העבודה שלכם. שמרו אותו בשרת, לא בקוד דפדפן או בקובץ מקור שנשמר במאגר. - 3.
הגדרת SOLVETHREE_PROXY
הגדירו את
SOLVETHREE_PROXYלכתובת הפרוקסי שתשמש לפתרון ולבקשת היישום שתבוא אחריו. הדוגמה משתמשת בפרוקסי אחד, לכן אל תוסיפו גםproxyCandidates.
בקשת טוקן Enterprise
שמרו את הדוגמה הזו בשם solve.py. החליפו את accounts.example.com בשם המארח שהגדרתם — ללא סכימה או נתיב — ואת login בפעולה שבה משתמש עמוד היעד.
import os
from uuid import uuid4
from solvethree import Solvethree, SolvethreeError, TaskFailedError
client = Solvethree(os.environ["SOLVETHREE_API_KEY"])
request = {
"site": "accounts.example.com", # Use your configured hostname.
"action": "login", # Use the page's actual action.
"proxy": os.environ["SOLVETHREE_PROXY"],
"requestId": str(uuid4()),
}
try:
result = client.solve(request, timeout=180)
except TaskFailedError as error:
raise SystemExit(f"Task failed: {error.error_code}") from None
except SolvethreeError as error:
# Keep these IDs so an interrupted request can be recovered.
raise SystemExit(f"Recover request {error.request_id}, task {error.task_id}") from None
solution = result["solution"]
token = solution["token"]
user_agent = solution["userAgent"]
client_hints = solution["secChUa"]
print("Ready task:", result["id"]) # Do not print the token or proxy password.ברירת המחדל של הבקשה היא enterprise-v3, ולכן אין צורך בשדה recaptchaType. אל תוסיפו type או url; אלה אינם שדות של בקשת reCAPTCHA.
Solvethree הוא סינכרוני. client.solve יוצר את המשימה פעם אחת, ואז מבצע תשאול עד שמוחזרת תוצאה מוכנה או נזרקת חריגה. כאן, timeout=180 מגביל את זמן ההמתנה של הלקוח ל-180 שניות. בהצלחה, הסקריפט מחלץ את הטוקן, את מזהה הדפדפן ואת רמזי הלקוח בלי להדפיס ערכים רגישים.
שליחת הטוקן ליישום
המשיכו באותו סקריפט לאחר הפתרון. התקינו את requests בנפרד, כפי שמצוין בדוגמה. החליפו את כתובת ההתחברות ואת נתוני הטופס בבקשה האמיתית של היישום שלכם, כולל פרטי הזדהות נדרשים, טוקן CSRF ועוגיות הפעלה.
# Continue after client.solve(). Install requests separately: pip install requests.
import requests
# This example endpoint accepts the standard reCAPTCHA form field.
# Use your application's real URL, form fields, CSRF token and session.
response = requests.post(
"https://accounts.example.com/login",
data={"g-recaptcha-response": solution["token"]},
headers={
"User-Agent": solution["userAgent"],
"sec-ch-ua": solution["secChUa"],
},
proxies={"http": request["proxy"], "https": request["proxy"]},
timeout=30,
allow_redirects=False,
)
# Inspect the application's response to determine whether it accepted the request.
print("Application HTTP status:", response.status_code)דוגמה זו מניחה שהיישום מקבל את הטוקן בשדה g-recaptcha-response. בדקו את הבקשה האמיתית במקום להניח שזהו שם השדה. אם הטופס תלוי בהפעלה קיימת, שלחו באמצעות אותה הפעלה במקום ליצור בקשה חדשה ללא עוגיות.
שמרו על ערכי userAgent ו-secChUa שהוחזרו, והשתמשו באותו פרוקסי שסופק לפתרון. החלפת כתובות IP או שימוש בזהות דפדפן לא קשורה עלולים להכשיל את הבקשה.
משימה מוכנה פירושה שנוצר פתרון, לא שהיישום קיבל אותו. בדקו את תגובת היישום ואת ההפעלה שנוצרה; קוד מצב HTTP לבדו אינו מעיד על התחברות מוצלחת. אם היישום דוחה את הטוקן, בדקו את הבקשה היוצאת לפני שתשלמו על פתרון נוסף: עליה להכיל את solution.token, ולא את מזהה המשימה או טוקן ישן. ראו אבחון טוקן שנדחה.
שחזור פתרון שנקטע בלי ליצור משימה נוספת
הדוגמה יוצרת requestId חדש בכל הפעלה של הסקריפט. אם נדרש שחזור לאחר הפעלה מחדש של התהליך, שמרו את המזהה ואת הבקשה המקורית לפני הקריאה ל-solve. הפעלה חוזרת של הסקריפט פשוט יוצרת בקשה לוגית חדשה.
- אם חריגה כוללת
task_id, השתמשו ב-get_taskכדי לחדש את התשאול של אותה משימה. אל תיצרו משימה חלופית רק מפני שפג הזמן הקצוב לחיבור. - אם היצירה נקטעה ויש לכם רק
request_id, שלחו שוב את בקשת המשימה הזהה עם אותוrequestId. כך תוחזר המשימה הקיימת; שינוי הקלט של המשימה תוך שימוש חוזר במזהה יוצר התנגשות. - במקרה של
TaskFailedError, הפסיקו לתשאל את המשימה. בדקו אתerrorCodeואתerrorשלה לפני ניסיון חוזר; פתרון נוסף לא יתקן קלט לא תקין שלא השתנה. על פתרונות שנכשלו ניתן החזר כספי.
ה-SDK אינו מנסה שוב באופן אוטומטי ליצור משימות. הוא כן מכבד את Retry-After במקרה של כשלי תשאול זמניים, במסגרת הזמן הקצוב לפתרון. לשליטה רבה יותר בהמתנה ובשחזור, ראו תשאול משימות וזמני קצוב.
מקורות ותיעוד API
הפעלת המשימה הראשונה שלך.
התחילו עם $5 בקרדיט לסביבת העבודה.