從結論上來講,啟用 page.enable() 很難被反爬蟲檢測到。
下面文章分三個方向:
- 執行
await tab.send(cdp.page.enable())與不執行的差異 - 執行後 Chrome/頁面端會不會被「檢測出來」
- 有哪些可被網站偵測到的指標(有、沒有 enable 各不同)
① Page.enable() 做了什麼?
Page.enable() 的作用很簡單:
告訴 Chrome:「我開始關心 Page 這個 domain 的事件,請把所有 Page 相關事件傳回給我」。
如果沒有呼叫:
- CDP 一般還是能操作(例如
Page.navigate()) - 但 Chrome 不會主動推送事件
- 例如:
Page.javascriptDialogOpeningPage.loadEventFiredPage.frameNavigatedPage.domContentEventFiredPage.screencastFrame- …等等
所以:
| 功能 | 未呼叫 Page.enable() | 呼叫後 |
|---|---|---|
| 發送命令(navigate、screenshot…) | 可用 | 可用 |
| 自動收到頁面事件 | ❌ 不會 | ✔ Chrome 會開始推送 |
| 能否攔截 alert | ❌ 幾乎不行(沒事件) | ✔ 可靠 javascriptDialogOpening 攔截 |
| 能否監聽 DOM、frame、載入狀態 | ❌ 不會收到 | ✔ 可監聽 |
② 「是否會被網站偵測到?」
結論
沒有,網站端無法偵測你有沒有呼叫
Page.enable()。
原因:
Page.enable()是 Chrome 內部與 DevTools 的溝通- 它 不會修改 JS 執行環境
- 也 沒有任何標誌留在
window或 DOM
③ 那網站能偵測到「哪些特徵」?
雖然網站偵測不到 Page.enable() 本身,但:
只要你啟動了 CDP 就能被某些指標「間接」偵測到,而不是因為
Page.enable()。
以下是 Chrome 在開啟 DevTools 或以 CDP 附著時最常見的偵測方式:
(A) navigator.webdriver === true
如果你不是以「正常使用者」啟動 Chrome,而是:
--remote-debugging-port--headless=new- 自動化環境
大多情況:
navigator.webdriver
// true
這是 最常見的 Bot 偵測方式
但與 Page.enable() 無關。
(B) chrome.runtime / CDP 擴展檢測
部分站點會檢查:
window.chrome
window.chrome.runtime
但仍然與 Page.enable() 無關,你所使用的 CDP 可能會產生 .runtime。
(C) Performance Fingerprint(DevTools Overhead)
假如你掛著 CDP session:
- Chrome DevTools Agent engine 會跑
- Performance timing 可能變化
- 網站可以「偵測延遲異常」
例如:
performance.now()
但依然 不是 Page.enable() 導致,而是整個 CDP 存在造成。
(D) 棧追蹤指紋(極少見)
某些反爬蟲網站會檢查:
alert.toString()console.log.toString()
如果你覆寫了 API(如前面你覆寫 alert),就會查出:
alert.toString()
// "function (){}" <-- 異常
但:
只要你覆寫 JS(alert / console / prototype),就會被發現,跟 Page.enable() 無關。
(E) 是否有 detached DevTools(Chrome 自己偵測)
Chrome 自己有事件:
Inspector.detachedTarget.attachedToTarget
在 chrome:// 層能知道有沒有 DevTools 附著:
但:
- 網站 JS 必須突破瀏覽器沙盒才能接觸到
- 所以正常網頁 抓不到
④ 有無 Page.enable() 的實際異差總表
| 功能/行為 | 沒有 Page.enable | 有 Page.enable |
|---|---|---|
| 可否收 Page 事件(alert、frame、load) | ❌ 不會收到 | ✔ 會開始自動推送 |
| 是否能靠事件攔截 alert | ❌ 幾乎不行 | ✔ 可直接攔截 |
| 是否被網站檢測到 | ❌ 不會 | ❌ 不會 |
| 是否讓 CDP overhead 略上升 | 無 | 少量(極低) |
| 是否會讓 runtime footprint 改變 | 無 | 幾乎無 |
核心重點:
Page.enable()本身不會多產生可被 JS 偵測的痕跡。
真正能被網站抓到的:
navigator.webdriver- JS override(你自己動了
alert) - 指紋差異(DevTools 附著/CDP session 帶來的 timing 變化)
但這些都不是 Page.enable() 的結果,而是 使用 CDP 本身的副作用。
⑤ 如果你希望「不被任何 JS 偵測」又能攔截 alert?
最乾淨的做法:
Chrome啟動參數:禁止彈窗
--disable-javascript-dialogs
在這種情況:
- alert/confirm/prompt 永遠不會彈
- CDP 不需要 Page.enable
- JS 裡面仍會執行
alert(),但什麼都不會發生 - 幾乎無法被網站端偵測
這是 完美隱形、最安全且最可靠 的方式。