يقوم السيلينيوم بأتمتة تفاعلات المتصفح، لكن اختبارات CAPTCHA توقفها. تعمل واجهة برمجة التطبيقات الخاصة بـ CaptchaAI على حل اختبارات CAPTCHA خارجيًا بينما يتعامل السيلينيوم مع المتصفح - حيث يمكنك استخراج معلمات CAPTCHA وإرسالها إلى واجهة برمجة التطبيقات وحقن الرمز المميز الذي تم إرجاعه.
المتطلبات
| المتطلبات | التفاصيل |
|---|---|
| بايثون 3.7+ | مع تثبيت النقطة |
| السيلينيوم | pip install selenium |
| كروم + كروم درايفر | الإصدارات المطابقة |
| طلبات | pip install requests |
| مفتاح CaptchaAI API | منcaptchaai.com |
كيف يعمل
- يقوم السيلينيوم بتحميل الصفحة المستهدفة
- يستخرج البرنامج النصي الخاص بك مفتاح موقع CAPTCHA من صفحة DOM
- يقوم CaptchaAI بحل اختبار CAPTCHA باستخدام مفتاح الموقع وعنوان URL للصفحة
- يقوم البرنامج النصي الخاص بك بإدخال الرمز المميز في الصفحة وإرسال النموذج
يتم حل اختبار CAPTCHA من جانب الخادم بواسطة CaptchaAI - لا يتفاعل السيلينيوم مطلقًا مع عنصر واجهة مستخدم CAPTCHA بشكل مباشر.
الخطوة 1: إعداد السيلينيوم
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
options = Options()
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
driver = webdriver.Chrome(options=options)
تساعد علامة AutomationControlled على تجنب اكتشاف الروبوتات الأساسية. للحصول على تكوين خفي أقوى، أضف:
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)
الخطوة 2: إنشاء حل CAPTCHA
import requests
import time
API_KEY = "YOUR_API_KEY"
def solve_recaptcha_v2(site_key, page_url):
"""Solve reCAPTCHA v2 using CaptchaAI API."""
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": site_key,
"pageurl": page_url
})
if not resp.text.startswith("OK|"):
raise Exception(f"Submit failed: {resp.text}")
task_id = resp.text.split("|")[1]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "get",
"id": task_id
})
if result.text == "CAPCHA_NOT_READY":
continue
if result.text.startswith("OK|"):
return result.text.split("|")[1]
raise Exception(f"Solve failed: {result.text}")
raise TimeoutError("CAPTCHA solve timed out")
الخطوة 3: استخراج مفتاح الموقع وحل المشكلة
# Navigate to the target page
driver.get("https://example.com/login")
# Wait for the reCAPTCHA to load
wait = WebDriverWait(driver, 10)
recaptcha = wait.until(
EC.presence_of_element_located((By.CLASS_NAME, "g-recaptcha"))
)
# Extract the site key
site_key = recaptcha.get_attribute("data-sitekey")
page_url = driver.current_url
print(f"Site key: {site_key}")
print(f"Page URL: {page_url}")
# Solve the CAPTCHA
token = solve_recaptcha_v2(site_key, page_url)
print(f"Token received: {token[:50]}...")
الخطوة 4: أدخل الرمز المميز ثم أرسله
# Inject the token into the reCAPTCHA response field
driver.execute_script(f"""
document.getElementById('g-recaptcha-response').innerHTML = '{token}';
document.getElementById('g-recaptcha-response').style.display = '';
""")
# If the form uses a callback function, trigger it
driver.execute_script(f"""
if (typeof ___grecaptcha_cfg !== 'undefined') {{
Object.keys(___grecaptcha_cfg.clients).forEach(function(key) {{
var client = ___grecaptcha_cfg.clients[key];
if (client.callback) client.callback('{token}');
}});
}}
""")
# Submit the form
driver.find_element(By.CSS_SELECTOR, "form").submit()
# Wait for navigation
wait.until(EC.url_changes(page_url))
print(f"Success! Now on: {driver.current_url}")
مثال العمل الكامل
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import requests
import time
API_KEY = "YOUR_API_KEY"
def solve_recaptcha_v2(site_key, page_url):
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": site_key,
"pageurl": page_url
})
if not resp.text.startswith("OK|"):
raise Exception(f"Submit failed: {resp.text}")
task_id = resp.text.split("|")[1]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id
})
if result.text == "CAPCHA_NOT_READY":
continue
if result.text.startswith("OK|"):
return result.text.split("|")[1]
raise Exception(f"Solve failed: {result.text}")
raise TimeoutError("Timed out")
def main():
options = Options()
options.add_argument("--disable-blink-features=AutomationControlled")
driver = webdriver.Chrome(options=options)
try:
driver.get("https://example.com/login")
wait = WebDriverWait(driver, 10)
# Extract site key
recaptcha = wait.until(
EC.presence_of_element_located((By.CLASS_NAME, "g-recaptcha"))
)
site_key = recaptcha.get_attribute("data-sitekey")
# Solve
token = solve_recaptcha_v2(site_key, driver.current_url)
# Inject and submit
driver.execute_script(
f"document.getElementById('g-recaptcha-response').innerHTML = '{token}';"
)
driver.find_element(By.CSS_SELECTOR, "form").submit()
wait.until(EC.url_changes(driver.current_url))
print("Login successful!")
finally:
driver.quit()
if __name__ == "__main__":
main()
التعامل مع أنواع CAPTCHA المختلفة
reCAPTCHA v3
def solve_recaptcha_v3(site_key, page_url, action="verify"):
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": site_key,
"pageurl": page_url,
"version": "v3",
"action": action
})
task_id = resp.text.split("|")[1]
# ... same polling logic
Cloudflare Turnstile
def solve_turnstile(site_key, page_url):
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "turnstile",
"sitekey": site_key,
"pageurl": page_url
})
task_id = resp.text.split("|")[1]
# ... same polling logic
استكشاف الأخطاء وإصلاحها
| المشكلة | السبب | الإجراء |
|---|---|---|
| تم رفض الرمز المميز | انتهت صلاحية الرمز المميز قبل الإرسال | حقن وتقديم في غضون 120 ثانية |
| لم يتم العثور على مفتاح الموقع | يتم تحميل اختبار CAPTCHA ديناميكيًا | أضف WebDriverWait مع مهلة أطول |
NoSuchElementException |
محدد خاطئ | قم بفحص الصفحة للعثور على العنصر الصحيح |
| عدم تطابق إصدار ChromeDriver | تم تحديث كروم | قم بتنزيل إصدار ChromeDriver المطابق |
| اكتشاف الروبوت على الرغم من الرمز المميز الصحيح | مكافحة الروبوت خارج CAPTCHA | أضف خيارات التخفي، واستخدم برنامج التشغيل الكرومي الذي لم يتم اكتشافه |
الأسئلة الشائعة
هل يمكنني تشغيل السيلينيوم في وضع مقطوعة الرأس باستخدام CaptchaAI؟
نعم. يعمل CaptchaAI على حل اختبار CAPTCHA من جانب الخادم - يحتاج المتصفح فقط إلى تحميل الصفحة لاستخراج مفتاح الموقع. يعمل الوضع بدون رأس بشكل جيد.
هل أحتاج إلى النقر فوق خانة الاختيار CAPTCHA؟
لا، تقوم CaptchaAI بإرجاع رمز مميز تقوم بإدخاله مباشرةً في النموذج. ليست هناك حاجة للتفاعل البصري مع أداة CAPTCHA.
ماذا عن reCAPTCHA مع عمليات الاسترجاعات؟
تستخدم بعض المواقع عمليات رد اتصال JavaScript بدلاً من إرسال النموذج. استخدم driver.execute_script() لتشغيل رد الاتصال باستخدام الرمز المميز الذي تم حله. يرىكيفية حل رد الاتصال reCAPTCHA v2.