حالات الاستخدام

التعامل مع السيلينيوم CAPTCHA مع Python وCaptchaAI

يقوم السيلينيوم بأتمتة تفاعلات المتصفح، لكن اختبارات CAPTCHA توقفها. تعمل واجهة برمجة التطبيقات الخاصة بـ CaptchaAI على حل اختبارات CAPTCHA خارجيًا بينما يتعامل السيلينيوم مع المتصفح - حيث يمكنك استخراج معلمات CAPTCHA وإرسالها إلى واجهة برمجة التطبيقات وحقن الرمز المميز الذي تم إرجاعه.

المتطلبات

المتطلبات التفاصيل
بايثون 3.7+ مع تثبيت النقطة
السيلينيوم pip install selenium
كروم + كروم درايفر الإصدارات المطابقة
طلبات pip install requests
مفتاح CaptchaAI API منcaptchaai.com

كيف يعمل

  1. يقوم السيلينيوم بتحميل الصفحة المستهدفة
  2. يستخرج البرنامج النصي الخاص بك مفتاح موقع CAPTCHA من صفحة DOM
  3. يقوم CaptchaAI بحل اختبار CAPTCHA باستخدام مفتاح الموقع وعنوان URL للصفحة
  4. يقوم البرنامج النصي الخاص بك بإدخال الرمز المميز في الصفحة وإرسال النموذج

يتم حل اختبار 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.

أدلة ذات صلة

التعليقات غير مفعّلة لهذا المقال.