استخدام أداة حل 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إلى عنوان URL الكامل لنموذج HTTPS، وSOLVETHREE_PROXYإلى عنوان URL لوكيل HTTP أو HTTPS، وSOLVETHREE_API_KEYإلى مفتاح API لمساحة عملك. احتفظ بالمفتاح في عملية Python، وليس في JavaScript الخاص بالصفحة.
الحل أولًا ثم تشغيل Chrome بالهوية المُعادة
يتطلب مثال Chrome هذا وكيلًا يعتمد على قائمة سماح لعناوين IP دون اسم مستخدم أو كلمة مرور. يرفض عناوين URL للوكلاء التي تحتوي على بيانات اعتماد، ولا ينفّذ إعداد وكيل يتطلب المصادقة.
تستخدم المهمة اسم المضيف المستخرج من 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للمهمة هي اسم مضيفها، وليست عنوان URL الكامل؛ ولا تستخدم طلبات reCAPTCHA حقلurlأوtype.loginهو إجراء المثال. استبدله بالإجراء الذي يستخدمه التطبيق وملف تعريفه المُعدّ.- يحدّد
By.NAMEمعg-recaptcha-responseحقل النص في المثال التوضيحي. استخدم الحقل أو معلمة الإرسال التي يقرأها تطبيقك فعليًا. تعيين القيمة وإرسال حدث إدخال هما آلية التمرير في المثال التوضيحي، وليسا دالة رد نداء عامة لـ reCAPTCHA. - يحدّد
button[type="submit"]زر الإرسال في المثال التوضيحي. استبدله بمحدِّد لا لبس فيه لنموذجك، وحافظ على سلوك الجلسة وCSRF ودالة رد النداء الذي يتطلبه التطبيق.
لا يتحقق الانتظار الصريح في المثال، ومدته 20 ثانية، إلا من وجود حقل النص. بعد النقر على زر الإرسال، أضف انتظارًا مشروطًا للنتيجة الفعلية لتطبيقك، مثل حالة النجاح أو خطأ التحقق. استخدم مهلة نهائية لمسار المتصفح بالكامل، منفصلة عن مهلة أداة الحل؛ ولا تستبدل التحقق من الحالة بفترات انتظار ثابتة، ولا تخلط بين الانتظار الضمني والصريح دون عناية.
فحص الخطوة التي تفشل قبل شراء حل آخر
- تفشل مهمة الحل قبل بدء Chrome.
افحص errorCode وerror للمهمة التي وصلت إلى حالة نهائية. ميّز بين مهمة فاشلة وخطأ في طلب HTTP.
جرّب هذا: صحّح مشكلة المدخلات أو ملف التعريف أو الاتصال المُبلّغ عنها قبل إعادة المحاولة. توقف عن الاستعلام الدوري عن مهمة فاشلة؛ فلن تتحسن المدخلات غير الصالحة بإرسال طلب آخر دون تغييرها.
- تنتهي مهلة Selenium أثناء البحث عن حقل النص.
تأكد من أن Chrome وصل إلى النموذج المقصود وأن الصفحة تحتوي فعلًا على الحقل بالاسم المستخدم في المثال التوضيحي.
جرّب هذا: استبدل محدِّد العنصر في المثال التوضيحي بآلية تمرير الرمز في تطبيقك، وانتظر الحالة التي تتيحها. لن تعالج مهلة أطول خطأً في المحدِّد.
- الرمز جاهز، لكن التطبيق يرفض الإرسال.
افحص طلب التطبيق الصادر أولًا. تحقق من أنه يحتوي على solution.token، وليس معرّف المهمة أو قيمة قديمة، وأن الإجراء والوكيل وهوية المتصفح والجلسة تتوافق مع المسار المقصود.
جرّب هذا: صحّح المعامل المُرسل أو متطلبات التطبيق قبل طلب رمز آخر. توفّر المهمة الجاهزة حلاً؛ أما استجابة التطبيق فتحدّد ما إذا كان الإرسال قد قُبل.
المصادر ومرجع API
شغّل مهمتك الأولى.
ابدأ برصيد قدره $5 في مساحة العمل.