核心概念
go-browser 核心概念 — 反偵測隱匿、Cookie 會話注入、多頁面快照合併與多格式輸出。
反偵測隱匿
go-browser 內嵌 stealth.js 腳本(core/embed/stealth.js),在導航前透過 EvalOnNewDocument 注入每個頁面。此腳本修補瀏覽器執行時期屬性,降低被 Cloudflare 等反機器人服務偵測的機率。
關鍵技術:
- AutomationControlled 繞過 — 啟動時設定 Chrome 旗標
disable-blink-features=AutomationControlled,移除navigator.webdriver屬性。 - 執行時期屬性修補 — stealth.js 覆寫
navigator.plugins、navigator.languages、navigator.permissions等指紋辨識目標。 - 自訂 User-Agent — 預設為
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36,可透過Option.UserAgent覆蓋。
Cookie 會話注入
對於需要登入的頁面,go-browser 可從本機 Chrome 設定檔提取 Cookie 並注入至暫存瀏覽器實例。
流程(core/cookie.go):
- 設定檔發現 — 定位 Chrome 設定檔目錄(macOS 為
~/Library/Application Support/Google/Chrome/<Profile>,Linux 為~/.config/google-chrome/<Profile>)。 - Cookie 資料庫複製 — 將 SQLite
Cookies檔案(含 WAL 與 SHM)複製至暫存目錄,避免鎖定執行中的設定檔。 - 金鑰推導 — 從 OS 鑰匙圈取得 Chrome Safe Storage 密碼,使用 PBKDF2-SHA1 搭配 1003 次疊代與 salt
saltysalt推導 AES 金鑰。 - 解密 — 使用 AES-CBC 搭配空格填充的初始向量解密
v10前綴的加密 Cookie 值。 - 注入 — 啟動暫存 Chrome 實例,透過
browser.SetCookies設定解密後的 Cookie。
此功能透過設定 Option.SameSession: true 啟用,僅支援 macOS 與 Linux。
多頁面快照合併
為完整擷取動態載入內容(無限滾動、延遲載入圖片、分頁資訊流),go-browser 模擬滾動行為並合併多個頁面快照。
滾動迴圈(core/fetch.go):
- DOM 穩定後擷取初始 HTML 快照。
- 每次滾動疊代(預設 3 次,可透過
Option.ScrollCount設定):- 等待 1–3 秒的隨機延遲。
- 使用
requestAnimationFrame平滑滾動至底部。 - 等待 DOM 穩定。
- 擷取另一個 HTML 快照。
- 將後續快照的 body 子節點附加至基礎文件的 body,合併所有快照(
core/markdown.go的Merge函式)。 - 對每個快照執行 readability 提取,並透過雜湊去除重複段落。
多格式輸出
go-browser 支援三種輸出格式,由 Option.Type 控制:
| 格式 | 常數 | 說明 |
|---|---|---|
| Markdown | TypeMarkdown (0) |
預設。透過 go-readability 提取文章內容,轉換為 Markdown,去除重複段落。 |
| HTML | TypeHTML (1) |
合併原始 HTML 快照,內聯 <time> 元素,回傳合併後的 HTML。 |
| JSON | TypeJSON (2) |
將 HTML 轉換為結構化 []*Node 樹,含 typed 節點(heading、paragraph、link、image、list、code_block 等),序列化為 JSON。 |
輸出格式細節
Markdown — 每個快照由 go-readability 解析以提取文章。內容片段合併後經 HTMLToMarkdown 轉換為 Markdown,再透過 DedupMarkdownParagraphs 去重。結果包含 Title、Author(byline)、Excerpt 及 PublishedAt(若有)。
HTML — 快照透過附加 body 子節點合併。<time> 元素內聯為純文字並保留 datetime 屬性。結果為單一合併的 HTML 文件。
JSON — readability 提取的內容經 HTMLToNode 轉換為 []*Node 樹。每個節點有 type(text、heading、paragraph、link、image、list、code_block 等)及選用欄位(text、level、href、src、alt、children)。樹狀結構在序列化前會去重並扁平化。
互動式分頁操作
除單頁擷取外,go-browser 提供有狀態分頁管理,支援多步驟工作流程:
- CreateTab — 建立持久化瀏覽器分頁(含 stealth 注入),回傳分頁 ID。
- TabClick — 透過 CSS 選擇器點擊元素。
- TabType — 在輸入欄位中輸入文字,觸發正確的事件。
- TabScroll — 程式化滾動頁面。
- TabEval — 在分頁環境中執行任意 JavaScript。
- TabSnapshot — 擷取目前頁面狀態為 Markdown、HTML 或 JSON。
- CloseTab — 關閉分頁並釋放資源。
所有分頁共享單一互動瀏覽器實例。當所有分頁關閉時,瀏覽器會自動關閉。