文件

核心概念

go-browser 核心概念 — 反偵測隱匿、Cookie 會話注入、多頁面快照合併與多格式輸出。

反偵測隱匿

go-browser 內嵌 stealth.js 腳本(core/embed/stealth.js),在導航前透過 EvalOnNewDocument 注入每個頁面。此腳本修補瀏覽器執行時期屬性,降低被 Cloudflare 等反機器人服務偵測的機率。

關鍵技術:

對於需要登入的頁面,go-browser 可從本機 Chrome 設定檔提取 Cookie 並注入至暫存瀏覽器實例。

流程(core/cookie.go):

  1. 設定檔發現 — 定位 Chrome 設定檔目錄(macOS 為 ~/Library/Application Support/Google/Chrome/<Profile>,Linux 為 ~/.config/google-chrome/<Profile>)。
  2. Cookie 資料庫複製 — 將 SQLite Cookies 檔案(含 WAL 與 SHM)複製至暫存目錄,避免鎖定執行中的設定檔。
  3. 金鑰推導 — 從 OS 鑰匙圈取得 Chrome Safe Storage 密碼,使用 PBKDF2-SHA1 搭配 1003 次疊代與 salt saltysalt 推導 AES 金鑰。
  4. 解密 — 使用 AES-CBC 搭配空格填充的初始向量解密 v10 前綴的加密 Cookie 值。
  5. 注入 — 啟動暫存 Chrome 實例,透過 browser.SetCookies 設定解密後的 Cookie。

此功能透過設定 Option.SameSession: true 啟用,僅支援 macOS 與 Linux。

多頁面快照合併

為完整擷取動態載入內容(無限滾動、延遲載入圖片、分頁資訊流),go-browser 模擬滾動行為並合併多個頁面快照。

滾動迴圈(core/fetch.go):

  1. DOM 穩定後擷取初始 HTML 快照。
  2. 每次滾動疊代(預設 3 次,可透過 Option.ScrollCount 設定):
    • 等待 1–3 秒的隨機延遲。
    • 使用 requestAnimationFrame 平滑滾動至底部。
    • 等待 DOM 穩定。
    • 擷取另一個 HTML 快照。
  3. 將後續快照的 body 子節點附加至基礎文件的 body,合併所有快照(core/markdown.goMerge 函式)。
  4. 對每個快照執行 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 去重。結果包含 TitleAuthor(byline)、ExcerptPublishedAt(若有)。

HTML — 快照透過附加 body 子節點合併。<time> 元素內聯為純文字並保留 datetime 屬性。結果為單一合併的 HTML 文件。

JSON — readability 提取的內容經 HTMLToNode 轉換為 []*Node 樹。每個節點有 type(text、heading、paragraph、link、image、list、code_block 等)及選用欄位(textlevelhrefsrcaltchildren)。樹狀結構在序列化前會去重並扁平化。

互動式分頁操作

除單頁擷取外,go-browser 提供有狀態分頁管理,支援多步驟工作流程:

所有分頁共享單一互動瀏覽器實例。當所有分頁關閉時,瀏覽器會自動關閉。

EN