Kage: 將網站轉化為無腳本的離線二進位檔

Kage 是一款旨在解決「損壞」離線存檔問題的工具,它能將網站複製成無腳本、可瀏覽的鏡像網站。與傳統的「另存新檔」功能(通常會留下斷開的連結或對外部 JavaScript 的依賴)不同,Kage 會在真實瀏覽器中渲染頁面,擷取最終的 DOM 快照,並移除所有 JavaScript,以確保內容在離線狀態下仍能正常運作且具備隱私性。

核心功能:渲染與清理

Kage 透過驅動無頭 Chrome (headless Chrome) 實例來捕捉頁面,使其呈現方式與人類視覺完全一致,從而建立網站的永久離線版本。其處理流程遵循特定的管線:Seed URL $\rightarrow$ Headless Chrome (Render) $\rightarrow$ Final DOM (Snapshot) $\rightarrow$ Strip JS (Sanitize) $\rightarrow$ Localize Assets (Rewrite Links) $\rightarrow$ Disk.

透過移除所有腳本,Kage 消除了追蹤、網路請求以及現代單頁應用程式 (SPA) 中常見的「載入中」效果。產出的結果包含 .html 文件與一個預留的 _kage 目錄,其中包含本地化的 CSS、圖片與字體。

部署與使用選項

Kage 提供多種安裝與執行工具的方式,以滿足不同的環境需求:

  • Go 安裝: go install github.com/tamnd/kage/cmd/kage@latest
  • 預建二進位檔: 提供 .deb.rpm.apk 套件。
  • Docker: 一個包含 Chromium 的容器映像檔 (ghcr.io/tamnd/kage),無需在本地安裝 Chrome。

複製與鏡像

kage clone 指令會執行禮貌性的廣度優先爬取。它會遵循 robots.txt 並使用 sitemap.xml 作為種子。關鍵能力包括:

  • 範圍控制: 使用 --scope-prefix 來限制爬取範圍於網站的特定區塊。
  • 深度與頁面限制: 使用 --max-pages--max-depth 來控制數據量。
  • 延遲載入支援: --scroll 旗標會觸發自動捲動,以捕捉僅在捲動時才載入的圖片。
  • 冪等性: Kage 會根據寫入的文件來記錄頁面,確保無論使用何種協定(HTTP 或 HTTPS),相同的頁面都不會被重複抓取。

提供離線內容

由於現代瀏覽器出於安全考量,通常會限制透過 file:// 協定載入本地文件,因此 kage serve 會執行一個本地 HTTP 伺服器,以確保連結與資源能正確解析。

將鏡像打包成可攜式成品

Kage 允許使用者將基於目錄的鏡像壓縮成單一文件,以便於分享與長期儲存。

ZIM 封存檔

Kage 可以將鏡像打包成 ZIM 文件格式,這是一種由 Kiwix 等專案使用的開放標準,用於離線儲存 Wikipedia 與 Stack Overflow。由於 ZIM 是一個有文件規範的標準,由 Kage 建立的文件可以在任何 ZIM 閱讀器(例如 Kiwix 的桌面版、Android 或 iOS App)中開啟,避免了供應商鎖定。

自包含二進位檔

使用 --format binary 旗標,Kage 會將網站封存與 Kage 的執行檔副本結合在一起。這會建立一個單一的二進位檔,執行時即可離線提供網站服務,且不需要在目標機器上安裝任何外部依賴或 ZIM 閱讀器。

對於追求更整合體驗的使用者,使用 webview 標籤編譯 Kage,可以讓這些二進位檔在原生作業系統視窗中開啟網站(在 macOS 上使用 WKWebView,在 Windows 上使用 WebView2,在 Linux 上使用 WebKitGTK),而非在瀏覽器分頁中開啟。

技術架構

Kage 是以 Go 語言編寫,並組織成多個專業的套件:

  • clone:管理爬取邊界、渲染工作者與恢復狀態。
  • browser:處理無頭 Chrome 控制與 DOM 快照。
  • sanitize:移除腳本、事件處理器與 URL。
  • asset:下載並本地化 CSS、圖片與字體。
  • zim:ZIM 閱讀器的純 Go 實作。

社群洞察與替代方案

Hacker News 上的社群討論強調了對於這種網頁存檔方式的幾種替代方案與考量因素:

  • 替代工具: 使用者提到了 SingleFile,這是一個強大的替代方案,它使用 base64 字串將所有內容打包成單一 HTML 文件;此外還有 HTTrack 用於傳統的 wiki 鏡像。
  • 安全疑慮: 部分使用者指出,在網路上分享執行檔是具有安全風險的,且有一位使用者提到 Windows Security 可能會將產出的二進位檔標記為潛在不受歡迎的軟體。
  • wget 的比較: 此工具本質上是 wget --mirror 的現代版本,它能透過先進行渲染來處理大量依賴 JavaScript 的頁面。

"那些醜陋的 HTML 轉存檔比『完美』的存檔更有用... 十年前左右的內容饋送,通常比精心保存的(應用程式)網站更具可用性。"

這種觀點強調了 Kage 的哲學:優先考慮簡單、無腳本的 HTML,而非複雜的應用程式狀態保存。

Sources