🎯 Trình duyệt đám mây tùy chỉnh, chống phát hiện được hỗ trợ bởi Chromium tự phát triển, thiết kế dành cho trình thu thập dữ liệu webtác nhân AI. 👉Dùng thử ngay
Quay lại blog

Chrome Remote Debugging: Cài đặt CDP, Bảo mật & Tự động hóa

Alex Johnson
Alex Johnson

Senior Web Scraping Engineer

06-Aug-2026

TL;DR:

  • Gỡ lỗi từ xa của Chrome mở ra một trình duyệt Chromium đang chạy thông qua Giao thức DevTools của Chrome. Các khách hàng có thể kiểm tra các mục tiêu, gửi lệnh, nhận sự kiện và đính kèm thư viện tự động mà không cần khởi động trình duyệt.
  • /json/version xác định điểm cuối WebSocket cấp trình duyệt. /json/json/list liệt kê các mục tiêu trang, mỗi mục tiêu đều có webSocketDebuggerUrl riêng của nó.
  • Cổng 9222 là giao diện điều khiển, không phải là cổng ứng dụng công cộng. Liên kết nó với loopback, sử dụng thư mục dữ liệu người dùng cô lập và không bao giờ gán nó với một hồ sơ hàng ngày thực sự.
  • Chrome hiện tại yêu cầu một hồ sơ không mặc định cho các công tắc gỡ lỗi từ xa. Chrome 136 và mới hơn bỏ qua các công tắc này đối với thư mục dữ liệu Chrome mặc định như một biện pháp bảo mật.
  • Puppeteer và Playwright có thể gán vào một phiên Chromium hiện có qua CDP. Puppeteer chấp nhận một URL trình duyệt hoặc điểm cuối WebSocket; Playwright cung cấp chromium.connectOverCDP() với kết nối độ trung thực thấp hơn so với giao thức gốc của nó.
  • Cloud CDP loại bỏ các hoạt động trình duyệt cục bộ khỏi máy khách. Trình duyệt Gỡ lỗi Không Tì Vết tạo ra một phiên xa cách biệt và trả về một điểm cuối WebSocket cho Puppeteer hoặc Playwright.
  • Miễn phí để bắt đầu. Các tài khoản Scrapeless mới bao gồm thời gian chạy Trình duyệt Gỡ lỗi Không Tì Vết miễn phí — đăng ký tại app.scrapeless.com.

Giới thiệu: một ổ cắm gỡ lỗi có thể điều khiển toàn bộ trình duyệt

Gỡ lỗi từ xa của Chrome biến một phiên bản Chromium đang chạy thành một mục tiêu có thể lập trình. DevTools, Puppeteer, Playwright, các tích hợp IDE và các khách hàng CDP tùy chỉnh có thể gán vào cùng một bề mặt giao thức để kiểm tra các trang, đánh giá JavaScript, theo dõi các sự kiện mạng và điều khiển các hành động của trình duyệt.

Quyền lực đó tạo ra một ranh giới bảo mật. Một khách hàng có điểm cuối WebSocket trình duyệt có thể tiếp cận các tên miền cấp trình duyệt và phát hiện các mục tiêu trang. Điểm cuối nên được coi là một thông tin xác thực đặc quyền tồn tại ngắn hạn, ngay cả khi nó chỉ lắng nghe trên một máy phát triển.

Hướng dẫn này khởi động một phiên Chrome cục bộ cô lập, kiểm tra các điểm cuối phát hiện JSON của nó, gán Puppeteer và Playwright, đề cập đến chuyển tiếp Android và sau đó so sánh quản lý cổng cục bộ với một phiên Trình duyệt Gỡ lỗi Không Tì Vết cách biệt.


Gỡ Lỗi Từ Xa Của Chrome Là Gì?

Gỡ lỗi từ xa của Chrome là một phương thức truyền tải mở ra việc kiểm định Chromium thông qua Giao thức DevTools của Chrome, hay CDP. CDP được tổ chức thành các miền như Browser, Page, Runtime, Network, DOM, và Target; một khách hàng gửi các lệnh JSON và nhận các sự kiện JSON qua WebSocket.

