積読消化のためにTwitterに進捗を表示させて緊張感を出した

はじめに

Twitter プロフィールに消化度合いを表示させると緊張感が出て捗るのでは?と思ったのでやってみた時のおぼえがき。 おまけで AWS Lambda へ自動デプロイする CI/CD チックな仕込みもやってみた。

本エントリで出てくるコードは GitHub で管理している。

https://github.com/csnagu/pile-up-twitter

GAS は gist。

https://gist.github.com/csnagu/3f0e7f2a7fcf5ace1262f4c0f78e0212

動機

ふと買ったけど読んでいない本(積読)が一体どれだけあるのか気になり Todoist へ書き出してみた。

今読む読まないは別として、参考書だけで 70 冊ほどありこれはなんとかせねばと思いつつ、何もせずに 2 ヶ月経過したのでなにかしらの手を打つことにした。 3 秒くらい考えて「誰にも見られないから緊張感がないのでは?」と考えついたので積読消化の進捗を公開することに。 公開するからにはよく目にする場所のほうが緊張感が高まって良さそうだと思い日頃開いている Twitter を使うことにした。

この記事を読んで「こんなもの作ってる暇あったら 1 冊読め」と思った人。 僕も同じこと思いました。

構成

関連サービス

  • GitHub … コードのバージョン管理
  • Twitter のプロフィールを更新
  • CloudWatch … Lambda を定期実行
  • Todoist … 積読を管理
  • GoogleSpreadsheet … 読み終わった書籍を管理
  • Google App Script … Todoist で完了したタスクを GoogleSpreadsheet に記録する
  • IFTTT … みんなの架け橋
  • Twitter … 緊張感を届ける

盛りだくさん!

構成図

全体の構成図

Todoist と GoogleSpreadsheet の間に Google Apps Script(GAS)や IFTTT が抜けているんだけど図の修正が面倒なので割愛。

仕組み

積読と読了の管理・取得

積読リストは適当なプロジェクトに分けておく(Project ID を後で使う)。 積読リストと読了リストの管理が別のアプリでややこしいが、Todoist の無料プランでは一日に完了にしたタスクを取得できないようなので割り切った。Todoist と GoogleSpreadsheet は GAS を書いて IFTTT で連携させておく。

一度積読を Todoist でリスト化してしまえば、読み終わったものを完了にすることであとは自動で回ってくれる。 賢い。

認証と twitter api との戦い

公式リファレンスを読めば全部解決! Twitter 公式リファレンス - Authentication: https://developer.twitter.com/en/docs/authentication/overview

するほどの理解力がなかったので適当にググる。 npm oauth1.0a などのキーワードでググるとちょうど良さそうなのがあった。 ゆくゆくは AWS Lambda に乗せて走らせようとここらへんで思い立ったので、言語は node.js で書くことにした。

https://www.npmjs.com/package/oauth-1.0a

あとは通信だが、昔使ったaxiosを今回も使う。

lambda で定期実行する

試行錯誤の末、ローカルでクラウド環境で走らせる。 日に 1 回実行できればいいくらい、かつ、ローカルにファイルが必要ないため今回は Lmbda を選択した。 書いたコードがそのまま動くはずなので、あまり考えずに exports.handler の中に処理を押し込めて、zip で圧縮して Lambda へアップロードした。 これは利用しているパッケージが Lambda 上で利用できないため、node_modules も含めて zip で圧縮してアップロードする必要があるため。

Lambda 上で動くのを確認したら、Lambda の Designer 欄から「トリガーを追加」を選択し、CloudWatch Events/EventBridge にて 1 日 1 実行のルールを作成する。

素晴らしい、一日一回自動で実行される様になったのだ。 (プログラムは自動で走るが本は自動で読まれたりはしない。)

環境変数に敗北

せっかく一部 AWS Lambda に自動でデプロイできれば 10 割増しでクールに見えるだろう。 ここは非常にハマったので参考資料を適宜参照しよう。

ここのハマリポイントとしては、Lambda 側の環境変数にどうやって値をセットするかという部分だ。 serverless.yml に environment として値を設定することで Lmbda 側の GitHub にアップロードするわけにはいかない。 GitHub Actions のジョブを定義している yml ファイルからのみのようで実現できなかった。うまいやり方が無いものか。。。 (そもそも秘密情報を環境変数で扱うのは間違っているような気がしていて、別の手がありそう。)

感想

async, await 周りの理解が拙くて、1 / 70 のような表記にしたかったのに NaN / undefined となってしまった。 また、Twitter で触れた OAuth や Todoist で触れた BearerToken 周りの理解が足りていなくて問題の切り分けがやりづらく感じたので上辺だけでも理解したいなと。 実装面やデプロイ面に関してはベストプラクティスのようなものがわからないまま突き進んでしまったので、このブログエントリを読んだ詳しい人教えて下さい。

何はともあれ AWS Lambda への自動デプロイができたので、今後似たようなことをやるときには割とすんなりできるようになっていると思う。

Twitter で確認できるようになったので(しかも自動更新!)、これで少しは捗るといいな。