Trường Hợp Sử Dụng

Xử lý CAPTCHA Selenium bằng Python và CaptchaAI

Selenium tự động hóa các tương tác trên trình duyệt, nhưng CAPTCHA ngăn chặn điều đó. API của CaptchaAI giải quyết CAPTCHA từ bên ngoài trong khi Selenium xử lý trình duyệt — bạn trích xuất các tham số CAPTCHA, gửi chúng tới API và đưa mã thông báo được trả về.

Yêu cầu

Yêu cầu Chi tiết
Python 3.7+ Đã cài đặt pip
Selen pip install selenium
Chrome + ChromeDriver Phiên bản phù hợp
yêu cầu pip install requests
Khóa API CaptchaAI Từcaptchaai.com

Nó hoạt động như thế nào

  1. Selenium tải trang đích
  2. Tập lệnh của bạn trích xuất khóa trang CAPTCHA từ trang DOM
  3. CaptchaAI giải CAPTCHA bằng khóa trang và URL trang
  4. Tập lệnh của bạn đưa mã thông báo vào trang và gửi biểu mẫu

CAPTCHA được giải quyết phía máy chủ bởi CaptchaAI - Selenium không bao giờ tương tác trực tiếp với tiện ích CAPTCHA.

Bước 1: Thiết lập Selenium

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("")
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")

driver = webdriver.Chrome(options=options)

Cờ AutomationControlled giúp tránh bị phát hiện bot cơ bản. Để có cấu hình tàng hình mạnh hơn, hãy thêm:

options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)

Bước 2: Tạo Bộ giải 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")

Bước 3: Trích xuất khóa trang web và giải quyết

# Navigate to the target page
driver.get("https://staging.example.com/qa-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]}...")

Bước 4: Bơm mã thông báo và gửi

# 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}")

Ví dụ làm việc đầy đủ

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("")
    driver = webdriver.Chrome(options=options)

    try:
        driver.get("https://staging.example.com/qa-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()

Xử lý các loại CAPTCHA khác nhau

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

Khắc phục sự cố

Vấn đề Nguyên nhân Cách xử lý
Mã thông báo bị từ chối Mã thông báo đã hết hạn trước khi gửi Tiêm và nộp trong vòng 120 giây
Không tìm thấy khóa trang web CAPTCHA tải động Thêm WebDriverWait với thời gian chờ lâu hơn
NoSuchElementException Bộ chọn sai Kiểm tra trang để tìm phần tử chính xác
Phiên bản ChromeDriver không khớp Chrome đã cập nhật Tải xuống phiên bản ChromeDriver phù hợp
Phát hiện bot mặc dù mã thông báo chính xác Chống bot ngoài CAPTCHA Thêm tùy chọn ẩn, sử dụng chromedriver không bị phát hiện

Câu hỏi thường gặp

Tôi có thể chạy Selenium ở chế độ headless với CaptchaAI không?

Vâng. CaptchaAI giải quyết CAPTCHA phía máy chủ - trình duyệt chỉ cần tải trang để trích xuất khóa trang. Chế độ headless hoạt động tốt.

Tôi có cần nhấp vào hộp kiểm CAPTCHA không?

Không. CaptchaAI trả về mã thông báo mà bạn đưa trực tiếp vào biểu mẫu. Không cần tương tác trực quan với tiện ích CAPTCHA.

Còn reCAPTCHA với lệnh gọi lại thì sao?

Một số trang web sử dụng lệnh gọi lại JavaScript thay vì gửi biểu mẫu. Sử dụng driver.execute_script() để kích hoạt lệnh gọi lại bằng mã thông báo đã giải quyết. Nhìn thấyCách giải quyết cuộc gọi lại reCAPTCHA v2.

Hướng dẫn liên quan

Os comentários estão desativados para este artigo.