ふれっしゅのーと

ふれっしゅのーと

趣味に生きる30代エンジニアが心に移りゆくよしなし事をそこはかとなく書きつくるブログ

Pocketの未読数を自動でグラフ化したら数年ためてた「あとで読む」をだいぶ消化できた

みなさんあとで読みたいWebサイトの管理に何を使ってますか。

僕は2014年からPocketを愛用してます。

途中で4年間ほどInstapaperに浮気してた時期もありましたが、最近バグっちゃったので再びPocketに戻ってきました。

Webサイトというより僕の場合はツイートを保存することがほとんどです。Twitterを見ていて「リンク先の記事をあとで読もう」「面白い問題なのであとでじっくり考察しよう」「詳しく調べてブログにまとめよう」などと思ったときに、気軽にポチッと保存できるので助かってます。

あまりに手軽に「あとで読む」に登録できるので、ふと気づいたら…

未読数が800件を超えていました。

ポケットがぱんぱんではち切れそうです。

土日に一生懸命「あとで読む」を消化したつもりでも、興味深いツイートをいつの間にかたくさん保存してしまっていて、プラマイゼロ、むしろプラスになっていることもしばしば。

死ぬまでに全消化できるか不安になってきました。

「あとで読む」の未読数を可視化したい

漠然としたタスク量に追われてるときは

数値を「可視化」するに限ります!

どれぐらい「あとで読む」が残っていて、日々どれぐらいのスピードで消化できているのかをグラフにすれば、目標がわかりやすくなり、精神的に救われます。

しかしズボラな自分には毎日未読数をプロットしてグラフを手作業で作るような芸当は無理です。そこでプログラミングの出番となります。

Pocketの未読リストの取得

まずは「あとで読む」がどれだけ残っているかをサクッと取得したいのですが、Pocketにログインしても未読数の情報はどこにも表示されず、アイコンの右上に表示される通知バッジぐらいでしか未読数を知ることができません。

公式ヘルプページによると

http://getpocket.com/users/USERNAME/feed/unread

で未読数のRSSフィードが提供されているのですが、ここからプログラムで取得するためにはBasic認証を突破しなければなりません。GoogleAppsScriptでPocketの未読を取得する - /var/www/yatta47.logソースコードをベースにして、Basic認証用のオプションを追加して、何度か試行錯誤を繰り返してみたところ…

見事にパスワードロックが掛かって24時間使用不能になりました。

やっちまいました。この方法は諦めです。

Basic認証なしでなんとか手軽に未読数を取得できないものかと調べていたら、先人が生み出した素晴らしいサービスを発見しました!

motemen.hatenablog.com

Pocket Expose』というサービスで、ログインすると自分専用の秘密のURLが生成され、そのURLを使えば面倒な認証なしでPocketの未読リストが取得できるという優れものです。

ちなみに「技術力高いな、どんな人が作ったのだろう」と気になって作者を見てみたところ、畏れ多くも「株式会社はてなCTO」という肩書きが載っていて驚きました(平身低頭)

Pocketの未読数を時系列順に出力する

Pocket Expose』で生成した未読リストURLを使えば、あとは簡単です。

0 0 * * * echo `date +'\%Y-\%m-\%d \%H:\%M:\%S'` `curl https://expocket.herokuapp.com/list/XXXX.txt | wc -l` >> pocket_unread.txt

最初はcronでこんな感じのコマンドを登録して(サーバーの負荷にならないぐらいの間隔で)定期的に日時と未読数がテキストファイルに保存されていくようにしたのですが、cronではパソコンを開いているときにしかデータを取得できません。

そこでGoogleのサーバーを利用することにしました。「あとで読む」の未読数をスプレッドシートに保存していくためのプログラムを Google Apps Script (GAS) で記述すれば、24時間365日いつでもデータを取得できます。

function countPocketUnreadArticles() {
  var date = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss');
  var getUrl = "https://expocket.herokuapp.com/list/XXXX.txt";
  var html = UrlFetchApp.fetch(getUrl).getContentText('UTF-8');

  // 未読リストの行数(改行の個数)を調べる
  var count = (html.match(/\n/g)||[]).length;

  // ログ出力
  Logger.log(date + ' ' + count);

  // Googleスプレッドシートに出力
  var spreadsheet = SpreadsheetApp.openById('XXXXXXXX');
  var sheet = spreadsheet.getSheetByName('シート1');
  var lastrow = sheet.getLastRow();
  var recordrow = lastrow + 1;
  sheet.getRange("A" + recordrow).setValue(date);
  sheet.getRange("B" + recordrow).setValue(count);
}

上記で定義した関数countPocketUnreadArticles()に対して、時間ベースのトリガーを設定することで、好きな間隔で定期実行できます。最初なので1時間おきにデータを取得するようにしましたが、一日中「あとで読む」の消化に人生を捧げているわけでもないので、落ち着いてきたら1日おきの取得に変更するつもりです。



完成

最終的にはGoogleスプレッドシートにこんな感じで「あとで読む」の未読数が時系列順に蓄積されていきます。グラフは後付けでGoogleスプレッドシートの標準機能を使って描画しました。

グラフ化すると結果がはっきりと目に見えるようになり、ガクンと急減少
したら「今日は結構頑張って未読数を減らせたぞ!」と達成感が得られ、逆にじわじわと微増したら「油断せずに未読消化にいそしまねば!」と焦燥感に駆られるようになりました。

まだ1ヶ月ほどしか運用していませんが、効果はばつぐんで、数年ためてた「あとで読む」を300件ほど消化することができました。このペースで消化していけば、あと数ヶ月で全消化できる日が来るかもしれません。

これで、孫の代まで「あとで読む」を残さないで済みそうです。

追記 (2022-09-06)

この記事の方法が使えなくなってしまったので、新しい記事を投稿しました。

fffw2.hateblo.jp