2 ポイント 投稿者 GN⁺ 3 시간 전 | 1件のコメント | WhatsAppで共有
  • ヘッドレス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 + サイト容量)
  • 決定論的パッキングにより、同じコピーからは常にbyte-identicalなファイルを生成し、archive UUIDはコンテンツから導出されるため、checksum・cacheに安全
  • webviewタグでビルドするとOS WebView(WKWebView・WebView2・WebKitGTK)を使用し、ブラウザタブではなく独自ウィンドウで開く
  • 処理パイプライン: seed URL → headless Chromeレンダリング → final DOMスナップショット → JS除去 → アセットのローカル化 → ディスク保存
  • MITライセンス

1件のコメント

 
GN⁺ 3 시간 전
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.gif
    https://github.com/charmbracelet/vhs をかなり好み強めにラップしたラッパーのように見える

    • ターミナルの救世主 asciinema の福音をお聞きになったことはありますか: https://asciinema.org/
    • 自分の $HOME/bin/ にもこういう個人用バイナリがかなりある。delete-all-npmclean-rust-cachedownload-youtube-playlistget-markdown みたいなもので、コマンドを覚える必要がないのがいい
      ときどきコーディングエージェントが、こうしたツールをどう呼び出すかまで勝手に見つけてくれる
    • GIFの代わりに アニメーションSVG にすることもできるし、テキストのキーフレームにすぎないのでGIFよりずっと小さい: https://github.com/vytskalt/pseudoc/blob/main/assets/factori...
    • ちなみに別プラットフォームのWindows/macOSでは、LiceCAP は画面を小さなGIFとして録画するのに優れたツール。WinampとReaper DAWの作者が作ったもの: https://www.cockos.com/licecap/
    • VHS はコマンドライン動画の生成をスクリプト化するときに優秀
  • 会社のWikiをオフラインでも簡単にアクセスできるようにしたいとき、これが使えそう。たとえば携帯の電波が届かない現場で、役に立つ文書がWikiにあるかもしれない
    サイト全体を単一バイナリにまとめられるのは魅力的だが、別途 サービングプロセス が不要なバージョンなら特にうれしい
    サイトコンテンツのアーカイブを、できれば内蔵された形で、多少のJavaScriptを入れた単一のHTMLエントリーポイントshimのような方式で閲覧できるようにすることもできそう

    • Hacker Newsに投稿したのはまさにぴったりの場所ですね。実装するか検討してみます
      頭の中にはすでに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コンポーネント
    • 普通はそういう読み込み方をすると JavaScriptがブロック される
    • そうするとたぶん CORSの問題 に大量にぶつかる可能性が高い
  • 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 ページだけを保存するものに見える。
      ここで実装しているのは、下位ページまで含めた Web サイト全体のミラーリング なので、オフラインでもすべて閲覧できる。たとえば paulgraham.com の全エッセイのようなもの
    • SingleFile は本当に気に入っている。Firefox 拡張はきれいに保存するのにかなりうまく動く。
      ただ、Kage が SingleFile レベルの再現品質と HTTPTrack 的なスパイダリングのアプローチを組み合わせられるなら有望に見える。シングルページアプリ はアーカイブが少し難しいので、Kage がどれくらいうまく扱えるのか気になる
    • リンクありがとう。この 単一 HTML 機能 は実装してみる。あると便利そう
    • コンピューター上のどの Web ブラウザーでも File -> Save as するのと何が違うの?
    • 自分も最初にそれを思い浮かべたし、とてもエレガントな解決策だと思う。不要に複雑でもない
  • HTTP、つまり HTTPS ではないサイトを複製しようとしたが、navigation failed: net::ERR_NAME_NOT_RESOLVED が出た。http:// とプロトコルを明示しても同じだった

  • 飛行機で読むために Wiki をダウンロードするときは httrack(https://www.httrack.com) を使ってきた。完璧ではないが、以前に見つけたものよりはよかった。
    これも試してみるし、結果がよければ本当にうれしい

    • 懐かしい。20年くらい前はインターネットがまだ高価なダイヤルアップで、ネットカフェに行って HTTrack で Web サイトやマンガをダウンロードし、その当時はものすごく大容量に感じられた 128MB の USB メモリに全部コピーして、家に持ち帰ってオフラインで読んでいた
    • Wiki に限れば Kiwix を使わない理由はある? 「公式」リリースでないものだと少し複雑になるが、ZIM ファイルを生成してくれるサービスがある。デスクトップのリーダーアプリは、自分の経験ではかなりよかった。
      https://wiki.openzim.org/wiki/Build_your_ZIM_file
      EDIT: https://get.kiwix.org/en/solutions/applications/kiwix-reader...
    • https://github.com/archiveteam/grab-site や browsertrix のほうが、人によっては使いやすいかもしれない。data.gov の資料が消える前に大量保存するときに使われたツールだ
  • 何年にもわたって古い Web サイトのアーカイブをかなり集めてきた。面白いのは、醜い HTML ダンプ のほうが「完璧な」アーカイブより役に立ったことだ。
    時間がたつほど RSS を好きになった理由の一つもそれで、10年くらい前のフィードは、丁寧に保存されたアプリケーション型 Web サイトよりも今では使いやすいことが多い

    • RSS フィードを生成してアーカイブするプロジェクトをやっている。クローラーが開始した時点から 全履歴 を保存する。
      少し整理したあと、近いうちにオープンソースとして公開する予定
  • これはサイトにかなり大きな負荷をかける可能性がありそう。複製速度を調整したり、画像や動画を避けたりする設定はある?
    Web サイトの 一部だけを取得する方法 もあるのか気になる

    • これを新しい issue にしてもらえる? 後で対応するよ。今こちらの時間で午前1時だけど、誰かが興味を持ってくれてうれしい
    • AI クローラー のふりをすれば解決
  • すっきりしたプロジェクトで、アイデアが気に入った。
    ざっと読んだ限り Chrome を --no-sandbox で実行しているようだけど、そうする理由はある? セキュリティ面ではよい考えではない可能性が高い。理由がないなら サンドボックス を有効にしておくことを勧める。
    ともあれ、すばらしい仕事だ

    • --no-sandbox は Docker で必要だ。おそらく大半が Docker で実行 される前提なのでは?