← 返回信息流
AI 资讯Hacker News·2 小时前

Show HN:Kage可将任意网站打包为单文件二进制供离线浏览

原标题:Show HN: Kage – Shadow any website to a single binary for offline viewing

速览

Kage是一款开源工具,能够将任意网站的内容打包成一个单一的二进制文件。该工具支持离线查看,无需网络连接即可浏览网页内容。这对于需要保存网页快照或进行离线阅读的场景非常有用。

AI 深度解读

背景

在数字化时代,网页内容的长期保存与离线访问一直是一个痛点。传统的“另存为”或简单的爬虫抓取往往无法完美复刻现代网页的体验。六个月后再次打开保存的页面,用户可能会面对空白屏幕、无限旋转的加载图标,或是试图连接已不存在的分析服务器的错误。这些页面本质上只是他人 JavaScript 的“瘦客户端”,并未真正属于用户。

此外,随着网站设计的频繁更新,历史版本的网页极易丢失。对于需要在无网络环境(如飞机、偏远地区)下访问重要资料,或希望在十年后仍能阅读当前内容的用户来说,缺乏一种可靠、去脚本化且易于分发的离线归档方案。

核心内容

Kage(意为“影”,Shadow)是一款开源工具,旨在将任何网站克隆为一个可离线浏览的单一二进制文件或文件夹,同时剥离所有 JavaScript 代码。其核心工作流程如下:

  1. 真实渲染与快照:Kage 驱动真实的无头 Chrome 浏览器,等待页面完全加载并稳定后,捕获人类用户所见的 DOM 快照。
  2. 剥离脚本:在快照完成后,删除所有 JavaScript 代码,仅保留 HTML 结构。
  3. 资源本地化:将 CSS、图片和字体等资源下载到本地路径,确保页面在离线状态下仍能保持原有的视觉样式。
  4. 最终输出:生成的文件在磁盘上看起来与在线站点一致,但运行零代码,无追踪,无网络调用。

安装与使用

Kage 由 Go 语言编写,支持多种安装方式:

  • 源码安装go install github.com/tamnd/kage/cmd/kage@latest
  • 预构建二进制:提供 .deb.rpm.apk 等格式,或通过 GitHub Releases 下载。
  • Docker 容器:内置 Chromium,无需主机安装浏览器:
    docker run --rm -v "$PWD/out:/out" ghcr.io/tamnd/kage clone paulgraham.com
    

核心功能模块

  • Clone(克隆)

    • 执行礼貌的广度优先爬取,遵循 robots.txt,从 sitemap.xml 获取种子。
    • 默认仅在种子主机内爬取,除非指定 --subdomains
    • 幂等性:页面由写入的文件键控,确保同一内容(无论 HTTP/HTTPS 或尾部斜杠差异)只获取一次。
    • 断点续传:中断后保存进度,重启时继续;--refresh 可原地重新渲染以捕获新内容;--force 可清除主机重新开始。
    • 高级控制:支持限制页面数量(--max-pages)、深度(--max-depth)、特定路径(--scope-prefix)以及滚动触发懒加载图片(--scroll)。
  • Serve(服务)

    • 在克隆文件夹上运行一个轻量级静态文件服务器,使链接和资源解析方式与真实主机一致。
    • 默认地址:http://127.0.0.1:8800
  • Pack(打包)

    • 将镜像文件夹压缩为单一可分发文件,解决多文件传输不便的问题。
    • ZIM 格式:生成 .zim 文件,这是一种为离线内容设计的开放格式(Kiwix 项目使用)。文本经 zstd 压缩,媒体文件原样存储。生成的文件具有确定性(相同镜像产生相同字节文件),且兼容 Kiwix 生态系统(可在 Kiwix 桌面/移动端打开,但全文搜索功能受限)。
    • 二进制格式:将 ZIM 归档附加到 Kage 可执行文件本身,生成一个独立的、无需安装任何依赖的单一可执行文件。
      • 大小:约 13 MiB(Kage 本体)+ 网站内容。
      • 跨平台构建:可通过 --base 参数指定其他平台(如 Windows)的 Kage 二进制文件,在当前机器上构建出目标平台的离线查看器。
  • Native Window(原生窗口)

    • 默认情况下,打包的二进制文件会打开系统浏览器。
    • 若使用 webview 标签编译(需启用 CGO),则会在操作系统原生 WebView 窗口中打开站点(macOS 使用 WKWebView,Windows 使用 WebView2,Linux 使用 WebKitGTK),提供类似原生应用的用户体验。

关键要点

  • 去脚本化与隐私保护:Kage 剥离所有 JavaScript,消除了追踪脚本、网络回连和潜在的安全风险,确保页面内容“冻结”在磁盘上。
  • 真实渲染引擎:不同于简单的 HTML 抓取,Kage 使用无头 Chrome 进行完整渲染,确保 CSS 样式、图片和字体正确加载,还原视觉体验。
  • 灵活的输出格式
    • 文件夹:适合本地浏览和编辑。
    • ZIM 文件:适合长期归档和跨平台分发,兼容 Kiwix 生态。
    • 单一二进制:适合极致的便携性,接收方无需安装任何软件即可运行。
  • 智能爬取策略:支持断点续传、幂等去重、深度/数量限制、懒加载处理以及原地刷新,适应不同规模的网站克隆需求。
  • 跨平台与确定性:打包过程是确定性的,便于校验和缓存;支持通过指定基础二进制文件实现跨平台构建。
  • 原生应用体验:通过 webview 编译选项,可将离线网站转化为具有原生窗口外观和行为的独立应用。

意义与影响

Kage 提供了一种强大且实用的网页存档与离线访问解决方案,其意义体现在以下几个方面:

  1. 数字内容的长期保存:通过剥离动态脚本并固化资源,Kage 确保了网页内容不会因网站更新、服务器关闭或设计变更而失效。这对于保存重要文章(如 Paul Graham 的随笔)、技术文档或历史资料具有极高价值。
  2. 提升数据主权与隐私:用户不再依赖他人的 JavaScript 客户端来查看内容,消除了潜在的追踪和数据分析风险,真正实现了“内容属于用户”。
  3. 优化离线体验:生成的单一二进制文件或 ZIM 文件极大地简化了分发和存储过程。用户可以在无网络环境下获得与在线几乎一致的浏览体验,特别适用于旅行、教育或网络受限地区。
  4. 兼容现有生态:通过支持 ZIM 格式,Kage 无缝融入了现有的离线内容生态系统(如 Kiwix),使得生成的内容可以在多种设备和平台上被广泛阅读,延长了内容的生命周期。
  5. 开发者友好:提供详细的命令行选项、Shell 补全和多种安装方式,降低了使用门槛,同时其开源特性允许社区进行定制和扩展。

总之,Kage 不仅是一个技术工具,更是一种对抗数字内容 ephemeral(短暂性)的策略,让用户能够真正拥有并长期访问他们关心的网络内容。

查看原文 →github.com