GitHub Actionsを使って子供が産まれてからの週数を毎日LINEで通知する

先日子供が産まれたのですが、予防接種の問診票等で何週目か?や何ヶ月何日か?といった情報が頻繁に必要になります。

毎回計算するのが面倒だったのでLINEで毎日通知させることにしました。
定期実行はGitHub Actionsにやってもらうことにしました。

その方法を記録していこうと思います。(ChatGPTにたくさん助けてもらいました。)

1. LINE BOTのアカウントを作成

LINEにデベロッパー登録して、BOTとなるチャンネルを作成します。
デベロッパーとしての登録などの方法は他のサイトにいくらでも書いてあるので割愛します。(自分はすでにアカウントを持っていたので忘れたというのもあります)

今回使ったのはLINEのMessaging APIです。 developers.line.biz

2. LINEのメッセージ送信の実装

難しいことは特になく、行ったこととしては、主に以下です。

  • line-bot-apigemを使う
    • チャネルシークレットとチャネルアクセストークン(長期)を利用
  • broadcastメソッドを使い、友達になった全員にメッセージを送信するようにする

Messeging APIでは、ユーザーIDを指定して送信する、や友達全員に対して送信する、など色々と方法があります。

developers.line.biz

line-bot-apiではそれぞれに対応したメソッドが用意されています。

3. 日付のロジックを計算する

生まれてから何日か、何週何日かは特に考えることもなかったですが、何ヶ月何日目かは色々考えることがあって面白かったです。

  • 月の月末までの日数の考慮
    • 例: 誕生日が3/20の場合、今日が4/1場合は0ヶ月12日で、5/1の場合では1ヶ月11日ととなるように、月末が何日あるかによってズレる
  • 誕生日の日にちを迎えているかどうかで月の計算が変わる
    • 例: 今日が2/12で誕生日が1/13の場合、0ヶ月30日になるが、誕生日が1/11なら1ヶ月1日になる
  • 誕生日を迎えているかどうかで年の計算が変わる
    • 例: 今日が2024/2/12で誕生日が2023/2/11の場合、1歳だが、2023/2/13が誕生日なら0歳

実装したコード(一部)

if TODAY_MONTH >= BIRTH_MONTH
  # 例: 今が5月で誕生月が3月なら5 - 3で2ヶ月
  passed_month = TODAY_MONTH - BIRTH_MONTH
else
  # 例: 今が3月で誕生月が5月なら12 - (5 -3)で10ヶ月
  passed_month = 12 - (BIRTH_MONTH - TODAY_MONTH)
end

if TODAY_DAT_NUM >= BIRTH_DAY_NUM
  # 例: 今日が20日で誕生日が5日なら単純な引き算で15日
  passed_day = TODAY_DAT_NUM - BIRTH_DAY_NUM
else
  # 例: 今日が10日で誕生日が20日なら前月の最終日を確認しながら計算する
  prev_month_date = TODAY.prev_month
  prev_max_date = Date.new(prev_month_date.year, prev_month_date.month, -1).day
  passed_day = (previous_max_date - BIRTH_DAY_NUM) + TODAY_DAT_NUM
  # このケースだと、たとえば今が5月で誕生月が4月の場合、1月も経っていないので-1する
  passed_month -= 1
end

passed_year = TODAY_YEAR - BIRTH_YEAR
# 今年誕生日を迎えているか?を確認し、迎えていない場合は-1する
passed_year -= 1 if TODAY < Date.new(TODAY_YEAR, BIRTH_MONTH, BIRTH_DAY_NUM)
"#{passed_year}#{passed_month}ヶ月#{passed_day}"

4. GitHub Actionsで実行するためのYAMLファイルを作成

.github/workfrows下にYAMLファイルを作成するだけで勝手にGitHub Actionsが把握して実行してくれます。
cronで毎日朝9:00にAPIを叩きに行くようにしました。

docs.github.com

なお、動作確認のためにGitHub上から手動で実行できるworkflow_dispatchが便利でした。

docs.github.com

実装したYAML一部

on:
  schedule:
    - cron: '0 0 * * *' # 日本時間でAM9:00
  workflow_dispatch:

環境変数(LINEのアクセストークン等)の設定は、リポジトリの設定から可能です。

ハマりかけたポイント

1. cronで設定しても実行されない?

動作確認でcronで2分後くらいに設定してpushしたのですがその時間になってもワークフローが実行されませんでした。

設定が悪いのかな?と思ったのですが、実際には実行開始が遅れているだけのようでした。
GItHubの公式ドキュメントにそれっぽいことが書いてありました。

Note: The schedule event can be delayed during periods of high loads of GitHub Actions workflow runs

実際に、朝9:00に実行するようにスケジュールしたんですが、実行されたのは9:33でした。

2. 環境変数が反映されない?

実装の途中で環境変数を1つ追加したのですが、GitHubSecrets and variablesに設定しているのに環境変数rubyスクリプトから取得できませんでした。

なんでだ?と思って色々見ていたら、単純にYAMLファイルでXXX_KEY: ${{ secrets.XXX_KEY }}を書くのを忘れていただけでした。。。

まとめ

特に難しいことはしていないですが、ちょっと面倒だったことを解決できると嬉しいですね。
LINE APIは以前使ったことがありましたが、GitHub Actionsのcronは初めて自分で設定して使ったので勉強になりました。

github.com