本文
FollowGrowのMonthly Todo(締め切り付きの目標管理機能)に、締め切りをアプリの外部と連携させる2つの機能を追加しました。
背景
アプリ内で締め切りが可視化されていても、アプリを開かなければ気づけないという課題がありました。普段使っているツール(LINE、Googleカレンダー)と連携させることで、より実用的な締め切り管理にすることを目指しました。
Googleカレンダー連携
各目標に「カレンダーに追加」ボタンを設け、ワンクリックでGoogleカレンダーに締め切りを登録できるようにしました。OAuth認証のような複雑な仕組みを組まずに、Googleカレンダーが提供する「事前入力済みURL」の仕組みだけで実現しています。実装にあたっては、DjangoのDateTimeFieldが内部的にUTC(協定世界時)で保存されている点を踏まえ、Googleカレンダー側が要求する日時形式に正しく変換する処理を加えました。
LINE通知
締め切りの3日前・1日前に、LINEでリマインドが届く機能を実装しました。当初検討していたLINE Notifyは既にサービスが終了していたため、LINE Messaging APIを採用しています。
ここで最も工夫したのが、ユーザーとLINEアカウントの紐付け方法です。「友だち追加するだけで自動連携する」仕組みも検討しましたが、これにはLIFF(LINE Front-end Framework)という追加の技術要素が必要になることが分かりました。そこで、プロフィール画面に連携コードを表示し、ユーザーがそれをBotに送信することで連携する、というシンプルな方式に設計を変更しました。この判断により、複雑な技術要素を増やさずに、複数ユーザーに対応できる連携の仕組みを実現できました。
定期的な締め切りチェックには、GitHub Actionsのスケジュール実行を利用し、Django側に用意した専用のエンドポイントを、毎日自動で呼び出す構成にしています。
実装で直面した課題と、切り分けのプロセス
この機能は、実装した後も、通知がなかなか届かないという状態が続き、原因を1つずつ切り分ける作業が必要でした。
- URLの構造ミスによる404エラー
- CSRF保護による403エラー
- 依存ライブラリの記述漏れによるデプロイ失敗
- タイムゾーンの違いによる日付判定のズレ(UTCと日本時間で、締め切り日の判定が1日ずれる)
- LINE Developers ConsoleでのWebhook設定の有効化漏れ
これらを、ログを1つずつ確認しながら、順番に解消していきました。特に、Renderの本番環境でしか再現しない問題(ローカルでは動くが、本番ではライブラリが見つからずデプロイが失敗する、など)には、「ローカルとデプロイ環境の違い」を強く意識させられました。
この経験から得たこと
外部サービスとの連携は、自分のコードだけを見ていては気づけない、環境依存の問題が多く発生します。今回は、エラーメッセージやログを手がかりに、原因を1つずつ機械的に切り分けていくことで、最終的に、最初に立てた設計方針(合言葉方式によるシンプルな連携)を、崩さずに実現できました。