文件

架構

go-browser 系統架構 — Launcher、Fetch 管線、互動式分頁、Cookie 提取與內容處理模組。

系統概覽

graph TB
    A[Fetch / CreateTab] --> B[Launcher]
    B --> C{Headless?}
    C -->|Yes| D[Stealth JS]
    C -->|No| E[Cookie Session]
    D --> F[Page Navigate + Scroll]
    E --> F
    F --> G[Snapshot Merge]
    G --> H[Readability + Dedup]
    H --> I[Markdown / HTML / JSON]

模組層級

模組 套件 職責
Launcher core/launcher.go Chrome 生命週期管理、單例 headless 瀏覽器(含閒置回收)、暫存設定檔快照實例
Fetch core/fetch.go 內容提取管線 — 導航、滾動、快照擷取、格式輸出
Interactive Tabs core/browser.go 有狀態分頁管理 — 點擊、輸入、滾動、執行 JS、快照
Cookie Extraction core/cookie.go 跨平台 Chrome Cookie 解密,從本機設定檔 SQLite 提取
Content Processing core/markdown.go 快照合併、時間元素內聯、readability 解析、Markdown/HTML/JSON 轉換、去重

Launcher

管理兩種瀏覽器模式:

Launcher 設定的 Chrome 旗標包含 disable-blink-features=AutomationControlledno-sandboxdisable-dev-shm-usage 及自訂 user-agent。macOS 上於 /Applications/Google Chrome.app 尋找 Chrome;Linux 上搜尋 PATH。

Fetch 管線

  1. URL 解析 — 透過 parseHref 驗證 scheme 與 hostname。
  2. 模式選擇 — 根據 Option.HeadlessOption.SameSession 及 domain 判斷 headless 或 session 模式。
  3. 頁面建立 — 建立頁面並設定 viewport,透過 EvalOnNewDocument 注入 stealth.js。
  4. 導航 — 導航至目標 URL,等待載入完成,檢查最終 URL 是否含 404/403 模式。
  5. DOM 穩定 — 等待 DOM 穩定並執行 settle.js 處理延遲載入內容。
  6. 滾動迴圈 — 擷取初始快照後,以隨機延遲平滑滾動,每次滾動後擷取快照。
  7. 內容處理 — 依 Option.Type 合併 HTML 快照、執行 readability 提取、轉換為 Markdown/HTML/JSON 並去重。

Interactive Tabs

有狀態分頁管理,支援多步驟瀏覽器互動:

跨平台 Chrome Cookie 解密(core/cookie.go,僅 darwin 與 linux):

  1. 透過 OS 鑰匙圈取得 Chrome Safe Storage 密碼(macOS 用 security,Linux 用 secret-tool)。
  2. 使用 PBKDF2-SHA1 搭配 1003 次疊代推導 AES 金鑰。
  3. 查詢 Chrome 設定檔 SQLite Cookies 資料庫,取得 host_keynamevalueencrypted_valuepathexpires_utcis_secureis_httponlysamesite
  4. 使用 AES-CBC 搭配空格填充的 IV 解密 v10 前綴的加密值。
  5. 回傳 NetworkCookieParam 物件供注入暫存瀏覽器。

Content Processing

EN