ブックマーク代わりにツイートしていた7000件のURLを精査してEvernoteに移行した

なにか気になったウェブページを保存したいというとき、以前ははてなブックマークを使っていた。たぶん2017年くらいまで。

しかし当時のそのインフラ的な事情か、ブックマークをしようとしてもエラーが発生してできない場面が頻発していた。いや、実際そこまでの頻度ではなかったのかもしれないが、僕がそこそこヘビーユーザーだったために出会す機会が多かった気がする。いずれにせよ、それが嫌になって徐々にはてブを使わないようになっていった。

代わりに、気になったページはTwitterでシェアするようになった。自分用ブックマークを兼ねたシェア。ツイートはすぐに流れていってしまうので記録にはならないと考えるのが普通だと思うけど、僕の場合は、自分の過去のツイートを検索して見つけるという使い方をしてきた。

たとえば、「Buttons shouldn’t have a hand cursor」みたいな記事があったなと思えば、「from:_yuheiy cursor」辺りのクエリで調べれば見つけられる。ただこれをやるには、記事タイトルにわかりやすいキーワードが含まれていたり、けっこう精度高くタイトルを覚えていたりしないといけない。

僕はこういう情報の手がかりを人より多少覚えているほうなので、ある程度はこの運用でなんとなかってきた部分があったけど、とはいえ見つけられなかった場面も多い。だからこのやり方をこの先も続けていくには無理があるなと思いつつも、別のやり方に乗り換えるのが面倒くさくて先延ばしにし続けていた。けれど、さすがにそろそろなんとかしようという気になってきて重い腰を上げることにした。

まずは移行先のサービスを選定する。過去の記録を掘り返すために検索性能を重視しつつ、オープンに記録するには微妙なものもあるのでこれからはプライベートなスペースを選びたい。そこで候補になるサービスとして、記録したページの全文検索ができる「Pocket」「Evernote」「Notion」という3つを挙げてみた。

Pocketははてブと同じくブックマーク専用ツール。EvernoteとNotionはざっくり言うと文書全般を扱う汎用ツールという感じで、ページを記録するためにはそれぞれにあるWebクリッパーという機能を使う。Webクリッパーでは、ページのコンテンツをスクレイピングしてアーカイブすることになるので、もし記録したページが消滅しても参照し続けられる。Pocketの場合でも、有料会員なら永久保存ができる。どのサービスでも、ページを丸ごと保存するというわけではなくて、本文らしき領域を自動的に判別して、簡易的な形式で取り込んでくれる。

また、EvernoteとNotionではWebクリッパーでスクレイピングのアプローチが違う。

いずれもブラウザ拡張をインストールした上で使うのだが、Evernoteの場合はそのブラウザでそのまま見えている状態を記録する。たとえば、開発者ツールでページの内容を書き換えてからWebクリッパーを実行すると、書き換えた後の内容が記録されることになる。ログインが必要なページなどを開いている場合でも同様で、ログインしないと表示できないようなコンテンツも記録できる。また保存形式を選ぶこともできて、ページを丸ごと保存するか、記事として簡易的な見た目で保存するか、たんにブックマークにするか、などを選べる。

一方Notionの場合、Webクリッパーを実行すると、ユーザーの手元のブラウザ経由でスクレイピングするのではなく、表示中のページのURLをNotionのWeb APIに送信して、URLだけを手がかりにしてスクレイピングする。したがって、ログインが必要なページのコンテンツを記録することができない。

検索機能についても比較してみる。いずれも全文検索が強みに思えるが、Notionの場合、キーワードがマッチする箇所ごとに1件の検索結果として表示されるようになっている。たとえばひとつのページに「cursor」というキーワードが18回登場する場合、検索結果としては同じページが18件分表示されることになる。これではかなり探しづらい。マッチする箇所をひとつひとつ確認したいわけではなくて、先に目当てのページを見つけたいがために検索するわけなので、フォーカスする粒度が合っていない。PocketとEvernoteでは、同じページが検索結果に複数回登場するということはない。

こういった尺度で検討してみて、最終的にはEvernoteに移行することに決めた。Notionは検索機能の面で無しとして、Pocketと比べたときに、Evernoteではログインが必要なページでも保存できるようになっていることと、それにかぎらずあらゆるものをストックするのに向いた設計になっていることが決め手になった。

そういうわけで、これからのブックマークはEvernoteで記録していく、ということでもいいのだが、僕としてはこれまで長きにわたってツイートしてきた大量のページたちをなかったことにするのが惜しいので、どうにかして移行したい。検索機能が強化されればもっと有用に役立てられるリソースも増えるはずなので。しかし正当なやり方はたぶんないので、泥臭くやっていく。

まず最初に、これまでの全ツイートのアーカイブをダウンロードする。Twitterの設定画面から「データのアーカイブをダウンロード」をリクエストすると、24時間くらい経ってから、アカウントのあらゆるデータが含まれたファイルをダウンロードできるようになる。