Tài liệu tham khảo Giao thức DevTools của Chrome chính thức định nghĩa các miền giao thức và các điểm cuối phát hiện HTTP có sẵn khi Chrome khởi động với một cổng gỡ lỗi từ xa.

Giao thức có hai cấp độ điểm cuối hữu ích:

  • Điểm cuối trình duyệt. URL kết thúc bằng /devtools/browser/<id> và có thể phát hiện hoặc quản lý các mục tiêu trong suốt quá trình trình duyệt.
  • Điểm cuối trang. URL kết thúc bằng /devtools/page/<id> và điều khiển một tab hoặc một mục tiêu trang giống như khác.

Các ID mờ đục thay đổi theo quá trình trình duyệt và vòng đời mục tiêu. Phát hiện chúng trong thời gian thực thay vì xây dựng chúng.


Bảo Mật Đến Trước Cài Đặt

Gỡ lỗi từ xa của Chrome nên được liên kết với loopback và kết hợp với một hồ sơ dùng một lần. Việc mở cổng ra một mạng LAN, lối vào container, đường hầm, hoặc giao diện công cộng cho phép một khách hàng khác tiếp cận vào bề mặt điều khiển trình duyệt có đặc quyền.

Chrome đã thay đổi hành vi của các công tắc gỡ lỗi từ xa trong phiên bản 136. Cập nhật bảo mật gỡ lỗi từ xa của Chrome cho biết rằng --remote-debugging-port--remote-debugging-pipe bị bỏ qua khi chúng nhắm vào thư mục dữ liệu Chrome mặc định; một --user-data-dir không chuẩn bây giờ được yêu cầu.

Áp dụng các điều khiển này:

  • liên kết người lắng nghe với 127.0.0.1;
  • tạo một --user-data-dir tạm thời cho phiên gỡ lỗi;
  • không bao giờ sử dụng một hồ sơ chứa cookie cá nhân, mật khẩu đã lưu, dữ liệu thanh toán, hoặc tài khoản đang hoạt động;
  • không đặt URL WebSocket trình duyệt vào nhật ký, vé, ảnh chụp màn hình, hoặc cấu hình chia sẻ;
  • chạy trình duyệt dưới một tài khoản OS có đặc quyền thấp;
  • đặt tự động hóa từ xa phía sau cơ sở hạ tầng được xác thực thay vì phát hành cổng 9222;
  • đóng trình duyệt và xóa hồ sơ tạm thời sau khi hoàn thành nhiệm vụ.

Chrome cho Testing là nhị phân tự động hóa cục bộ tốt hơn khi một quy trình xây dựng cần một trình duyệt có thể tái tạo thay vì kênh Chrome được cài đặt của một nhà phát triển.


Các Điều Kiện Tiên Quyết

Các ví dụ địa phương yêu cầu Chrome hoặc Chrome để Kiểm thử, Node.js và hai khách hàng CDP.

  • Một bản dựng hiện tại của Chrome hoặc Chrome để Kiểm thử.
  • Một phiên bản Node.js được duy trì.
  • curljq để kiểm tra các điểm cuối phát hiện.
  • puppeteer-coreplaywright-core cho các ví dụ đính kèm.
  • @scrapeless-ai/sdk cho ví dụ phiên đám mây.
  • Một thư mục tạm thời không chứa dữ liệu hồ sơ người dùng thực.
  • Một khóa API Scrapeless chỉ cho phần phiên đám mây.

Cài đặt các gói trong một dự án tách biệt:

bash Copy
npm install puppeteer-core playwright-core @scrapeless-ai/sdk

Dự án xác minh địa phương đã cài đặt puppeteer-core 25.5.0, playwright-core 1.62.1 và @scrapeless-ai/sdk 1.11.0. Các phiên bản gói di chuyển độc lập, vì vậy hãy cố định chúng trong môi trường sản xuất sau khi bài kiểm tra đính kèm thành công cho kênh Chrome của dự án.


Khởi động Chrome với một Hồ sơ Gỡ lỗi Tách biệt

