公開日: 2021-09-01
更新日: 2021-09-04
やることになった経緯については過去記事をご覧ください。
サービスの運用をいつまで続けるかはまだ未定ですが、当分の間は続けます。そこで問題になるのは公式Twitterアカウントの運用です。公式アカウントでの投稿の共有がないと閲覧数がなかなか伸びないため、piguに投稿するメリットが弱くなってしまいます。そのため、Twitterでの投稿の共有は不可欠です。しかし、現在は全て手動でツイートしいて、投稿のURLを共有するまでにボタンを何回も押さないといけないため、正直かなり面倒です。他にも様々な問題はありますが、まずはこの問題を解決するためのシステムを構築する予定です。
FirebaseのCloud Functionsを利用して「ツイートの予約」と「自動ツイート」を行う関数を定期実行させています。管理画面ではツイートするテキストの編集、予約の取り消しやブラックリストの編集などを行うことができます(今ではTwitterで共有する必要性がなくなった「過去のお知らせ情報」などの投稿を予約可能な投稿リストから除外することが主な目的です)。
予約したツイートなどのデータは全てpiguと同じデータベース(Cloud Firestore)で管理しています。「自動ツイート」する関数内でFirestoreから予約リストを取得し、Tweet Atフィールドの日付が現在の時刻よりも前であるものをツイートするという流れになっています。ちなみに、Twitter Ads APIを使えばWeb版Twitterの予約ツイート機能を利用できるらしいですが、今回は申請をしてから利用できるようになるまで待てなかったので利用しませんでした。
これまでに動的OGPの生成(httpリクエスト)や検索用インデックスの更新(firestoreトリガー)にCloud Functionsを利用した経験がありましたが、関数を定期実行させる方法はわかりませんでした。Cloud FunctionsのドキュメントによるとGCPのPub/SubとCloud Schedulerを利用して実現可能とのことだったので利用しました。
処理の流れとしてはCloud Schedulerによってイベントがトリガーされ、Pub/Subを経由してCloud Functionsの関数が実行されるようです。これだけ聞くと複雑で大変そうですが、実際はCloud Functions側でトリガー方法を変更するだけなので、コードを数行書き変えるだけで済みました。時間の設定も想定していたより柔軟に対応できました。例えば「10時〜23時の時間帯に1時間毎にイベントを実行する」みたいな感じです(知ってる方からすれば当たり前かもしれません)。今後また何か自動化したいことがあれば利用したいです。
今回はビルドツールにViteを使用してみました。最近まで「バイト」と呼んでたのですが「ヴィート」が正しいようです。Webpackとの大きな違いはサーバーの起動や更新に時間がかかってしまう原因となる「バンドル」という工程をES Modulesを活用することで効率的に行うことができる点です。開発時のリロードが高速で、開発体験がとても良かったです。この辺の仕組みについては公式ドキュメントの他にNative ESM時代とはなにかというZenn記事が参考になると思います。
特に大きな問題なく無事に実装することができて良かったです。これで毎日ボタンをポチポチせずに済みます!!