monoの開発ブログ

Atom フィードの更新を Twitter に投稿するステートレスな bot

フィードを Twitter に投稿するサービスはそこら中にあります。しかし、あまり未来を感じるような類のサービスではないので、複数アカウントを使おうとすると有料だったり、無料でも将来性に不安があったりします。なので、自分の用途に合わせてシンプルなものをサクッと golang で書いてみました。

ドキュメントとかはまったく無いですが、.env.example を参考に設定ファイルを作って引数で指定すれば動くと思います。

ちなみに、@mono0x_info のこのブログの更新をお知らせする機能は feed2twitter で実現しています。

このプログラムの最大の特徴は、自分の手元で状態を保持しない、すなわちステートレスであるという点です。状態を永続化して保持すると、コンテナに入れたり PaaS で動かしたりといった選択肢を選ぶのが途端に面倒になりますし、データの管理に気を使うので、特に個人の趣味の範囲ではやりたくないのです。

とはいえ、あるエントリをすでに投稿したかどうかを判断する仕組みがなければ、同じエントリを何度もツイートし続ける頭の悪い bot になってしまいます。

そこで、手元で管理するデータを無くしつつ重複したツイートを避けるために、Twitter からデータを取ってくる方法を採用しました。自分が投稿したツイートを API で取得し、ツイート中の URL をキーとして重複を排除しています。

この方法の利点は、なんと言ってもデータを一切保持する必要がないということです。とにかく適当に余っているマシンでプログラムを動かせばいいわけです。

もちろん融通が効かない点もいろいろあります。対象アカウントで bot によるお知らせ以外のツイートが多い場合、重複チェックのために辿るツイートを増やさないと重複を検知できなくなる可能性があります。フィード内にエントリが多い場合、チェック対象にする件数や期間を制限するか、重複チェックのために辿るツイートを増やさないと、実行するたびに既存のエントリが新着扱いされる無限ループに陥ります。

ちなみに、今回書いたプログラムでは投稿から1日以内のエントリだけをチェック対象にするようにしています。ここは好みとか運用とかによりそうな部分もありますし、なかなかスマートには行かないですね。それでも、個人的には利点が上回るかなとは思っています。

姉妹品で Google カレンダーの更新を Twitter に投稿する bot もあります。

いまいち理解されない Google カレンダーの更新通知ですが、共有カレンダーだとかなり便利です。@sanrio_events は google-calendar2twitter で実現しています。