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

Một trình duyệt tự host có thể điều hướng đến đúng trang nhưng vẫn để quy trình của bạn “mắc kẹt” tại CAPTCHA. Nếu bạn chạy Steel cục bộ, chỉ thêm cờ giải CAPTCHA của dịch vụ cloud là chưa đủ: bản local và bản cloud có khả năng khác nhau.
Hướng dẫn này cho thấy bước giải CAPTCHA nằm ở đâu trong Steel Browser tự host, với một kiểm tra kết nối Python nhỏ. Ví dụ dùng một trang phát triển cục bộ và public test key reCAPTCHA của Google. Nó không nhắm vào website bên thứ ba và không yêu cầu mô hình AI.
Steel Browser là một API trình duyệt cho lập trình viên xây agent web và ứng dụng tự động hóa. Nó quản lý một phiên trình duyệt mà client điều khiển được bằng các công cụ quen thuộc. Repo Steel chính thức mô tả cách tự host và cách kết nối từ Playwright, Puppeteer và Selenium.
Với một lập trình viên đang vận hành quy trình form đã được cấp quyền, việc phân chia công việc khá rõ ràng. Steel cung cấp trình duyệt. Playwright điều hướng và tương tác với trang. Trình giải CAPTCHA xử lý thử thách được hỗ trợ khi nó xuất hiện. Quy trình của bạn sau đó kiểm tra xem ứng dụng có chấp nhận hành động dự định hay không.
Hướng dẫn này dùng CapSolver Core SDK cho bước CAPTCHA. SDK có thể kiểm tra một trang Playwright và cung cấp một thao tác giải riêng. Không cần thêm LLM chỉ để nối các thành phần này.
Kịch bản hữu ích là một job trình duyệt tự host vốn đã cần bước CAPTCHA. Với việc test định kỳ phần mềm do bạn sở hữu, chế độ test của nhà cung cấp CAPTCHA có thể là đủ. Chỉ dùng đường giải CAPTCHA khi workflow được cấp quyền thực sự cần, thay vì để mọi điều hướng trình duyệt đều phụ thuộc vào một request trả phí.
Steel Local không bao gồm khả năng giải CAPTCHA tích hợp của sản phẩm cloud. Bảng so sánh local–cloud của Steel nêu rõ sự khác biệt giữa hai kiểu triển khai.
Khác biệt đó tác động đến cách triển khai. Hướng dẫn cloud có thể bật giải CAPTCHA ngay lúc tạo session, còn tích hợp tự host phải tự bổ sung thao tác bị thiếu. Đừng cho rằng một trường cấu hình cloud sẽ kích hoạt được tính năng tương ứng trên server local.
Luồng được dùng ở đây:
websocketUrl của session đó.Tránh khởi chạy một trình duyệt khác ở bước ba. Trình duyệt thứ hai sẽ không phải session do Steel trả về, khiến bạn dễ kiểm tra một trang trong khi job thật đang chờ ở trang khác.
Bắt đầu với một Steel Local chạy độc lập và Python 3.12. Thiết lập đã kiểm chứng dùng Steel API 0.5.3 tại revision repo 8362bbd, Playwright 1.64.0 và capsolver-core 0.1.1 trên macOS.
Làm theo hướng dẫn thiết lập local của repo cho môi trường của bạn. Với server chạy từ source dùng ở đây, API được khởi động với HOST=127.0.0.1, PORT=3300 và CDP_REDIRECT_PORT=9323. Đây là lựa chọn port cho môi trường test, không phải mặc định bắt buộc. Giữ API phát triển chỉ cho client dự kiến truy cập.
Cài đặt dependency Python trong một môi trường tách biệt:
python -m pip install "playwright==1.64.0" "capsolver-core==0.1.1" "httpx==0.28.1"
Steel khởi chạy trình duyệt, nên client này không mở thêm instance Chromium khác. Phương thức kết nối CDP của Playwright đính kèm vào một trình duyệt nền Chromium đã có sẵn và lộ ra default context của nó.
Client cũng cần truy cập được địa chỉ WebSocket trả về. Nếu Steel chạy trong container hoặc trên máy khác, hãy xác nhận địa chỉ đó truy cập được từ Python; 127.0.0.1 là máy thực hiện kết nối.
Kiểm tra phát hiện bên dưới không cần thông tin CapSolver. Giải CAPTCHA thực tế cần API key hợp lệ và tài nguyên tài khoản của bạn. Giải trả phí, điền lại token và việc ứng dụng chấp nhận không được thực thi trong hướng dẫn này. Hãy giữ bước kiểm chứng riêng đó trong checklist triển khai của bạn.
Script tạo một Steel session thật, kết nối tới trình duyệt của nó và đọc một widget phát triển bằng SDK chính thức. Lưu lại thành steel_sdk_check.py và chạy bằng Python.
Ví dụ mặc định dùng server local port 3300. Đặt STEEL_URL nếu server của bạn dùng địa chỉ khác. Hãy dùng instance riêng: việc tạo và giải phóng session sẽ thay đổi session trình duyệt đang hoạt động của instance đó.
Trang được cung cấp qua route của Playwright, nên không cần web server thật trên port 8765. Script widget của Google vẫn cần truy cập mạng. Public site key này được ghi trong tài liệu test reCAPTCHA của Google và chỉ dành cho phát triển, không cho production.
import asyncio
import json
import os
import httpx
from capsolver_core import create_capsolver
from playwright.async_api import async_playwright
STEEL_URL = os.environ.get("STEEL_URL", "http://127.0.0.1:3300")
TEST_URL = "http://127.0.0.1:8765/"
HTML = """<!doctype html><html><head><title>Steel CAPTCHA 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>"""
async def main():
async with httpx.AsyncClient(base_url=STEEL_URL, timeout=90) as api:
response = await api.post("/v1/sessions", json={"headless": True})
response.raise_for_status()
session = response.json()
try:
async with async_playwright() as playwright:
browser = await playwright.chromium.connect_over_cdp(session["websocketUrl"])
try:
context = browser.contexts[0]
page = await context.new_page()
await page.route(TEST_URL, lambda route: route.fulfill(
content_type="text/html", body=HTML))
await page.goto(TEST_URL)
await page.wait_for_function(
"() => !!window.___grecaptcha_cfg && "
"Object.keys(window.___grecaptcha_cfg.clients || {}).length > 0",
timeout=30000)
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({"session_id": session["id"],
"captcha_parameters": result}))
assert result and result[0]["type"] == "reCaptchaV2"
finally:
await browser.close()
finally:
released = await api.post(f"/v1/sessions/{session['id']}/release")
released.raise_for_status()
print(json.dumps({"released": released.json().get("success")}))
if __name__ == "__main__":
asyncio.run(main())
Lần chạy kiểm tra trả về một descriptor reCaptchaV2 với URL trang local và public test site key. Phản hồi release cuối cùng trả về true. Những quan sát này xác thực session Steel thật, kết nối CDP, truy cập page và đường đọc tham số của SDK.
Chúng không chứng minh rằng một CAPTCHA trả phí đã được giải. Development key không phải thử thách production, và script cố ý không yêu cầu token solution.
Mã giữ page trong context trình duyệt hiện có của Steel. Phần dọn dẹp đóng kết nối client và yêu cầu server giải phóng session ngay cả khi việc phát hiện thất bại. Nếu bạn chỉnh sửa nó cho dịch vụ dùng chung, hãy giao một thành phần chịu trách nhiệm vòng đời session thay vì để các job không liên quan giải phóng công việc của nhau.
Thêm lời gọi giải sau khi trang ứng dụng đã được cấp quyền của bạn tải CAPTCHA được hỗ trợ, trong khi kết nối trình duyệt và client SDK vẫn đang mở. Thay fixture phát triển cục bộ bằng workflow ứng dụng của bạn; đừng dùng test key làm input production.
Tạo client SDK với tùy chọn api_key theo tài liệu, nạp thông tin xác thực từ cấu hình bí mật đã được phê duyệt. CapSolver xử lý yêu cầu thử thách; Steel tiếp tục sở hữu phiên trình duyệt.
Dòng sau là lời gọi official browser-mode không đổi. Nó yêu cầu API key đã cấu hình, và việc thực thi trả phí qua kết nối Steel này không được kiểm thử trong hướng dẫn:
results = await cap.solve_on_page(page)
Giữ lời gọi bên trong context client còn sống. Đặt nó sau phần dọn dẹp của ví dụ sẽ tham chiếu tới trình duyệt và client đã đóng.
Kiểm tra từng kết quả trả về trước khi tiếp tục. SDK trả về error, một solution có thể có và trạng thái điền ngược thông qua filled. Kết quả rỗng hoặc thiếu solution không phải bằng chứng rằng ứng dụng của bạn đã vượt qua CAPTCHA.
Chế độ token của Core SDK hỗ trợ reCAPTCHA v2/v3 và Cloudflare Turnstile. Đừng cho rằng cùng một lời gọi sẽ giải mọi loại thử thách được liệt kê ở các phần khác trong API CapSolver rộng hơn. Tài liệu task reCAPTCHA v2 nêu yêu cầu cụ thể cho đường hỗ trợ đó.
Workflow chỉ hoàn tất khi ứng dụng đạt trạng thái dự định. Token response, trường đã được điền và việc gửi form thành công là những quan sát riêng biệt.
Với ứng dụng do bạn kiểm soát, hãy chọn một tín hiệu thành công cụ thể như thông báo xác nhận hoặc response mong đợi. Chờ tín hiệu đó sau hành động form bình thường. Nếu nó không xuất hiện, hãy kiểm tra response ứng dụng thay vì gửi lặp lại yêu cầu giải mà không hiểu nguyên nhân lỗi.
Giữ danh tính trang ổn định trong khi thao tác. Đừng điều hướng đi nơi khác, đóng tab hoặc giải phóng session khi một lần giải đang diễn ra. Nếu ứng dụng tải lại widget, hãy kiểm tra lại thử thách hiện tại thay vì dùng lại tham số từ trạng thái trang trước đó.
Thuật ngữ CAPTCHA giải thích khái niệm xác minh, còn hướng dẫn về token và cookie CAPTCHA giúp phân biệt các loại output. Cả cookie trình duyệt lẫn chuỗi token đều không nên thay thế bước kiểm tra thành công của ứng dụng.
Bắt đầu khắc phục tại thao tác thất bại sớm nhất để sự cố kết nối không biến thành yêu cầu giải không cần thiết.
| Triệu chứng | Cần kiểm tra gì |
|---|---|
| Tạo session thất bại | Xác nhận Steel API đang chạy và xem HTTP status cùng log server. |
| Kết nối CDP thất bại | Kiểm tra websocketUrl truy cập được từ tiến trình Python và thuộc về session hiện tại. |
| Widget không bao giờ khởi tạo | Kiểm tra trình duyệt có truy cập script phát triển của Google và xác nhận trang mong đợi đã được tải. |
| Phát hiện không trả descriptor nào | Kiểm tra trang hiện tại và loại CAPTCHA được hỗ trợ trước khi thử giải trả phí. |
| Có solution nhưng workflow bị treo | Kiểm tra bước điền ngược, hành động ứng dụng bình thường và response của ứng dụng. |
| Job khác mất session trình duyệt | Xem lại quyền sở hữu session và lời gọi release trước khi chia sẻ instance local. |
Giữ log chẩn đoán nhỏ gọn. Ghi lại giai đoạn và lỗi đã được che bớt, không lưu API key, token response hoặc toàn bộ storage trình duyệt. Hãy test một trang duy nhất trước, và chỉ thêm cơ chế retry sau khi xác định được lỗi tạm thời mà retry có thể khắc phục hợp lý.
Tích hợp Steel Local cần một điểm bàn giao rõ ràng từ trang trình duyệt được quản lý sang thao tác CAPTCHA. Kiểm tra kết nối đã chạy được chứng minh điểm bàn giao đó mà không tạo request trả phí. Trước khi dùng trong production, hãy kiểm chứng việc giải bằng thông tin xác thực của bạn và xác nhận kết quả ứng dụng trong môi trường đã được cấp quyền.
Giữ session mở cho đến khi hoàn thành công việc nó phụ trách, rồi giải phóng khi công việc kết thúc. Điều này cho bạn một ranh giới hữu ích cho cả khắc phục sự cố và nâng cấp package sau này.
Kết nối CapSolver tại bước CAPTCHA được hỗ trợ trong workflow Steel của bạn. Bắt đầu với đường phát hiện đã được xác minh, sau đó kiểm chứng thao tác có thông tin xác thực trước khi tăng tải công việc.
Thử CapSolver. Dùng mã thưởng CAP26 để nhận 5% bonus theo điều khoản chiến dịch.

