Chuyển đến nội dung
SDK · Python · Node · .NET

Trình duyệt stealth cho Playwright & Puppeteer

Clearcote là Chromium, nên code automation bạn đang có vẫn tiếp tục chạy. Thay lệnh khởi chạy bằng launch() của SDK và bạn nhận lại một handle Playwright dùng như một Browser (trên profile dùng một lần, nên newContext() trả về chính context đó), chạy một bản build mà các cơ chế kiểm soát danh tính được biên dịch vào engine thay vì inject dưới dạng JavaScript.

Bản build mở không cần tài khoản. Bản build mới nhất miễn phí với GitHub cho một trình duyệt tại một thời điểm.

Đổi dòng khởi chạy, giữ nguyên mọi thứ khác

# pip install clearcote
from clearcote import launch

browser = launch(fingerprint="account-42", light_stealth=True)
page = browser.new_page()
page.goto("https://example.com")
browser.close()

Điểm nổi bật

Chuyển đổi chỉ với một dòng

launch() trả về một handle Playwright trên profile dùng một lần, nên selector và page object giữ nguyên; newContext() của nó trả về chính context đó, nên hãy truyền ephemeralProfile: false khi bạn cần các context tách biệt. Puppeteer kết nối vào CDP endpoint của serve() bằng puppeteer.connect.

Binary đã xác minh, được tải sẵn cho bạn

Ở lần dùng đầu tiên, SDK tải bản build tương ứng và kiểm tra SHA-256 của nó: bản build mở được đối chiếu với các hash có sẵn trong SDK, bản build có giấy phép được đối chiếu với hash mà lượt tải trả về. Tính năng tự động cập nhật (bật khi cần, chỉ cho bản build mở) kiểm tra bản phát hành mới nhất với các checksum đã công bố, và cả chữ ký GPG của chúng nếu máy có cài gpg.

Danh tính dưới dạng tùy chọn có tên

fingerprint, platform, brand, timezone, acceptLanguage, proxy và geoip là các tham số, không phải những switch phải nhớ. Một seed giữ danh tính ổn định qua các lần chạy.

Mặc định nhất quán

Khi chạy headed, viewport giả lập được bỏ qua để kích thước trang khớp với cửa sổ thật, WebRTC giữ kín địa chỉ máy của bạn, và QUIC được tắt khi đi qua proxy để không có gói UDP nào đi vòng qua proxy.

Humanized input, chỉ một flag

humanize: true gửi click, gõ phím, kéo thả và cuộn dưới dạng input native trusted theo đường cong, với navigator.webdriver vẫn là false.

Ba ngôn ngữ

Python (sync và async), Node và .NET, trên PyPI, npm và NuGet. .NET cũng có geoip, và humanized input dưới dạng các lệnh gọi tường minh kiểu HumanClickAsync; profile đã lưu, kiểm tra tính nhất quán khi render, Widevine và các helper cho agent hiện chỉ có ở Python và Node.

SDK làm gì cho bạn

Package này bọc binary Clearcote để các tùy chọn danh tính trở thành tham số có tên. Nó xác định trình duyệt theo một thứ tự cố định (đường dẫn chỉ định rõ, biến môi trường CLEARCOTE_BINARY, version mà bạn yêu cầu, bản build có giấy phép mới nhất khi tìm thấy khóa giấy phép, sau cùng là bản build mở được ghim trong SDK), xác minh và cache nó, khởi chạy qua Playwright, rồi trả về đúng những object mà code của bạn đang dùng.

Vì các cơ chế kiểm soát nằm trong engine C++, không có plugin stealth nào phải nạp và không có gì bị inject vào trang. Plugin vá các thuộc tính bằng JavaScript, và một getter bị vá có thể phân biệt được với getter native. Ở đây getter chính là getter native, trong main frame, trong iframe và trong worker. Bài Cơ chế phát hiện hoạt động ra sao giải thích vì sao điều đó quan trọng.

Có hai điểm hoạt động khác với Chromium gốc, và cả hai đều có chủ đích. Event console và page-error không được chuyển tiếp tới automation client, vì chính việc chuyển tiếp đó là thứ mà các probe dò automation đo được; hãy thu thập chúng trong trang rồi đọc lại bằng page.evaluate(). Ngoài ra, trên bản build có giấy phép (miễn phí với GitHub), proxy SOCKS5 có username và password dùng được trực tiếp, với thông tin xác thực truyền qua hai trường username và password riêng biệt, vì engine đã hiện thực cơ chế xác thực mà Chromium gốc còn thiếu. Bản build mở không thể xác thực với proxy SOCKS5.

Plugin stealth so với trình duyệt can thiệp ở cấp engine

