إرسال حل CAPTCHA باستخدام Playwright لـ Python

بقلم solvethreeمدة القراءة: 3 دقيقة

حلّ CAPTCHA أولًا، ثم أنشئ سياق Playwright باستخدام الوكيل نفسه وهوية المتصفح المُعادة. أرسل solution.token عبر الحقل الذي يرسله تطبيقك فعلًا.

يرسل المثال أدناه نموذجًا على صفحة تتحكم فيها. وينتظر استجابة POST من التطبيق؛ ولا يعترض reCAPTCHA أو يعتمد على دالة رد نداء عامة لـ CAPTCHA.

في هذه الصفحة

تجهيز الهدف والبيئة

استخدم Python 3.10+، وثبّت Playwright ومتصفح Chromium الخاص به، وثبّت حزمة wheel الرسمية لـ SDK الخاصة بـ solvethree لـ Python. احتفظ بمفتاح 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 بدلًا من معرّف المهمة أو قيمة قديمة. وتحقق من أن الإرسال يستخدم الوكيل المستخدم للحل، ووكيل المستخدم وتلميحات العميل المُعادة، والهدف المقصود.

يلتقط انتظار الاستجابة طلبًا غير ذي صلة.

قارن عنوان URL لطلب POST المُلتقَط بنقطة نهاية النموذج الفعلية.

جرّب هذا: اجعل شرط الاستجابة محددًا لتلك النقطة بدلًا من مطابقة كل طلب POST إلى موقع الشبكة نفسه.

يثير استدعاء الحل استثناءً قبل الإرسال من المتصفح.

ميّز بين خطأ طلب HTTP ومهمة انتهت بالفشل.

جرّب هذا: عالج استجابات HTTP غير الناجحة بصورة منفصلة. وبالنسبة إلى المهمة الفاشلة، افحص errorCode وerror وصحّح السبب بدلًا من إعادة المحاولة بالمدخلات نفسها. تتوقف طريقة solve في SDK بالفعل عند الفشل.

شغّل مهمتك الأولى.

ابدأ برصيد قدره $5 في مساحة العمل.

إنشاء مساحة عمل
إرسال حل CAPTCHA باستخدام Playwright لـ Python · solvethree