undetected-chromedriver là thư viện Python vá ChromeDriver của Selenium để giảm tín hiệu phát hiện bot. Nó xử lý việc khớp phiên bản Chrome, xóa cờ thuộc tính WebDriver chuẩn và sửa đổi các dấu vân tay trình duyệt khác mà các trang web kiểm tra. Khi một trang web vẫn hiển thị CAPTCHA bất chấp các biện pháp ẩn, CaptchaAI sẽ giải quyết vấn đề đó và trả về mã thông báo mà bạn đưa vào trang.
Hướng dẫn này chỉ ra cách kết hợp cả hai công cụ - sử dụng chromedriver không bị phát hiện để duyệt web ẩn và CaptchaAI cho bất kỳ CAPTCHA nào vẫn xuất hiện.
Những gì bạn cần
| Yêu cầu | Chi tiết |
|---|---|
| Khóa API CaptchaAI | captchaai.com |
| Python 3.8+ | |
| Trình duyệt Chrome | Đã cài đặt trên hệ thống của bạn |
Cài đặt phụ thuộc:
pip install undetected-chromedriver requests
Thiết lập cơ bản
import undetected_chromedriver as uc
import requests
import time
def create_stealth_browser():
"""Create an undetected Chrome browser instance."""
options = uc.ChromeOptions()
options.add_argument("--no-sandbox")
options.add_argument("--window-size=1920,1080")
driver = uc.Chrome(options=options)
return driver
Giải quyết reCAPTCHA v2 trong phiên ẩn
Bước 1: Điều hướng và giải nén sitekey
API_KEY = "YOUR_API_KEY"
def extract_recaptcha_sitekey(driver):
"""Extract reCAPTCHA v2 sitekey from the page."""
try:
element = driver.find_element("css selector", "[data-sitekey]")
return element.get_attribute("data-sitekey")
except Exception:
# Try finding in iframe src
iframes = driver.find_elements("css selector", "iframe[src*='recaptcha']")
for iframe in iframes:
src = iframe.get_attribute("src")
if "k=" in src:
return src.split("k=")[1].split("&")[0]
return None
Bước 2: Giải bằng CaptchaAI
def solve_recaptcha_v2(sitekey, pageurl):
"""Submit reCAPTCHA v2 to CaptchaAI and return the token."""
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": pageurl,
"json": 1
}).json()
if submit.get("status") != 1:
raise RuntimeError(f"Submit error: {submit.get('request')}")
task_id = submit["request"]
time.sleep(20)
for _ in range(30):
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
return result["request"]
if result.get("request") != "CAPCHA_NOT_READY":
raise RuntimeError(f"Solve error: {result['request']}")
time.sleep(5)
raise TimeoutError("Solve timed out")
Bước 3: Nhập mã thông báo và gửi
def inject_recaptcha_token(driver, token):
"""Inject the solved token into the page and submit."""
driver.execute_script(f'''
document.getElementById("g-recaptcha-response").innerHTML = "{token}";
document.getElementById("g-recaptcha-response").style.display = "block";
''')
# If there's a callback function, trigger it
driver.execute_script(f'''
if (typeof ___grecaptcha_cfg !== 'undefined') {{
var clients = ___grecaptcha_cfg.clients;
for (var key in clients) {{
var client = clients[key];
if (client && client.callback) {{
client.callback("{token}");
}}
}}
}}
''')
Hoàn tất quy trình làm việc: Đăng nhập bằng reCAPTCHA
import undetected_chromedriver as uc
import requests
import time
API_KEY = "YOUR_API_KEY"
def solve_recaptcha(sitekey, pageurl):
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY, "method": "userrecaptcha",
"googlekey": sitekey, "pageurl": pageurl, "json": 1
}).json()
if submit.get("status") != 1:
raise RuntimeError(f"Submit error: {submit.get('request')}")
task_id = submit["request"]
time.sleep(20)
for _ in range(30):
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
return result["request"]
if result.get("request") != "CAPCHA_NOT_READY":
raise RuntimeError(f"Solve error: {result['request']}")
time.sleep(5)
raise TimeoutError("Solve timed out")
def main():
driver = uc.Chrome()
try:
# Navigate to target page
driver.get("https://staging.example.com/qa-login")
time.sleep(3)
# Fill in form fields
driver.find_element("id", "username").send_keys("user")
driver.find_element("id", "password").send_keys("pass")
# Extract sitekey
element = driver.find_element("css selector", "[data-sitekey]")
sitekey = element.get_attribute("data-sitekey")
pageurl = driver.current_url
print(f"Sitekey: {sitekey}")
# Solve CAPTCHA
token = solve_recaptcha(sitekey, pageurl)
print(f"Token: {token[:50]}...")
# Inject token
driver.execute_script(
f'document.getElementById("g-recaptcha-response").innerHTML = "{token}";'
)
# Submit form
driver.find_element("id", "submit-btn").click()
time.sleep(3)
print(f"Current URL: {driver.current_url}")
finally:
driver.quit()
if __name__ == "__main__":
main()
Giải Cloudflare Turnstile
Đối với các trang web có tiện ích Cloudflare Turnstile, hãy trích xuất khóa trang web và giải quyết thông qua phương pháp Turnstile:
def solve_turnstile(sitekey, pageurl):
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY, "method": "turnstile",
"sitekey": sitekey, "pageurl": pageurl, "json": 1
}).json()
if submit.get("status") != 1:
raise RuntimeError(f"Submit error: {submit.get('request')}")
task_id = submit["request"]
time.sleep(10)
for _ in range(30):
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
return result["request"]
if result.get("request") != "CAPCHA_NOT_READY":
raise RuntimeError(f"Solve error: {result['request']}")
time.sleep(5)
raise TimeoutError("Solve timed out")
# Inject Turnstile token
def inject_turnstile_token(driver, token):
driver.execute_script(f'''
var input = document.querySelector('[name="cf-turnstile-response"]');
if (input) input.value = "{token}";
''')
Khắc phục sự cố
| Vấn đề | Nguyên nhân | Cách xử lý |
|---|---|---|
| Phiên bản Chrome không khớp | UC không thể tìm thấy trình điều khiển phù hợp | Cập nhật Chrome hoặc chỉ định version_main trong uc.Chrome() |
| CAPTCHA vẫn xuất hiện | Trang web sử dụng dấu vân tay nâng cao | Điều này được mong đợi – giải quyết bằng CaptchaAI |
| Việc tiêm mã thông báo không thành công | ID phần tử sai hoặc gọi lại | Kiểm tra việc triển khai reCAPTCHA của trang |
WebDriverException |
Chrome bị lỗi | Thêm --no-sandbox và --disable-dev-shm-usage |
Câu hỏi thường gặp
Tại sao nên sử dụng chromedriver không bị phát hiện với CaptchaAI?
Chromedriver không bị phát hiện làm giảm tín hiệu phát hiện bot để ít CAPTCHA xuất hiện hơn. Khi CAPTCHA vẫn kích hoạt, CaptchaAI sẽ giải quyết chúng. Sự kết hợp mang lại tỷ lệ thành công cao nhất.
Chromedriver không bị phát hiện có hoạt động ở chế độ headless không?
Có, nhưng chế độ headless có thể kích hoạt nhiều CAPTCHA hơn. Sử dụng options.add_argument("--headless=new") cho chế độ headless mới của Chrome.
Tôi có thể sử dụng cái này với Selenium Grid không?
Có, nhưng chromedriver không bị phát hiện cần vá tệp nhị phân của trình điều khiển cục bộ. Đối với các thiết lập phân tán, hãy vá trước trình điều khiển trên mỗi nút.
Điều gì sẽ xảy ra nếu trang web phát hiện ra tính năng tự động hóa mặc dù có UC?
Một số trang web sử dụng tính năng phát hiện nâng cao ngoài các bản vá UC. CaptchaAI xử lý CAPTCHA thu được bất kể phương pháp phát hiện nào.
Thêm CaptchaAI vào tự động hóa trình duyệt của bạn
Nhận khóa API của bạn tạicaptchaai.com. Kết hợp trình duyệt ẩn với giải pháp CAPTCHA đáng tin cậy.