Khởi động một quy trình Chrome riêng biệt với một trình lắng nghe vòng lặp và một thư mục dữ liệu người dùng mới. Lệnh macOS bên dưới chạy ở chế độ không đầu (headless) nên phiên làm việc dễ dàng được kiểm tra từ một terminal.

bash Copy
DEBUG_PROFILE="$(mktemp -d)"

"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
  --headless=new \
  --remote-debugging-address=127.0.0.1 \
  --remote-debugging-port=9222 \
  --user-data-dir="${DEBUG_PROFILE}" \
  about:blank

Trên Linux, thay thế đường dẫn thực thi bằng google-chrome đã cài đặt hoặc nhị phân Chrome để Kiểm thử. Trên Windows, gọi chrome.exe từ PowerShell và truyền bốn cờ giống nhau dưới dạng các đối số tách biệt.

Giữ open terminal này. Chrome sở hữu trình lắng nghe gỡ lỗi trong suốt thời gian của quy trình.


Kiểm tra /json/version/json/list

Chrome phơi bày siêu dữ liệu trình duyệt và phát hiện mục tiêu trên cùng một cổng vòng lặp. /json/version trả về điểm cuối WebSocket cấp trình duyệt; /json/json/list trả về các mục tiêu có sẵn.

bash Copy
curl --fail --silent http://127.0.0.1:9222/json/version \
  | jq '{Browser, "Protocol-Version", webSocketDebuggerUrl}'

curl --fail --silent http://127.0.0.1:9222/json/list \
  | jq 'map({id, type, title, url, webSocketDebuggerUrl})'

Phản hồi của trình duyệt chứa Browser, Protocol-Version, User-Agent, siêu dữ liệu engine và webSocketDebuggerUrl. Một bản ghi danh sách mục tiêu chứa các trường như id, type, title, url, và webSocketDebuggerUrl cấp trang của nó.

Không công bố URL WebSocket nào. ID đường dẫn không thay thế kiểm soát truy cập mạng hoặc xác thực.


Kết nối Puppeteer với Trình duyệt Hiện có

Puppeteer có thể phát hiện điểm cuối WebSocket từ URL trình duyệt địa phương và đính kèm mà không cần khởi động một quy trình Chrome khác. Tham chiếu điểm cuối trình duyệt Puppeteer ánh xạ webSocketDebuggerUrl trong /json/version tới Puppeteer.connect().

javascript Copy
import puppeteer from "puppeteer-core";

const browser = await puppeteer.connect({
  browserURL: "http://127.0.0.1:9222",
});

const pages = await browser.pages();
console.log({
  browser: await browser.version(),
  pageCount: pages.length,
  firstPageUrl: pages[0]?.url() ?? null,
});

browser.disconnect();

Sử dụng browser.disconnect() khi khách hàng nên ngắt kết nối trong khi Chrome tiếp tục chạy. browser.close() yêu cầu quy trình trình duyệt từ xa tắt.


Kết nối Playwright qua CDP

Playwright gắn kết với một trình duyệt Chromium hiện có thông qua chromium.connectOverCDP(). Phương pháp này chấp nhận hoặc là URL phát hiện HTTP hoặc điểm cuối WebSocket trình duyệt.

javascript Copy
import { chromium } from "playwright-core";

const browser = await chromium.connectOverCDP("http://127.0.0.1:9222");
const contexts = browser.contexts();
const pages = contexts.flatMap((context) => context.pages());

console.log({
  contextCount: contexts.length,
  pageCount: pages.length,
  firstPageUrl: pages[0]?.url() ?? null,
});

await browser.close();

Playwright tài liệu gắn kết CDP có độ chính xác thấp hơn so với giao thức Playwright gốc của nó. Gắn kết CDP chỉ dành cho Chromium là phù hợp khi trình duyệt đã tồn tại hoặc một nhà cung cấp từ xa phơi bày CDP; các tính năng Playwright nâng cao nên được kiểm tra theo hợp đồng trình duyệt từ xa chính xác.

Nhận khóa API của bạn trên kế hoạch miễn phí: app.scrapeless.com


