ブックマークのHTMLファイルからリンク切れを削除してみた

ブラウザのブックマーク(お気に入り)をエクスポートしたHTMLから、リンク切れを削除するスクリプトを作りました。

下記の手順で利用できます。

  1. ブックマークをHTML形式でエクスポート
    1. 必要なリンクを消してしまう事故を防ぐために、しばらくは消さずに残すことをお勧めします
  2. スクリプトでリンク切れを削除したHTMLファイルを生成
  3. ブラウザのブックマークを全部削除
  4. 2.で生成したHTMLファイルをインポート
Remove invalid URLs from bookmarks HTML · GitHub Remove invalid URLs from bookmarks HTML. GitHub Gist: instantly share code, notes, and snippets. favicon gist.github.com
thumbnail

トライアンドエラーについて書いていこうと思います。

ブックマークの整理をしたかったのですが、拡張機能を使うと情報がどう扱われるか心配ということで、wgetを使ってみようと考えました。 wgetについて調べているとwget2 というものがあり、HTTP2やマルチスレッドに対応しているなど上位互換の感じだったので使ってみました。

できるだけサクサクとチェックできるようにタイムアウト時間とリトライ回数を減らして、下記のコマンドを実行しました(他にも --no-verbose オプションをつけたり、 -o オプションをつけて出力先をファイルにしたりしました)。

wget2 --spider --force-html --ignore-length --timeout=5 --tries=2 -i bookmarks.html

しかし全然終わらない! Todo: の数字が1とか4とかになると止まってしまい、lsofコマンドで確認するとコネクションがCLOSE_WAITやCLOSEDのままでした。 TCPのコネクションだけを終わらせてwget2の処理を進める方法は持ち合わせていないので諦めました… wget2のログから、さらにブックマークのリンク切れを特定して削除するのも面倒ですしー

ちなみにwgetコマンドでも終わりませんでした。 調子の良くないWebサーバがあったのかもしれませんね。

そこで、ブックマークのHTMLファイルをプログラムで直接いじれば良いのではと考え、スクリプト言語では馴染みのあるRubyを使ってみました。 それが冒頭のプログラムになります。

苦労した点としては、リダイレクト時はlocationヘッダで指定されたURLに再帰的にアクセスしていますが、相対パスで返ってくるパターンと絶対パスで返ってくるパターンがありました。 MDNRFC 7231 を見るとどちらでも良いそうです。

他には、そもそもホスト名が見つからずにTCPの接続エラーになるケースなど単なるHTTP接続でも色々なエラーが起きたり、変数名をurlとしていたせいで文字列型とRubyのURIクラスのオブジェクトを取り違えてエラーが出ていたりと地味にいろいろハマりましたー。

さっとスクリプトを作って問題解決するの楽しいです!