Kage - WebサイトからJavaScriptを除去してオフライン保存するツール
(github.com/tamnd)- ヘッドレスChromeでページをレンダリングし、人が見る最終DOMをスナップショットした後、すべてのJavaScriptを削除し、CSS・画像・フォントをローカルパスにダウンロードして、コードなしで動作する静的コピーを生成
- "Save As"で保存したページが時間の経過とともに真っ白な画面・止まったスピナー・消えたanalyticsサーバーへの接続試行によって壊れてしまう問題を解決
- トラッキング・ネットワーク呼び出し・予期しない動作なしに、ディスクから直接開ける
.htmlファイルを提供
- トラッキング・ネットワーク呼び出し・予期しない動作なしに、ディスクから直接開ける
- breadth-firstクロールで
robots.txtを読み、sitemap.xmlから開始点を取得し、seedホスト内にとどまる- idempotentな特性により、http・httpsやtrailing slashの有無に関係なく、同じページは一度だけ取得
- Ctrl-C時に位置を保存し、再実行時に続きから再開し、
--refreshで再レンダリング、--forceで最初から開始
--max-pages、--max-depth、--scope-prefix、--subdomains、--scroll、--workersなどのクロール範囲・動作制御フラグを提供kage packでコピーを単一ファイルに圧縮し、ZIMアーカイブまたはサイト自体として動作するスタンドアロン実行ファイルを選択可能- ZIMはKiwixエコシステムと互換性があり、
kiwix-serveやKiwixデスクトップ・モバイルアプリでも閲覧可能 - スタンドアロンバイナリは受け取る側が何もインストールする必要がなく、
--baseで別OS向けviewerを生成可能(約13 MiB + サイト容量)
- ZIMはKiwixエコシステムと互換性があり、
- 決定論的パッキングにより、同じコピーからは常にbyte-identicalなファイルを生成し、archive UUIDはコンテンツから導出されるため、checksum・cacheに安全
webviewタグでビルドするとOS WebView(WKWebView・WebView2・WebKitGTK)を使用し、ブラウザタブではなく独自ウィンドウで開く- 処理パイプライン: seed URL → headless Chromeレンダリング → final DOMスナップショット → JS除去 → アセットのローカル化 → ディスク保存
- MITライセンス
1件のコメント
Hacker Newsのコメント
READMEのデモGIFがどうやって作られたのか気になって見てみた: https://github.com/tamnd/kage/blob/01e75b87ecc893bbba7943c63...
調べてみると、同じ作者の別プロジェクト https://github.com/tamnd/ascii-gif を使っていた
デモに使われたスクリプトは https://github.com/tamnd/kage/blob/01e75b87ecc893bbba7943c63... にあり、実行方法もコメントとして入っている:
ascii-gif render docs/demo/kage.tape -o docs/static/demo.gifhttps://github.com/charmbracelet/vhs をかなり好み強めにラップしたラッパーのように見える
$HOME/bin/にもこういう個人用バイナリがかなりある。delete-all-npm、clean-rust-cache、download-youtube-playlist、get-markdownみたいなもので、コマンドを覚える必要がないのがいいときどきコーディングエージェントが、こうしたツールをどう呼び出すかまで勝手に見つけてくれる
会社のWikiをオフラインでも簡単にアクセスできるようにしたいとき、これが使えそう。たとえば携帯の電波が届かない現場で、役に立つ文書がWikiにあるかもしれない
サイト全体を単一バイナリにまとめられるのは魅力的だが、別途 サービングプロセス が不要なバージョンなら特にうれしい
サイトコンテンツのアーカイブを、できれば内蔵された形で、多少のJavaScriptを入れた単一のHTMLエントリーポイントshimのような方式で閲覧できるようにすることもできそう
頭の中にはすでにHTMLをMarkdownに変換するスクリプト/プログラムがあるので、実際にはすべてをディスク上の Markdownファイルのフォルダ として保存し、そのあとGitリポジトリにコミットすることもできる
これは素晴らしい。Lovableのようなところで作られた誰かのプロトタイプをオフラインコピーとして受け取り、もっと扱いやすい形式で バージョン管理と共有 をしたいと思っていた
自分たちのアプローチはここに書いてある: https://productnow.ai/blogs/extracting-html-from-ai-prototyp...
これからこれを見て、一部を置き換えられるか試してみるつもり。オフラインミラーというアイデアが気に入っているし、コラボレーション関連のユースケースがずっとシンプルになる
kage serve $HOME/data/kage/paulgraham.comと書かれているが、生成物が静的ならなぜサーバーが必要なのかわからない。ブラウザでそのまま開けるようにはできないのか?たとえば
$ firefox $HOME/data/kage/paulgraham.comのようにできれば、kageがインストールされていないマシン でも生成物を使えるpython -m http.serverが使えそう。まだ試してはいないが、動きそうではある実際、Kageは2つの部分で構成されている。1つはChrome/Chromiumでレンダリングした後のDOMをキャプチャしてページをクロールし、きれいなHTMLに変換する クローラー、もう1つは結果をKiwix用ZIMファイルや実行ファイルにパッケージ化するpack/serveコンポーネント
SingleFile [0] は、これをずっと堅牢にしたバージョンだと思う。
JavaScript もすべて取り除くが、配布しやすい 単一の HTML ファイル に全部まとめてくれる。Web フォントや画像のようなバイナリアセットは base64 文字列として埋め込まれる
Puppeteer ベースの CLI も提供している [1]
[0]: https://github.com/gildas-lormeau/singlefile
[1]: https://github.com/gildas-lormeau/single-file-cli
ここで実装しているのは、下位ページまで含めた Web サイト全体のミラーリング なので、オフラインでもすべて閲覧できる。たとえば paulgraham.com の全エッセイのようなもの
ただ、Kage が SingleFile レベルの再現品質と HTTPTrack 的なスパイダリングのアプローチを組み合わせられるなら有望に見える。シングルページアプリ はアーカイブが少し難しいので、Kage がどれくらいうまく扱えるのか気になる
File -> Save asするのと何が違うの?HTTP、つまり HTTPS ではないサイトを複製しようとしたが、
navigation failed: net::ERR_NAME_NOT_RESOLVEDが出た。http://とプロトコルを明示しても同じだった飛行機で読むために Wiki をダウンロードするときは httrack(https://www.httrack.com) を使ってきた。完璧ではないが、以前に見つけたものよりはよかった。
これも試してみるし、結果がよければ本当にうれしい
https://wiki.openzim.org/wiki/Build_your_ZIM_file
EDIT: https://get.kiwix.org/en/solutions/applications/kiwix-reader...
何年にもわたって古い Web サイトのアーカイブをかなり集めてきた。面白いのは、醜い HTML ダンプ のほうが「完璧な」アーカイブより役に立ったことだ。
時間がたつほど RSS を好きになった理由の一つもそれで、10年くらい前のフィードは、丁寧に保存されたアプリケーション型 Web サイトよりも今では使いやすいことが多い
少し整理したあと、近いうちにオープンソースとして公開する予定
これはサイトにかなり大きな負荷をかける可能性がありそう。複製速度を調整したり、画像や動画を避けたりする設定はある?
Web サイトの 一部だけを取得する方法 もあるのか気になる
すっきりしたプロジェクトで、アイデアが気に入った。
ざっと読んだ限り Chrome を
--no-sandboxで実行しているようだけど、そうする理由はある? セキュリティ面ではよい考えではない可能性が高い。理由がないなら サンドボックス を有効にしておくことを勧める。ともあれ、すばらしい仕事だ
--no-sandboxは Docker で必要だ。おそらく大半が Docker で実行 される前提なのでは?