שליחת פתרון CAPTCHA באמצעות Playwright ל-Python

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

פתרו תחילה את ה־CAPTCHA, ואז צרו הקשר Playwright באמצעות אותו פרוקסי וזהות הדפדפן שהוחזרה. שלחו את solution.token דרך השדה שהיישום שלכם שולח בפועל.

הדוגמה הבאה שולחת טופס בדף שבשליטתכם. היא ממתינה לתגובת ה־POST של היישום; היא אינה מיירטת את reCAPTCHA ואינה תלויה בפונקציית callback אוניברסלית של CAPTCHA.

בדף הזה

הכנת היעד והסביבה

השתמשו ב־Python 3.10+, התקינו את Playwright ואת דפדפן Chromium שלו, והתקינו את חבילת ה־wheel הרשמית של SDK ה־Python של solvethree. שמרו את מפתח ה־API של סביבת העבודה בתהליך Python, ולא ב־JavaScript של הדפדפן.

  • TARGET_URL: כתובת ה־URL המלאה של דף הטופס שלכם. הדוגמה מחלצת ממנה את שם המארח עבור בקשת הפתרון.
  • SOLVETHREE_PROXY: כתובת ה־URL של הפרוקסי, כולל פרטי הזדהות אם נדרשים. אותו פרוקסי משמש לפתרון ולתעבורת הדפדפן.
  • SOLVETHREE_API_KEY: מפתח ה־API של סביבת העבודה שלכם.

לשם המארח של היעד נדרש פרופיל פעיל שזמין לסביבת העבודה שלכם. הגדירו את פרופיל האתר לפני הרצת הדוגמה. שנו את הפעולה login שבדוגמה לפעולה שהאינטגרציה שלכם דורשת; שליחת שם מארח ופעולה אינה יוצרת פרופיל. ברירת המחדל של הבקשה היא reCAPTCHA Enterprise v3.

פתרון, הגדרת Chromium ושליחה

Python Playwright · שליחת טופס בפועל
# Install playwright and the official Python SDK; run playwright install chromium.
import asyncio
import os
from urllib.parse import urlsplit, unquote
from playwright.async_api import async_playwright
from solvethree import Solvethree

async def main():
    target = os.environ["TARGET_URL"]
    proxy = urlsplit(os.environ["SOLVETHREE_PROXY"])
    client = Solvethree(os.environ["SOLVETHREE_API_KEY"])
    task = {"site": urlsplit(target).hostname, "action": "login", "proxy": os.environ["SOLVETHREE_PROXY"]}
    result = await asyncio.to_thread(client.solve, task, timeout=180)
    solution = result["solution"]
    async with async_playwright() as playwright:
        browser = await playwright.chromium.launch()
        try:
            netloc = proxy.netloc.rsplit("@", 1)[-1]
            context = await browser.new_context(
                proxy={"server": f"{proxy.scheme}://{netloc}", "username": unquote(proxy.username or ""), "password": unquote(proxy.password or "")},
                user_agent=solution["userAgent"], extra_http_headers={"sec-ch-ua": solution["secChUa"]})
            page = await context.new_page()
            await page.goto(target)
            field = page.locator('[name="g-recaptcha-response"]')
            await field.wait_for(state="attached")
            await field.evaluate("(field, token) => { field.value=token; field.dispatchEvent(new Event('input',{bubbles:true})); }", solution["token"])
            async with page.expect_response(lambda r: r.request.method == "POST" and urlsplit(r.url).netloc == urlsplit(target).netloc) as outcome:
                await page.get_by_role("button", name="Submit", exact=True).click()
            print("Application HTTP status:", (await outcome.value).status)
            # Check the application's actual response; adapt form/CSRF/session setup.
            await context.close()
        finally:
            await browser.close()

asyncio.run(main())

Solvethree הוא סינכרוני. קריאה ל־client.solve דרך asyncio.to_thread מונעת מפעולת היצירה והתשאול שלו לחסום את לולאת האירועים של Playwright. הוא מחזיר תוצאה מוכנה או זורק חריגה; ל־SDK אין לקוח אסינכרוני מובנה.

הקשר הדפדפן משתמש ב־solution.userAgent וב־solution.secChUa. הדוגמה גם מפרידה את שרת הפרוקסי משם המשתמש ומהסיסמה שלו, ומפענחת את פרטי ההזדהות לפני העברתם ל־Playwright. מכיוון שמשימה זו משתמשת בפרוקסי אחד, אין שלב של בחירת מועמד.

  1. 1.

    התאמה לשדה האסימון של היישום

    הדוגמה ממתינה לצירוף השדה, מקצה לו את solution.token ומשגרת אירוע קלט. היא אינה דורשת שהשדה יהיה גלוי. אם היישום שלכם שולח שדה אחר או קורא את מצב האסימון ממקום אחר, התאימו את העברת הנתונים הזו לבקשה היוצאת שלו.

  2. 2.

    הוספת דרישות הסשן של הטופס

    הדוגמה מתחילה בהקשר דפדפן חדש. הוסיפו לפני השליחה כל טיפול בסשן, הכנת טופס או טיפול ב־CSRF שנדרשים ליישום שלכם.

  3. 3.

    המתנה ל־POST הנכון

    ההמתנה לתגובה נרשמת לפני הלחיצה על Submit. תנאי ההתאמה שלה מזהה בקשת POST למיקום הרשת שבכתובת ה־URL של היעד. אם הדף שולח לשם בקשות POST נוספות, צמצמו את התנאי לנקודת הקצה של השליחה שלכם.

קריאת תגובת היישום

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

היישום דוחה אסימון מוכן.

בדקו את בקשת הטופס היוצאת לפני שתשלמו על פתרון נוסף.

כדאי לנסות: ודאו שהיא מכילה את solution.token ולא את מזהה המשימה או ערך ישן. בדקו שהשליחה משתמשת בפרוקסי של הפתרון, ב־user agent וברמזי הלקוח שהוחזרו, וביעד המיועד.

ההמתנה לתגובה לוכדת בקשה שאינה קשורה.

השוו את כתובת ה־URL של בקשת ה־POST שנלכדה לנקודת הקצה בפועל של הטופס.

כדאי לנסות: הגדירו תנאי התאמה לתגובה שספציפי לנקודת הקצה הזו, במקום להתאים לכל בקשת POST לאותו מיקום רשת.

קריאת הפתרון זורקת חריגה לפני השליחה בדפדפן.

הבחינו בין שגיאה בבקשת HTTP לבין משימה שהסתיימה בכישלון.

כדאי לנסות: טפלו בנפרד בתגובות HTTP שאינן מציינות הצלחה. במשימה שנכשלה, בדקו את errorCode ואת error ותקנו את הסיבה במקום לנסות שוב עם קלטים ללא שינוי. מתודת solve של ה־SDK כבר עוצרת במקרה של כישלון.

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

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

יצירת סביבת עבודה
שליחת פתרון CAPTCHA באמצעות Playwright ל-Python · solvethree