Kasus Penggunaan

Selenium CAPTCHA Handling dengan Python dan CaptchaAI

Selenium mengotomatiskan interaksi browser, tetapi CAPTCHA menghentikannya. API CaptchaAI memecahkan CAPTCHA secara eksternal sementara Selenium menangani browser – Anda mengekstrak parameter CAPTCHA, mengirimkannya ke API, dan memasukkan token yang dikembalikan.

Persyaratan

Persyaratan Detail
Python 3.7+ Dengan pip terpasang
Selenium pip install selenium
Chrome + ChromeDriver Versi yang cocok
request pip install requests
Kunci API CaptchaAI Daricaptchaai.com

Cara Kerjanya

  1. Selenium memuat halaman target
  2. Skrip Anda mengekstrak sitekey CAPTCHA dari halaman DOM
  3. CaptchaAI memecahkan CAPTCHA menggunakan sitekey dan URL halaman
  4. Skrip Anda memasukkan token ke halaman dan mengirimkan formulir

CAPTCHA diselesaikan di sisi server oleh CaptchaAI — Selenium tidak pernah berinteraksi dengan widget CAPTCHA secara langsung.

Langkah 1: Siapkan 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("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")

driver = webdriver.Chrome(options=options)

Bendera AutomationControlled membantu menghindari deteksi bot dasar. Untuk konfigurasi mode standar yang lebih kuat, tambahkan:

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

Langkah 2: Buat Pemecah 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")

Langkah 3: Ekstrak Sitekey dan Selesaikan

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

Langkah 4: Suntikkan Token dan Kirim

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

Contoh Kerja Lengkap

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()
    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()

Menangani Berbagai Jenis 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

Pemecahan Masalah

Masalah Penyebab Solusi
Token ditolak Token kedaluwarsa sebelum diserahkan Suntikkan dan kirimkan dalam 120 detik
Kunci situs tidak ditemukan CAPTCHA dimuat secara dinamis Tambahkan WebDriverWait dengan timeout lebih lama
NoSuchElementException Pemilih salah Periksa halaman untuk menemukan elemen yang benar
Versi ChromeDriver tidak cocok Chrome diperbarui Unduh versi ChromeDriver yang cocok
Deteksi bot meskipun tokennya benar Anti-bot di luar CAPTCHA Tambahkan opsi mode standar, gunakan driver chrome yang tidak terdeteksi

Pertanyaan Umum

Bisakah saya menjalankan Selenium dalam mode headless dengan CaptchaAI?

Ya. CaptchaAI menyelesaikan CAPTCHA di sisi server — browser hanya perlu memuat halaman untuk mengekstrak sitekey. Mode headless berfungsi dengan baik.

Apakah saya perlu mengklik kotak centang CAPTCHA?

Tidak. CaptchaAI mengembalikan token yang Anda masukkan langsung ke formulir. Tidak diperlukan interaksi visual dengan widget CAPTCHA.

Bagaimana dengan reCAPTCHA dengan callback?

Beberapa situs menggunakan callback JavaScript alih-alih pengiriman formulir. Gunakan driver.execute_script() untuk memicu callback dengan token yang diselesaikan. MelihatCara Mengatasi Callback reCAPTCHA v2.

Panduan Terkait

  • Cara Menangani Tantangan CAPTCHA dalam Alur Kerja Scraping Web
  • Pemecahan Dalang CAPTCHA dengan Node.js
  • Penanganan CAPTCHA Penulis Drama
Komentar dinonaktifkan untuk artikel ini.