שימוש בפותר CAPTCHA עם Selenium
השתמשו ב-solvethree כדי לקבל טוקן reCAPTCHA Enterprise, ואז השתמשו ב-Selenium כדי להכניס את solution.token לטופס של היישום שלכם ולשלוח אותו. ה-SDK פותר את המשימה; הוא אינו ממלא עבורכם את הטופס בדפדפן.
הדוגמה משתמשת בטופס HTTPS עם שדה טוקן וכפתור שליחה. התאימו את הבוררים האלה ליישום שאתם בודקים.
בדף הזה
הכנת הטופס וסביבת Python
- 1.
התקנת התלויות
השתמשו ב-Python 3.10 ואילך עם Chrome. התקינו את החבילה
seleniumבאמצעות pip, ואז התקינו את ה-SDK הרשמי של solvethree ל-Python מקובץ ה-wheel שלו הזמין להורדה. השתמשו בהוראות ההתקנה בהורדה ישירה שבמדריך השילוב עם Python; אל תחליפו אותן בהתקנה ממאגר חבילות מתוך הנחה שהחבילה זמינה בו. - 2.
הגדרת פרופיל היעד
הגדירו את שם המארח של הטופס שבבעלותכם במסוף solvethree וודאו שהפרופיל שלו פעיל עבור סביבת העבודה שלכם. שליחת שם מארח במשימה אינה יוצרת את הפרופיל הזה. הדוגמה מבקשת את הפעולה
login; שנו אותה אם היישום שלכם משתמש בפעולה אחרת. - 3.
הגדרת משתני הסביבה
הגדירו את
TARGET_URLלכתובת ה-HTTPS המלאה של הטופס שלכם, אתSOLVETHREE_PROXYלכתובת פרוקסי ה-HTTP או ה-HTTPS שלכם ואתSOLVETHREE_API_KEYלמפתח ה-API של סביבת העבודה שלכם. שמרו את המפתח בתהליך Python, ולא בקוד JavaScript של הדף.
פתרון תחילה, ולאחריו הפעלת Chrome עם הזהות שהוחזרה
דוגמה זו ל-Chrome דורשת פרוקסי עם רשימת כתובות IP מורשות, ללא שם משתמש או סיסמה. היא דוחה כתובות פרוקסי המכילות פרטי גישה ואינה מממשת הגדרה של פרוקסי המחייב אימות.
המשימה משתמשת בשם המארח שחולץ מ-TARGET_URL, בפעולה login ובפרוקסי אחד. לאחר ש-solve מחזיר תוצאה מוכנה, Chrome מופעל עם אותו פרוקסי ועם ערך ה-userAgent שהוחזר. לפני הניווט, הדוגמה מגדירה גם את כותרת ה-secChUa שהוחזרה.
# Install selenium and the official solvethree Python SDK first.
import os
from urllib.parse import urlsplit
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from solvethree import Solvethree
target = os.environ["TARGET_URL"] # Your configured HTTPS form page.
proxy_url = os.environ["SOLVETHREE_PROXY"]
proxy = urlsplit(proxy_url)
if proxy.username or proxy.password:
raise ValueError("This Chrome example requires an IP-allowlisted proxy without URL credentials")
client = Solvethree(os.environ["SOLVETHREE_API_KEY"])
result = client.solve({"site": urlsplit(target).hostname, "action": "login", "proxy": proxy_url})
solution = result["solution"]
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=" + proxy_url)
options.add_argument("--user-agent=" + solution["userAgent"])
driver = webdriver.Chrome(options=options)
try:
driver.execute_cdp_cmd("Network.enable", {})
driver.execute_cdp_cmd("Network.setExtraHTTPHeaders", {
"headers": {"sec-ch-ua": solution["secChUa"]}
})
driver.get(target)
# Adapt the field and button to your application's form contract.
field = WebDriverWait(driver, 20).until(
lambda browser: browser.find_element(By.NAME, "g-recaptcha-response")
)
driver.execute_script("""
arguments[0].value = arguments[1];
arguments[0].dispatchEvent(new Event('input', {bubbles:true}));
""", field, solution["token"])
driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]').click()
# Check your application's success response here.
finally:
driver.quit()Solvethree.solve יוצר את המשימה פעם אחת ומתשאל את מצבה עד שהיא מוכנה או עד שמועלית חריגה. רק אז הדפדפן מנווט לטופס. הסקריפט ממתין לשדה הטוקן, מציב בו את solution.token, משגר אירוע קלט ולוחץ על כפתור השליחה. Chrome נסגר בבלוק finally.
החלפת הנחות ההדגמה לגבי הטופס
TARGET_URLהוא דף הטופס של היישום שלכם. השדהsiteשל המשימה הוא שם המארח שלו, ולא הכתובת המלאה; בקשות reCAPTCHA אינן משתמשות בשדהurlאוtype.loginהיא הפעולה בדוגמה. החליפו אותה בפעולה שבה משתמשים היישום והפרופיל שהוגדר עבורו.By.NAMEעםg-recaptcha-responseמאתר את ה-textarea של ההדגמה. השתמשו בשדה או בפרמטר השליחה שהיישום שלכם קורא בפועל. הצבת הערך ושיגור אירוע קלט הם מנגנון ההעברה של ההדגמה, ולא פונקציית callback אוניברסלית של reCAPTCHA.button[type="submit"]מזהה את כפתור השליחה של ההדגמה. החליפו אותו בבורר חד-משמעי עבור הטופס שלכם ושמרו על התנהגות הסשן, ה-CSRF וה-callback שהיישום דורש.
ההמתנה המפורשת בת 20 השניות שבדוגמה בודקת רק שה-textarea קיים. לאחר הלחיצה על Submit, הוסיפו המתנה מותנית לתוצאה בפועל של היישום שלכם, כגון מצב הצלחה או שגיאת אימות נתונים. הגדירו מגבלת זמן כוללת לתהליך בדפדפן, בנפרד ממגבלת הזמן לפתרון; אל תחליפו בדיקות מצב בהשהיות קבועות ואל תערבבו ללא שיקול דעת בין המתנות מרומזות למפורשות.
בדיקת השלב שנכשל לפני רכישת פתרון נוסף
- משימת הפתרון נכשלת לפני הפעלת Chrome.
בדקו את errorCode ואת error של המשימה שהסתיימה. הבחינו בין משימה שנכשלה לבין שגיאת בקשת HTTP.
כדאי לנסות: תקנו את בעיית הקלט, הפרופיל או הקישוריות שדווחה לפני ניסיון חוזר. הפסיקו לתשאל משימה שנכשלה; נתוני קלט לא תקינים שלא השתנו לא ישתפרו בעקבות בקשה נוספת.
- Selenium חורג ממגבלת הזמן בעת חיפוש ה-textarea.
ודאו ש-Chrome הגיע לטופס המיועד ושהדף אכן מכיל את השדה בעל השם שבו משתמשת ההדגמה.
כדאי לנסות: החליפו את המאתר של ההדגמה במנגנון העברת הטוקן של היישום שלכם, והמתינו למצב שבו הוא זמין. הארכת מגבלת הזמן לא תתקן בורר שגוי.
- הטוקן מוכן, אך היישום דוחה את השליחה.
בדקו תחילה את הבקשה היוצאת של היישום. ודאו שהיא מכילה את solution.token — ולא את מזהה המשימה או ערך ישן — ושהפעולה, הפרוקסי, זהות הדפדפן והסשן תואמים לתהליך המיועד.
כדאי לנסות: תקנו את הפרמטר שנשלח או את דרישות האפליקציה לפני בקשת טוקן נוסף. משימה מוכנה מספקת פתרון; תגובת האפליקציה קובעת אם השליחה התקבלה.
מקורות ותיעוד API
הפעלת המשימה הראשונה שלך.
התחילו עם $5 בקרדיט לסביבת העבודה.