Gỡ lỗi Từ xa trên Android

Chrome trên Android phơi bày ổ cắm gỡ lỗi của nó qua ADB forwarding thay vì một trình lắng nghe TCP công cộng. Kích hoạt tùy chọn nhà phát triển và gỡ lỗi USB, kết nối thiết bị, chấp nhận lời nhắc ủy quyền thiết bị, và mở Chrome trên thiết bị.

Lưu ý: Khối này yêu cầu một thiết bị Android với gỡ lỗi USB được kích hoạt; các lệnh vẫn là yêu cầu phần cứng trong sổ sách xác minh.

bash Copy
adb devices -l
adb forward tcp:9222 localabstract:chrome_devtools_remote
curl --fail --silent http://127.0.0.1:9222/json/version | jq .
curl --fail --silent http://127.0.0.1:9222/json/list | jq .

Hướng dẫn gỡ lỗi từ xa trên Chrome Android sử dụng mô hình chuyển tiếp ổ cắm này. chrome://inspect/#devices cung cấp quy trình làm việc DevTools hình ảnh, trong khi các điểm cuối JSON được chuyển tiếp hỗ trợ một khách hàng CDP trực tiếp.

Gỡ bỏ quy tắc chuyển tiếp và vô hiệu hóa gỡ lỗi USB khi thiết bị không còn trong bài kiểm tra.


Đối xử với Điểm cuối CDP như một Thông tin Đặc quyền

Một điểm cuối CDP có thể phơi bày nội dung trang, trạng thái trình duyệt, cookies có sẵn cho hồ sơ gỡ lỗi, hoạt động mạng và thực thi JavaScript. Thiết kế an toàn nhất là làm cho điểm cuối chỉ sống ngắn, riêng tư và cụ thể cho một tác vụ tách biệt.

Tránh những mô hình này:

  • --remote-debugging-address=0.0.0.0 trên một workstation hoặc server;
  • một quy tắc tường lửa phơi bày cổng 9222 ra internet;
  • chia sẻ SSH hoặc tunnel mà không có xác thực và chính sách đích nghiêm ngặt;
  • gắn kết với hồ sơ Chrome hàng ngày mặc định;
  • tái sử dụng một hồ sơ gỡ lỗi giữa các người dùng hoặc chủ sở hữu;
  • lưu trữ các URL WebSocket của trình duyệt trong nhật ký vĩnh viễn;
  • chấp nhận một URL WebSocket do một trang hoặc người dùng không tin cậy cung cấp mà không có danh sách cho phép tên miền của nó.
    Đối với tự động hóa nhóm, hãy đặt việc tạo session sau một kế hoạch kiểm soát đã được xác thực. Worker chỉ nên nhận được endpoint cho session cách ly của riêng nó, và kế hoạch kiểm soát nên thực thi thời gian sống, khu vực, quyền sở hữu và độ đồng thời.

Chuyển Từ Một Cổng Địa Phương Sang Trình Duyệt Thu Scraping Không Lỗi

Trình Duyệt Thu Scraping Không Lỗi thay thế quy trình Chrome địa phương và cổng TCP được lộ ra bằng một session trình duyệt đám mây cách ly. SDK hiện tại xây dựng một browserWSEndpoint cụ thể cho session, và Puppeteer hoặc Playwright kết nối tới endpoint đó qua CDP.

SDK giữ việc tạo session tách biệt khỏi client CDP:

Lưu ý: Bước đính kèm yêu cầu một SCRAPELESS_API_KEY thuộc về người đọc; việc xây dựng SDK và tạo endpoint đã được xác minh cục bộ, trong khi kết nối đám mây trực tiếp vẫn là một yêu cầu ủy quyền.

javascript Copy
import { Scrapeless } from "@scrapeless-ai/sdk";
import { chromium } from "playwright-core";

const client = new Scrapeless({
  apiKey: process.env.SCRAPELESS_API_KEY,
});

const { browserWSEndpoint } = client.browser.create({
  sessionName: "cdp-guide",
  sessionTTL: 180,
  proxyCountry: "US",
});

