
Anh Tuan
Data Science Expert
Đã xuất bản Oct 22, 2026
Đã cập nhật Oct 22, 2026 · đọc tối thiểu

Một script Patchright có thể điều hướng thành công, tìm được form rồi dừng lại ở widget reCAPTCHA. Thay thư viện trình duyệt không tự sinh ra đáp án mà widget và ứng dụng cần. Tại thời điểm đó bạn cần trình giải CAPTCHA, cộng với bước kiểm tra xem ứng dụng đã chấp nhận kết quả hay chưa.
Hướng dẫn trình giải CAPTCHA Patchright này kết nối một phiên trình duyệt Python với CapSolver thông qua Core SDK chính thức. Chi tiết quan trọng là môi trường JavaScript của trang: đọc DOM hiển thị và đọc cấu hình thuộc về trang của reCAPTCHA là hai thao tác khác nhau. Ví dụ dưới đây xử lý sự khác biệt đó, giữ nguyên một trang đang mở và xác minh việc phát hiện trên một fixture phát triển cục bộ. Chỉ dùng cách tiếp cận này cho những trang bạn sở hữu hoặc có quyền tự động hóa.
Patchright là một bản dẫn xuất do cộng đồng duy trì của Playwright với giao diện tự động hóa Python tương tự. Kho Python chính thức mô tả hỗ trợ Chromium và cách dùng nó như một import thay thế cho Playwright. Firefox và WebKit không được Patchright hỗ trợ.
Lập trình viên dùng Patchright để điều khiển trang, tương tác với phần tử và chạy các luồng công việc trên trình duyệt. Trình giải CAPTCHA trở nên quan trọng khi một CAPTCHA được hỗ trợ ngăn một luồng đã được ủy quyền hoàn thành form hoặc đạt được kết quả mong đợi. Nếu trang của bạn vốn đã truy cập được, không có lý do gì để gửi yêu cầu giải trả phí.
Tích hợp này có ba trách nhiệm tách biệt. Patchright phụ trách điều hướng và vòng đời trang. Trình giải đọc input thử thách được hỗ trợ và yêu cầu lời giải. Luồng công việc của ứng dụng quyết định liệu form hoặc trang tiếp theo thực sự đã thành công hay chưa. Bảng thuật ngữ CAPTCHA giải thích cơ chế xác minh đằng sau sự tách biệt này.
Đối với các lần test thường xuyên trên ứng dụng của riêng bạn, hãy ưu tiên thiết lập môi trường phát triển của nhà cung cấp CAPTCHA. Kiểm tra tích hợp với trình giải trả phí là một tác vụ tách biệt với việc test xem các kiểm tra form thông thường của bạn có hoạt động hay không.
Việc phát hiện reCAPTCHA có thể cần cấu hình do widget tạo trong môi trường JavaScript chính của trang. Tùy chọn evaluate() đã được ghi nhận của Patchright, isolated_context, mặc định là True; do đó các biến global JavaScript thuộc về trang có thể vắng mặt khỏi một lần evaluate thông thường ngay cả khi widget hiển thị.
Trong ví dụ có kiểm soát dùng cho hướng dẫn này, evaluate mặc định không thấy window.___grecaptcha_cfg, trong khi evaluate với isolated_context=False thì thấy. SDK cần truy cập vào trạng thái trang đó cho nhánh reCAPTCHA này. Vì vậy, một timeout hoặc kết quả phát hiện rỗng nên dẫn đến việc kiểm tra ngữ cảnh trước khi bạn đổi site key hoặc gửi lặp lại nhiều yêu cầu giải.
Adapter bên dưới chuyển tiếp các lần evaluate của SDK vào môi trường chính của trang. Nó không sửa file cài đặt của Patchright hay chuyển đổi môi trường cho mọi thao tác trình duyệt. Điều hướng và các locator thông thường vẫn dùng raw_page; chỉ đối tượng trang truyền vào SDK mới dùng wrapper này. Hãy coi nó là ví dụ tích hợp đã được kiểm thử cho những phiên bản liệt kê bên dưới, không phải tuyên bố về quan hệ đối tác chính thức với Patchright hay khả năng tương thích toàn diện.
Ví dụ dùng Python 3.12, Patchright 1.64.1 và capsolver-core 0.1.1. Cài đặt các gói trong môi trường cách ly và cài runtime Chromium của Patchright. Cố định các phiên bản này cho bước kiểm tra thiết lập để việc nâng cấp gói không âm thầm thay đổi hành vi.
python3 -m venv .venv
source .venv/bin/activate
python -m pip install "patchright==1.64.1" "capsolver-core==0.1.1"
python -m patchright install chromium
Ví dụ phát hiện không cần khóa API CapSolver. Việc giải thực tế yêu cầu khóa hợp lệ của riêng bạn và đủ tài nguyên tài khoản. Cấu hình client bằng tùy chọn create_capsolver(api_key=...) như đã ghi nhận và giữ khóa trong cấu hình bí mật của ứng dụng. Hướng dẫn Core SDK mô tả cách tạo client, phát hiện, giải và các trường kết quả.
Bước kiểm tra thiết lập bên dưới được chạy trên một trang cục bộ dùng reCAPTCHA test key công khai của Google. Việc giải trả phí, điền token ngược trở lại và việc ứng dụng chấp nhận token đã giải không được thực hiện trong hướng dẫn này. Đừng dùng fixture này làm bài test tỷ lệ thành công cho môi trường production.
Bước kiểm tra thiết lập mở một fixture cục bộ, chờ widget test khởi tạo và in ra các tham số CAPTCHA do SDK chính thức trả về. Lưu lại với tên patchright_sdk_check.py và chạy bằng Python trong môi trường trên.
URL cục bộ được phục vụ qua route của trình duyệt, nên không cần web server riêng. Script widget vẫn được tải từ Google và cần truy cập mạng. Site key công khai lấy từ hướng dẫn test reCAPTCHA của Google; đây là khóa dùng cho phát triển, không phải thông tin bí mật riêng tư.
import asyncio
import json
from capsolver_core import create_capsolver
from patchright.async_api import async_playwright
TEST_URL = "http://127.0.0.1:8765/"
HTML = """<!doctype html><html><head><title>CAPTCHA integration check</title></head>
<body><h1>Owned development page</h1>
<div class="g-recaptcha" data-sitekey="6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI"></div>
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
</body></html>"""
class MainWorldPage:
def __init__(self, page):
self._page = page
@property
def url(self):
return self._page.url
async def evaluate(self, expression, arg=None):
return await self._page.evaluate(expression, arg, isolated_context=False)
async def wait_for_selector(self, selector, **kwargs):
return await self._page.wait_for_selector(selector, **kwargs)
async def main():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True)
try:
raw_page = await browser.new_page()
await raw_page.route(
TEST_URL, lambda route: route.fulfill(content_type="text/html", body=HTML)
)
await raw_page.goto(TEST_URL)
page = MainWorldPage(raw_page)
for _ in range(60):
ready = await page.evaluate(
"() => !!window.___grecaptcha_cfg && "
"Object.keys(window.___grecaptcha_cfg.clients || {}).length > 0"
)
if ready:
break
await asyncio.sleep(0.5)
else:
raise RuntimeError("Test widget did not initialize")
async with create_capsolver() as cap:
infos = await cap.get_captcha_info(page)
result = [{"type": info.type.value, "url": info.website_url,
"site_key": info.website_key} for info in infos]
print(json.dumps({"captcha_parameters": result}))
assert result and result[0]["type"] == "reCaptchaV2"
finally:
await browser.close()
if __name__ == "__main__":
asyncio.run(main())
Lần chạy thành công trả về một mục với type reCaptchaV2, URL trang cục bộ và public test site key. Kết quả đó xác nhận Patchright đã mở trang và SDK có thể đọc widget đã khởi tạo thông qua adapter. Nó không chứa token đã giải và không chứng minh rằng một form production sẽ chấp nhận token đó.
Trình duyệt được đóng trong finally, kể cả khi việc tải widget hay phát hiện thất bại. Client SDK cũng thoát khỏi context bất đồng bộ của nó. Giữ phần dọn dẹp đó khi chuyển tích hợp vào script dài hơn, đặc biệt khi thử thách gây ra exception.
Nhập Mã Thưởng CapSolver Của Bạn
Tăng ngân sách tự động hóa ngay lập tức!
Dùng mã thưởng CAP26 khi nạp tiền vào tài khoản CapSolver để nhận thêm 5% tiền thưởng cho mỗi lần nạp — không giới hạn.
Hãy nhập ngay trong Bảng điều khiển CapSolver
Bước giải phải nằm bên trong context trình duyệt và SDK đang hoạt động, trước khi trang đóng hoặc điều hướng đi. Trên trang ứng dụng đã được ủy quyền của bạn, hãy tạo client SDK với khóa của bạn, bọc trang Patchright hiện tại như trên và dùng lời gọi browser-mode chính thức.
Dòng sau là lời gọi SDK chính thức, giữ nguyên. Nó yêu cầu API key đã cấu hình; việc thực thi trả phí với adapter Patchright này chưa được kiểm tra tại đây. Đặt nó khi cap và trang đã được bọc vẫn còn trong scope, thay vì chạy như script độc lập.
results = await cap.solve_on_page(page)
Kiểm tra các mục trả về trước khi tiếp tục. SDK cung cấp error, solution và filled để bạn phân biệt giữa lần thử thất bại, lời giải được trả về và việc điền token ngược trở lại trang. Đừng gửi form nếu lời giải bắt buộc còn thiếu hoặc kết quả liên quan báo lỗi.
Đối với reCAPTCHA v2, các tham số task chính thức giải thích mối quan hệ giữa URL trang, site key và loại task. Hãy xác nhận rằng thử thách được phát hiện khớp với trang dự kiến. Một key được copy từ môi trường khác hoặc từ trạng thái trang cũ không phải input hữu ích chỉ vì nó có đúng định dạng.
Thành công của ứng dụng là bước kiểm tra tách biệt sau khi giải và điền lại token. Luồng công việc của bạn có thể vẫn cần submit form hoặc chờ callback riêng của trang. Hướng dẫn xác minh phía server của Google giải thích vì sao ứng dụng phải tự xác thực phản hồi. Hãy định nghĩa tín hiệu thành công từ ứng dụng của riêng bạn, như thông báo xác nhận hoặc phần kết quả mong đợi, và dừng lại khi tín hiệu đó không xuất hiện.
Tránh coi phản hồi HTTP, chuỗi token hoặc filled=True là bằng chứng toàn bộ tác vụ trình duyệt đã thành công. Nếu trang từ chối phản hồi, hãy lưu một bản tóm tắt lỗi hữu ích và kiểm tra nguyên nhân trước khi thử lại. Hướng dẫn về token CAPTCHA và cookie cung cấp bối cảnh để diễn giải output của trình giải.
Quá trình khắc phục nên bắt đầu ở bước đầu tiên bị lỗi: tải trang, khởi tạo widget, truy cập ngữ cảnh, giải hay ứng dụng chấp nhận.
| Triệu chứng | Kiểm tra trước |
|---|---|
| Widget test không bao giờ khởi tạo | Xác nhận trình duyệt tải được script của Google và widget hiện diện trên đúng trang. |
| Widget hiển thị nhưng phát hiện rỗng | Xác nhận SDK nhận được trang đã bọc và truy cập môi trường chính hoạt động với phiên bản đã ghim. |
| SDK trả về lỗi | Đọc lỗi đã được ghi nhận, kiểm tra thông tin xác thực và input cho task, tránh lặp lại cùng yêu cầu không hợp lệ. |
| Có lời giải nhưng fill-back là false | Kiểm tra cách xử lý thử thách được hỗ trợ và trạng thái trang trước khi submit bất cứ thứ gì. |
| Fill-back thành công nhưng luồng công việc dừng lại | Kiểm tra action của form, hành vi callback và tín hiệu từ chối hoặc thành công của chính ứng dụng. |
Hãy bắt đầu với một trang và một lần thử. Chỉ thêm số lần retry có giới hạn sau khi bạn hiểu lỗi nào là tạm thời. Tái sử dụng kết quả trước đó sau khi điều hướng có thể gắn lời giải với trạng thái trang sai, trong khi retry mù quáng có thể chỉ làm tăng chi phí mà không sửa được vấn đề gốc.
Thay đổi Patchright và thay đổi SDK nên được kiểm thử cùng nhau trước khi nâng cấp job tự động. API quen thuộc không đảm bảo hành vi thực thi giống hệt cho mọi extension Playwright hoặc SDK. Giữ lại bài test phát hiện nhỏ như một bài kiểm tra khả năng tương thích, và chạy riêng bài kiểm tra solve + ứng dụng có xác thực trong môi trường của bạn trước khi dùng cho production.
Một tích hợp Patchright hữu ích kết nối trang trình duyệt hiện tại, task CAPTCHA được hỗ trợ và kết quả ứng dụng có thể quan sát. Hãy xác minh truy cập ngữ cảnh trang trước, sau đó xác nhận việc giải trả phí với thông tin xác thực của riêng bạn, và cuối cùng kiểm tra hành động trình duyệt dự định đã hoàn tất. Điều này giúp CapSolver tập trung vào bước CAPTCHA mà không giả định rằng mọi vấn đề điều hướng đều là thử thách nó có thể giải.
Hãy dùng thử CapSolver khi luồng Patchright đã được ủy quyền của bạn cần phản hồi CAPTCHA được hỗ trợ. Giữ cho việc giải phụ thuộc vào thử thách thực sự và xác minh kết quả trước khi mở rộng khối lượng công việc.
Hỏi: Patchright tự giải được reCAPTCHA không?
Không. Việc điều khiển trình duyệt không cung cấp token giải reCAPTCHA. Nếu trang đã được ủy quyền của bạn vẫn yêu cầu phản hồi CAPTCHA, hãy thêm bước giải được hỗ trợ hoặc dùng cấu hình test môi trường phát triển của ứng dụng.
Hỏi: Vì sao widget hiển thị nhưng kết quả phát hiện rỗng?
Script có thể đang đọc môi trường JavaScript khác với nơi widget khởi tạo cấu hình. Kiểm tra việc khởi tạo và khả năng truy cập môi trường chính trước khi cho rằng site key bị thiếu.
Hỏi: Đây có phải là tích hợp chính thức với Patchright không?
Không. Đây là ví dụ tích hợp dùng gói Patchright chính thức và CapSolver SDK. Adapter tùy chỉnh và script phát hiện đã được chạy với các phiên bản được liệt kê; việc giải trả phí chưa được kiểm thử.
Hỏi: Tôi có cần API key cho bước kiểm tra thiết lập cục bộ không?
Không. Bước kiểm tra thiết lập chỉ đọc các tham số của widget phát triển công khai. API key hợp lệ và tài nguyên tài khoản là bắt buộc cho lời gọi giải riêng.
Hỏi: Tôi có thể dùng Firefox hoặc WebKit với ví dụ này không?
Không. Tài liệu Patchright hỗ trợ cho các trình duyệt dựa trên Chromium. Ví dụ này khởi chạy môi trường thực thi Chromium của nó.
Hỏi: Việc điền lại token có nghĩa là biểu mẫu đã vượt qua xác minh không?
Không. Việc điền lại token và việc chấp nhận yêu cầu là hai kết quả riêng biệt. Hãy kiểm tra phản hồi của ứng dụng sau khi hoàn tất thao tác bắt buộc trước khi tiếp tục quy trình làm việc của bạn.

Anh Tuan
Data Science Expert
Turning task outcomes into actionable insights.
GIỚI THIỆU TÁC GIẢ
Học kiến trúc gỡ mã web Rust có thể mở rộng với reqwest, scraper, gỡ mã bất đồng bộ, gỡ mã trình duyệt không đầu, xoay proxy và xử lý CAPTCHA tuân thủ.

Tự động hóa việc giải CAPTCHA với Nanobot và CapSolver. Sử dụng Playwright để giải reCAPTCHA và Cloudflare tự động.