アーカイブはHTMLでできたSPAになっていて、ブラウザで開くとビューアーとして機能する。ツイートのXMLやJSONが含まれているわけではないけど、いちおうツイートのデータだけを含んで切り出された次のようなJavaScriptのファイル(data/tweet.js)があるので、それをもとにしていろいろ処理していく。

window.YTD.tweet.part0 = [
  { ... },
  { ... },
  { ... }
]

まずはこの中から、ツイートしたURLのみを抽出したい。Twitterではツイートの本文データの中にURLもいっしょに含まれているので、URLのみを抽出するためにはTwitter公式のパーサーであるtwitter-textを使う。

すると、これまでの全67000件のツイートのうち、25000件にURLが含まれていた。体感的にこれは多すぎるなと思って確認してみたところ、リツイートや画像ツイートの分のURLも含まれてしまっているようだ。これらは不要なので除去する。

ツイート本文内に保存されるURLはすべて「https://t.co/」から始まるTwitter用短縮URLになっているので、目的のURLを判別するためにひと通りリダイレクト先のURLに加工する。その後、「https://x.com/」から始まるURLを除去するという流れ。それに加えて、これまでにツイートしたURLの中で重複するものも除去した。

この時点で15000件になった。ページの内容を時系列で飛ばし飛ばしに確認してみて、古いものにはあまり価値がなさそうだなと判断したので、ざっくり半分くらいを捨ててしまって、残りが7000件くらいになった。

これで残ったものはひと通りEvernoteに登録していきたいところだが、どうやらEvernoteのWebクリッパーには公開Web APIのようなものがないらしい(ちなみにNotionのほうにもなかった)。したがってここから先は手動でやるしかない。Puppeteerとかを使ってブラウザ拡張を自動操作したら無理ではないかもしれないけど、それも簡単ではなさそうなので、今回はこれまでツイートしたURLを振り返る意味もあって自分で登録していくことに決めた。

残った7000件のURLはすべてTextwellに放り込む。Textwellにはテキストを処理するためのアクションという機能が用意されていて、ユーザーがJavaScriptをスクリプトを記述することで新たなアクションを登録できるようになっている。これを使って、「上から20行分のURLをブラウザで開いて、その後それらのURLは削除する」というアクションを作成する。後はそれを実行して、開いたページを処理しては、その後はまたアクションを実行する。これを最後までやる。

これが一番時間がかかって精神的苦痛も伴う作業で、数日では到底終わらない。ひとつひとつのページにざっと目を通して、いらなさそうなものはスルーして、後で見返したい気がするものは保存する。懐かしい気持ちになったりしてちょっと楽しくはあるが、いかんせん量が多すぎるので、まあ大変だった。こういう作業に向いてないからプログラマーをやっているのだ。

ちなみに、Textwellの代わりにシェルスクリプトでも同じようなことはできるのだけど、あえてTextwellを使っていることには理由がある。僕はいつもメールとかSlackとかのために作文するときにはTextwellを使っているのだが、そのTextwellを大量のURLで占拠してしまうとそうした普段の作業がやりにくくなるので、嫌でも気になって早く終わらせようという気持ちになる。これをもし差し障りのないようなところに置かれたテキストファイルで管理していたとすれば、半端なところで投げ出してしまっていたに違いない。

しかしその間いろいろ忙しかったりもしたので、けっきょく1ヶ月半くらいかかってしまった。それでも、すでに何度もEvernoteの検索機能と大量の記録に助けられたので、結果オーライだと思う。保存件数は1000件くらいになった。

加えて、ブラウザの余計なブックマークも減らすことができた。ツイートで済ませてしまうと後から探せなくなる不安が大きいので、いちおう保険としてブラウザのブックマークにも保存しておくかという気になっていたが、Evernoteだと検索性能がかなり信頼できるので、余計な不安を払拭できた。

ところで、僕がなぜこれまで執拗にブックマークにこだわるのかというと、偶然に任せることでしか摂取できない種類の情報というのがあるからだ。Googleで検索できる情報というのは所詮自分が多少なりとも知っていることだけで、関知しないことについてはキーワードがわからないので調べようがない。だいぶ検索精度が上がっているとはいえ、ゴミも増えている。だから、外部から供給される情報を受動的に浴び続けられるようなチャンネルに接続して、自分が意図しない情報に偶然出会う機会が重要になる。これがなければ能動的な探究もうまくできない。

そうした場で、少しでも気になる情報に巡り合ったときには、後から振り返ることができるように記録しておかなければならない。今すぐには十分理解できないなと思うような時こそなおさら。後から必要になる時が来るからだ。その時に、「無知の知」として機能する。昔偶然見つけたブログが、自分にとって見ず知らずの領域に立ち入るための入り口になるからだ。