const browser = await chromium.connectOverCDP(browserWSEndpoint);
const context = browser.contexts()[0];
const page = context.pages()[0] ?? await context.newPage();

await page.goto("https://example.com", {
  waitUntil: "domcontentloaded",
});
console.log({ title: await page.title(), url: page.url() });

await browser.close();

Endpoint là một thông tin xác thực của session. Giữ nó bên trong quy trình, đóng trình duyệt khi nhiệm vụ kết thúc, và tạo một session riêng cho mỗi worker hoặc người thuê độc lập.

Đối với một quy trình khám phá trang kết nối Playwright tới một endpoint CDP đám mây, hãy xem phương pháp khám phá liên kết đã được hiển thị. Tài liệu Trình Duyệt Thu Scraping chứa các tùy chọn kết nối và session hiện tại.


Chẩn Đoán Vấn Đề Kết Nối

Các lỗi gỡ lỗi từ xa của Chrome trở nên dễ dàng hơn để phân lập khi các kiểm tra theo các lớp kết nối.

Triệu Chứng Lớp Có Khả Năng Kiểm Tra
Cổng bị đóng Khởi chạy Trình Duyệt Xác nhận quy trình, đường dẫn thực thi, cờ, và thư mục dữ liệu người dùng cách ly
/json/version không có sẵn Listener hoặc địa chỉ Xác nhận địa chỉ loopback và quyền sở hữu cổng
Endpoint trình duyệt tồn tại nhưng các mục tiêu thì trống Vòng đời mục tiêu Mở một trang và kiểm tra /json/list
Puppeteer không thể gắn kết Client hoặc endpoint Xác nhận browserURL hoặc sử dụng URL WebSocket của trình duyệt từ /json/version
Playwright gắn kết với những tính năng thiếu Độ trung thành của giao thức Kiểm tra API cần thiết chống lại CDP và so sánh với kết nối gốc của Playwright
Danh sách Android trống Ủy quyền ADB Xác nhận gỡ lỗi USB, phê duyệt thiết bị, trạng thái Chrome, và chuyển tiếp socket
Endpoint đám mây bị từ chối Cấu hình session Xác nhận khóa API, thời gian sống endpoint, và URL được tạo ra bởi SDK vẫn nguyên vẹn

Kiểm tra endpoint khám phá trước khi gỡ lỗi mã ứng dụng. Nếu /json/version không xác định đúng trình duyệt mong đợi, một thay đổi ở mức thư viện không thể sửa chữa listener hoặc cài đặt hồ sơ.


Kết Luận: cách ly trình duyệt trước khi bạn tự động hóa nó

Gỡ lỗi từ xa của Chrome là một kênh điều khiển có quyền cao được xây dựng trên CDP. Bắt đầu Chrome với một listener loopback và hồ sơ có thể tái sử dụng, khám phá endpoint trình duyệt từ /json/version, liệt kê các mục tiêu trang thông qua /json/list, và chỉ đính kèm các client đáng tin cậy.

Sử dụng CDP địa phương cho phát triển và môi trường thử nghiệm hạn chế. Sử dụng một kế hoạch kiểm soát trình duyệt đám mây đã được xác thực khi các nhóm cần các session cách ly, quản lý vòng đời, định tuyến khu vực, hoặc người lao động từ xa mà không cần mở cổng trạm làm việc. Trang giá cả Scrapeless cung cấp con đường hiện tại cho runtime Trình Duyệt Thu Scraping.


Sẵn Sàng Chuyển Quy Trình CDP Của Bạn Sang Một Session Đám Mây Cách Ly?

Tham gia cộng đồng của chúng tôi để nhận một kế hoạch miễn phí và kết nối với các nhà phát triển xây dựng quy trình tự động hóa trình duyệt an toàn: Discord · Telegram.

Đăng ký tại app.scrapeless.com để nhận runtime Trình Duyệt Thu Scraping miễn phí và kết nối Puppeteer hoặc Playwright với một endpoint CDP đám mây có thời gian sống ngắn.


Câu Hỏi Thường Gặp