Hỏi: Steel Browser tự host có tự động giải CAPTCHA không?
Không. So sánh chính thức của Steel không liệt kê tính năng giải CAPTCHA tích hợp cho Steel Local. Khả năng giải của bản cloud là một tính năng riêng.
Hỏi: Tôi có cần tài khoản Steel Cloud cho ví dụ này không?
Không. Ví dụ kết nối tới một instance local đang chạy. Bạn chịu trách nhiệm khởi động và vận hành instance đó.
Hỏi: Tại sao kết nối qua CDP thay vì khởi chạy Chromium của Playwright?
CDP gắn Python vào trình duyệt do Steel quản lý. Khởi chạy một trình duyệt khác sẽ tạo session riêng, khác với session mà ví dụ này muốn dùng.
Hỏi: Kiểm tra phát hiện có tốn credit CapSolver không?
Việc kiểm tra chỉ đọc các tham số của widget và không thực hiện yêu cầu giải có trả phí. Lời gọi giải riêng biệt yêu cầu thông tin xác thực CapSolver hợp lệ.
Hỏi: Luồng giải có trả phí đầy đủ đã được kiểm thử ở đây chưa?
Chưa. Lần chạy thực tế chỉ kiểm tra việc tạo phiên, kết nối CDP, phát hiện SDK và giải phóng. Việc giải có trả phí, điền dữ liệu ngược trở lại và ứng dụng chấp nhận vẫn cần một lần kiểm thử riêng với thông tin xác thực.
Hỏi: Đây có phải là quan hệ đối tác chính thức với Steel hoặc tích hợp gốc không?
Không. Đây là một ví dụ kết nối đã được kiểm thử, sử dụng giao diện trình duyệt công khai của Steel và SDK chính thức của CapSolver. Nó không thiết lập quan hệ đối tác hoặc bảo đảm khả năng tương thích cho các phiên bản trong tương lai.

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.
