שמירה על עוגיות היישום בעת שליחת טוקן שנפתר
טוקן reCAPTCHA שנפתר אינו מחליף את קובצי ה-cookie של סשן האפליקציה או את ערך ה-CSRF. אחזרו את הטופס והגישו אותו דרך אותו requests.Session כדי שבקשת ה-POST תשמור את קובצי ה-cookie שהתקבלו בבקשת ה-GET.
השתמשו בכותרות הדפדפן שהחזיר שירות הפתרון ובאותו פרוקסי בשתי הבקשות לאפליקציה. בדוגמה הפתרון מתבצע תחילה, כדי שהכותרות יהיו זמינות לפני פתיחת הטופס.
בדף הזה
בצעו את בקשות ה-GET וה-POST של הטופס באותו סשן
השתמשו ב-Python 3.10+ עם requests ועם SDK ה-Python הרשמי של solvethree מותקנים. לשם המארח של היעד נדרש פרופיל פעיל בסביבת העבודה שלכם; שליחת שם המארח במשימה אינה יוצרת פרופיל. אם הוא אינו מוגדר, עיינו בהגדרת פרופיל אתר.
- הגדירו את
TARGET_URLלכתובת ה-URL של הטופס באפליקציה שלכם. הדגמה זו, שבבעלותנו, משתמשת באותה כתובת URL לבקשות ה-GET וה-POST. - הגדירו את
SOLVETHREE_PROXYלפרוקסי היחיד המשמש לפתרון ולשתי הבקשות לאפליקציה. - הגדירו את
SOLVETHREE_API_KEYלמפתח ה-API של סביבת העבודה שלכם. הריצו את הקוד הזה בצד השרת.
# This owned demo form has an input named csrf_token and g-recaptcha-response.
import os
from html.parser import HTMLParser
from urllib.parse import urlsplit
import requests
from solvethree import Solvethree
class FormParser(HTMLParser):
csrf = None
def handle_starttag(self, tag, attributes):
values = dict(attributes)
if tag == "input" and values.get("name") == "csrf_token":
self.csrf = values.get("value")
target = os.environ["TARGET_URL"]
proxy = os.environ["SOLVETHREE_PROXY"]
request = {"site": urlsplit(target).hostname, "action": "login", "proxy": proxy}
# Obtain the solver's browser headers before opening the application session.
result = Solvethree(os.environ["SOLVETHREE_API_KEY"]).solve(request, timeout=180)
solution = result["solution"]
with requests.Session() as session:
session.headers.update({"User-Agent": solution["userAgent"], "sec-ch-ua": solution["secChUa"]})
proxies = {"http": proxy, "https": proxy}
page = session.get(target, proxies=proxies, timeout=20, allow_redirects=False)
page.raise_for_status()
parser = FormParser(); parser.feed(page.text)
if not parser.csrf: raise RuntimeError("The expected demo CSRF input was not found")
response = session.post(target, proxies=proxies, timeout=20, allow_redirects=False,
data={"csrf_token": parser.csrf, "g-recaptcha-response": solution["token"]})
print("Application HTTP status:", response.status_code)
# Use the actual form's submit URL, fields and session rules. Inspect its result.הקריאה solve של ה-SDK יוצרת את המשימה ומבצעת תשאול חוזר עד שהיא מוכנה או עד שנזרקת חריגה. לאחר מכן הדוגמה מחילה על הסשן את solution.userAgent ואת solution.secChUa. בקשת ה-GET ממלאת את מאגר קובצי ה-cookie שלו; בקשת ה-POST משתמשת שוב באותו מאגר ומגישה את solution.token לצד ערך ה-CSRF שחולץ מהטופס.
שנו את הפעולה login, את כתובת ה-URL להגשה ואת שדות הטופס בהדגמה כך שיתאימו לאפליקציה שלכם. csrf_token הוא שם השדה בטופס הזה, ולא דרישה של solvethree. התאימו את מנתח ה-HTML אם הטופס שלכם משתמש בשם או במבנה אחר, וכללו שדות נדרשים נוספים, כגון פרטי התחברות. אם כתובת ה-URL להגשה שונה מכתובת הטופס, עדיין השתמשו באותו סשן.
אם האפליקציה דוחה את בקשת ה-POST
סטטוס ה-HTTP המודפס הוא נקודת התחלה, לא הוכחה שההתחברות הצליחה. בדקו את תגובת האפליקציה ואת הבקשה היוצאת לפני שתשלמו על פתרון נוסף. משימה מוכנה פירושה שנוצר פתרון; האפליקציה עדיין מחליטה אם לקבל את ההגשה.
- שדה הקלט של CSRF לא נמצא.
בדקו את הסטטוס ואת גוף התגובה של בקשת ה-GET. מעקב אחר הפניות מושבת, ולכן תגובת הפניה אינה הטופס הצפוי.
כדאי לנסות: אחזרו במכוון את הטופס הנכון דרך אותו סשן, ואז התאימו את המנתח לשדה ה-CSRF בפועל.
- האפליקציה מדווחת על סשן חסר או על ערך CSRF לא תקין.
בדקו אם בקשת ה-GET קיבלה קובצי cookie, אם בקשת ה-POST שלחה את קובצי ה-cookie הרלוונטיים, ואם ערך ה-CSRF שלה הגיע מתגובת הטופס ההיא.
כדאי לנסות: בצעו את שתי הבקשות באותו requests.Session. אל תאחזרו את הטופס באמצעות לקוח אחד ותגישו אותו באמצעות לקוח אחר.
- האפליקציה דוחה את ה-CAPTCHA.
בדקו את שדה הטוקן היוצא, את הפעולה, את הפרוקסי, את User-Agent ואת sec-ch-ua. ודאו שאתם שולחים את solution.token ולא את מזהה המשימה או טוקן ישן יותר.
כדאי לנסות: השתמשו בטוקן הנוכחי, באותו פרוקסי ששימש לפתרון ובכותרות הדפדפן שהוחזרו. אם תוקף הטוקן פג או שכבר בוצעה לו הערכה, השיגו טוקן חדש סמוך להגשה.
- בקשת ה-POST מסתיימת, אך ההתחברות לא.
בדקו את גוף התגובה ואת יעד ההפניה, אם יש כזה, וכן את כתובת ה-URL בפועל להגשה ואת שדות הטופס הנדרשים.
כדאי לנסות: התאימו את נתוני הטופס בהדגמה לדרישות הממשק של האפליקציה. טוקן CAPTCHA אינו מספק פרטי הזדהות או שדות אפליקציה חסרים אחרים.
מקורות ותיעוד API
הפעלת המשימה הראשונה שלך.
התחילו עם $5 בקרדיט לסביבת העבודה.