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
- Selenium memuat halaman target
- Skrip Anda mengekstrak sitekey CAPTCHA dari halaman DOM
- CaptchaAI memecahkan CAPTCHA menggunakan sitekey dan URL halaman
- 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