Q: Gỡ lỗi từ xa của Chrome có an toàn không?

Gỡ lỗi từ xa của Chrome chỉ an toàn khi endpoint là riêng tư, có thời gian sống ngắn, và được gắn kết với một hồ sơ cách ly. Gắn kết với loopback, sử dụng một thư mục dữ liệu người dùng không mặc định, bảo vệ URL WebSocket, và không bao giờ lộ cổng 9222 ra công khai.

Q: Việc thu thập dữ liệu qua CDP có hợp pháp không?

CDP là một giao thức điều khiển trình duyệt; tính hợp pháp phụ thuộc vào dữ liệu mục tiêu, phương pháp truy cập, quyền tài phán, điều khoản và cách sử dụng. Giới hạn thu thập chỉ cho dữ liệu công cộng hoặc được ủy quyền, tôn trọng quy tắc của trang web và các điều khiển truy cập, giảm thiểu dữ liệu cá nhân, và tham khảo ý kiến luật sư cho các dự án có rủi ro cao.

Q: Tôi có cần một proxy cho gỡ lỗi từ xa của Chrome không?
Local CDP không yêu cầu một proxy, nhưng một mục tiêu có thể cần một đường mạng khu vực được phép. Scrapeless Scraping Browser có thể tạo phiên làm việc từ xa với một quốc gia proxy đã được tài liệu hóa để client CDP không vận hành một lớp proxy riêng biệt.

Q: Tôi nên làm gì khi trang hiển thị màn hình xác thực lưu lượng?

Giữ mục tiêu và trang chủ của nó trong một phiên được ủy quyền, gắn quốc gia cần thiết, tải trang chủ trước, và sau đó điều hướng đến trang mục tiêu công khai. Xác nhận tiêu đề hiển thị trước khi trích xuất và dừng lại nếu trang yêu cầu quyền truy cập riêng tư hoặc một hành động ngoài chính sách dự án.

Q: Điều gì xảy ra khi DOM hoặc các bộ chọn thay đổi?

Kiểm tra lại trang đã được hiển thị và thắt chặt các bộ chọn quanh các thuộc tính ổn định, tên truy cập được hoặc mẫu URL bền vững. Đối xử với các trường thiếu như có thể null cho đến khi bộ chọn đã cập nhật vượt qua bài kiểm tra mức nội dung.

Q: Một trình cào CDP nên sử dụng bao nhiêu mức độ đồng thời?

Bắt đầu với một phiên tách biệt cho mỗi công nhân và tăng cường công việc song song chỉ sau khi đo mức tải trang, bộ nhớ, giới hạn mục tiêu, và tỷ lệ chấp nhận trên máy chủ thực tế.

Q: Tôi có thể sử dụng CDP mà không có một tác nhân dựa trên mô hình, và tôi có thể tái sử dụng URL WebSocket của nó không?

Puppeteer và Playwright có thể sử dụng CDP trực tiếp mà không cần một tác nhân dựa trên mô hình. Các ID WebSocket của trình duyệt và trang là không minh bạch và riêng biệt theo phiên, vì vậy hãy phát hiện chúng trong thời gian chạy và không tái sử dụng một điểm cuối sau khi phiên trình duyệt của nó kết thúc.

Tại Scrapless, chúng tôi chỉ truy cập dữ liệu có sẵn công khai trong khi tuân thủ nghiêm ngặt các luật, quy định và chính sách bảo mật trang web hiện hành. Nội dung trong blog này chỉ nhằm mục đích trình diễn và không liên quan đến bất kỳ hoạt động bất hợp pháp hoặc vi phạm nào. Chúng tôi không đảm bảo và từ chối mọi trách nhiệm đối với việc sử dụng thông tin từ blog này hoặc các liên kết của bên thứ ba. Trước khi tham gia vào bất kỳ hoạt động cạo nào, hãy tham khảo ý kiến ​​cố vấn pháp lý của bạn và xem xét các điều khoản dịch vụ của trang web mục tiêu hoặc có được các quyền cần thiết.

Bài viết phổ biến nhất

Danh mục