Plugin stealth JavaScript
Clearcote
Thay đổi nằm ở đâu
Script được inject vào mọi trang và mọi frame
Được biên dịch vào engine Chromium
Kiểm tra hàm native
Getter bị vá, khi chuyển thành chuỗi, lộ ra mã nguồn của chính nó
Getter là native code, nên trả về [native code]
Worker và iframe
Mỗi realm phải được vá lại, và những chỗ hổng lộ ra
Cùng giá trị ở mọi nơi, từ một engine duy nhất
TLS và HTTP/2
Trình duyệt bên dưới gửi gì thì nhận nấy
Handshake Chrome của chính engine, khớp với phiên bản mà persona báo cáo
Thiết lập
Một plugin, các evasion của nó và tùy chọn của từng evasion
Một lệnh gọi launch()

Plugin stealth mã nguồn mở là bước khởi đầu hợp lý, và nhiều dự án bắt đầu từ đó. Xem bài so sánh với puppeteer-extra-plugin-stealth để có bức tranh đầy đủ hơn.

Mọi người dùng nó để làm gì

Scraping và thu thập dữ liệu

Giữ nguyên crawler Playwright hay Puppeteer hiện có và chỉ thay phần nằm bên dưới.

Test end-to-end trên trang thật

Test các luồng trên những site đối xử với Chromium chạy automation thông thường khác với một trình duyệt bình thường.

Chuyển đổi một test suite có sẵn

Selector và page object giữ nguyên, chỉ có lệnh khởi chạy thay đổi. Fixture mở context mới cho mỗi test cần ephemeralProfile: false, vì newContext() của launch() trả về context profile duy nhất của nó.

Nghiên cứu fingerprinting

Chạy cùng một script khi có và không có persona, rồi so sánh những gì trang đo được.

Clearcote được xây dựng cho quyền riêng tư, kiểm thử, nghiên cứu và tự động hóa hợp pháp. Bạn chịu trách nhiệm về cách mình sử dụng nó và về việc tuân thủ điều khoản của các trang web bạn truy cập.

Gói nào có tính năng này

SDK có ở cả ba gói, và gần như toàn bộ tùy chọn danh tính cũng vậy (số ít tùy chọn cần bản build có giấy phép được đánh dấu trong danh sách flag fingerprint). Không có khóa, SDK chạy bản build mở. Có khóa giấy phép (miễn phí với tài khoản GitHub), SDK chạy bản build mới nhất, kèm các tính năng bổ sung chỉ dành cho bản có giấy phép được liệt kê trên trang bảng giá.

So sánh các gói

Câu hỏi thường gặp

Có thực sự thay thế trực tiếp (drop-in) được không?

Gần như hoàn toàn. launch() đồng bộ của Python và Node trả về một handle giống browser trên một profile dùng một lần: newPage() và mọi thứ sau đó hoạt động như trước, nhưng newContext() trả về chính context đó, nên code cần các context tách biệt nên truyền ephemeralProfile: false hoặc khởi chạy mỗi context một trình duyệt. launchPersistentContext() trả về một BrowserContext chuẩn. Puppeteer kết nối vào CDP endpoint của serve() bằng puppeteer.connect, còn .NET SDK trả về các object Microsoft.Playwright chuẩn (IBrowserContext từ LaunchEphemeralProfileAsync, IBrowser từ LaunchAsync).

Có còn cần puppeteer-extra-plugin-stealth hay playwright-stealth không?

Không, và tốt nhất là đừng thêm. Những plugin đó vá giá trị bằng JavaScript được inject vào, và chính việc vá có thể bị nhận ra. Clearcote đặt các giá trị trong engine, nên không còn gì để plugin vá nữa.

Nó có chạy được ở chế độ headless không?

Có. Nhưng ở nơi bạn chạy được headed thì đó vẫn là lựa chọn mặc định an toàn hơn, vì chế độ headless có những dấu hiệu riêng. Trong container, Docker image chính thức mặc định chạy headed trên một màn hình ảo.

Hỗ trợ những ngôn ngữ nào?

Python (API sync và async), Node.js và .NET. Cả ba đều có khớp geoip và humanized input (một flag khởi chạy trong Python và Node, các lệnh gọi tường minh kiểu HumanClickAsync trong .NET). Profile đã lưu, kiểm tra tính nhất quán khi render, Widevine và agent trong trình duyệt hiện chỉ có ở Python và Node.

Làm sao giữ cùng một danh tính giữa các lần chạy?

Dùng lại cùng một seed fingerprint, và dùng launchPersistentContext với một thư mục user-data để cookie và storage được giữ lại. Suy ra seed từ id tài khoản hoặc id tenant của chính bạn giúp nó tái lập được. Xem danh tính lâu dài.

Tìm hiểu sâu hơn trong tài liệu

Tính năng liên quan

Dùng thử Clearcote

Thay thế drop-in cho Playwright & Puppeteer, nhất quán đến tận TLS handshake, với một bản build mã nguồn mở để bắt đầu.

Miễn phí cho một trình duyệt với GitHub. Không cần thẻ.