最終更新: 2026-02-14
対象コード: src/ 配下(LINE Bot / Web / Firestore 実装)
- 目的
- もの・タスクの期限を登録し、一覧管理と期限通知を行う。
- 提供チャネル
- LINE 個人チャット(自然文入力)
- Web 画面(一覧/追加/更新/削除/復元)
- 永続化
- Firestore(本番)
- Firestore Emulator(ローカル結合テスト)
-
Webhook:
POST /callback -
主な機能
- 友だち追加時メッセージ送信
- 自然文からの登録/更新/削除/ガイド/一覧/Web/ログイン意図推定
- 実行前確認(「はい / いいえ」 or postback)
- 一覧表示トリガー(例:
一覧表示,リスト表示) - Web リンク返信トリガー(例:
webで操作,webで表示) - 使い方ガイド返信トリガー(例:
使い方,使い方教えて,何ができる) - ログイントリガー(例:
ログイン,webにログイン,サインイン)
-
意図推定
OPENAI_API_KEYがある場合: OpenAI Chat Completions で JSON 解析- ない場合: 正規表現ベースのフォールバック解析
- 出力スキーマ:
intent,item_name,expiry_date intentはregister|update|delete|help|list|web|login|noneexpiry_dateはYYYY-MM-DDのみ許可help/list/web/loginは非CRUDのため確認フローなしで該当ユースケースへルーティング
-
安全制御
- 一括操作文言(例: 全部削除)を
none判定 - プロンプト注入系文言(例: system prompt 表示要求)を
none判定 - 不確実な相対日付(来週/再来週など)は
none判定 - すべて確認フェーズを通過しない限り実行しない
- 一括操作文言(例: 全部削除)を
-
実行確認フロー
- ユーザー文を解析
- Firestore
line_pending_operationsに保留操作保存 - 「実行しますか?」ボタン返信
はい/intent_confirm:yesで確定実行いいえ/intent_confirm:noでキャンセル- 期限なしで登録した場合は、続けて期限設定を提案(例:
15日で,明日で,3/15で)
-
期限なし登録の直後フォロー
- 対象: 期限なしで登録確定した直後の同一ユーザー
- 入力例:
じゃあ15日で,明日で,3/15で,2026-03-15で なし/不要/いらないで期限未設定のまま終了- 更新対象は「直前に登録した同名の active アイテム(最新1件)」
- API:
POST /_api/v1/check_expire - スケジューラ想定(GCP)
- Cloud Scheduler から日次実行
- 実行時刻: 毎日 12:00(JST)
- cron 例:
0 12 * * * - timezone:
Asia/Tokyo
- 処理
- LINE ユーザーごとに
status=1のアイテムを取得 - 期限が3日以内(当日/翌日/3日後まで)のものが1件でもあるユーザーにのみ push 通知
- 通知メッセージ1: 期限3日以内アイテム一覧
- 通知メッセージ2: Web 一覧 URL
- 通知メッセージ3: 通知ONアイテム一覧(期限有無とは別軸)
- 期限切れ/期限なし/4日以上先は「期限3日以内一覧」には含めない
- LINE ユーザーごとに
- API:
POST /_api/v1/check_habit_tasks - 初期仕様
- 繰り返し単位は
dailyのみ - 指定時刻 (
HH:MM) に到達したタスクを通知
- 繰り返し単位は
- 通知内容
習慣タスク確認: "<タスク名>" を実施しましたか?- ボタン:
OK/NG/その他
- 返信処理
OK-> 実施ログ (done)NG-> 未実施ログ (not_done)その他-> 追加入力待ちに遷移し、次のテキストをメモとしてログ化 (other)
-
画面
/トップ/stock一覧(要ログイン)/stockPOST 追加/stock/updatePOST 更新/stock/deletePOST 論理削除/stock/deleteGET ゴミ箱/stock/restorePOST 復元/stock/complete_deletePOST 物理削除/habit習慣タスク一覧・追加/habit/<task_id>習慣タスク実績リスト/registerユーザー登録/line/login,/line/authorizeLINE OAuth ログイン/line/approveLINE 連携承認/line/registerLINE 由来ユーザー登録
-
認証
login_requiredでsession['login_user']を必須化- 未ログイン時は
/line/loginへリダイレクト - 開発時 (
FLASK_ENV=development) は/loginローカル認証を利用可能
- 主な項目
_id(Doc ID)item_name: strowner_id: str(LINE user id または Web user id)expiry_date: datetime | nullstatus: int(1=active,2=archived運用)notify_enabled: bool(通知ON/OFF、初期値OFF)created_at,updated_at
- 主な項目
_idline_user_nameline_user_idcreated_at,updated_at
- 主な項目
_idweb_user_nameweb_user_emaillinked_line_user_idis_linked_line_usercreated_at,updated_at
- 主な項目
line_user_idoperation(intent,item_name,expiry_date)updated_at
- 主な項目
_idowner_idtask_namefrequency(初期はdaily)notify_time(HH:MM)is_activecreated_at,updated_at
- 主な項目
_idhabit_task_idowner_idtask_name_snapshotscheduled_date(YYYY-MM-DD)result(done|not_done|other)note(その他入力)recorded_atcreated_at,updated_at
- 主な項目
_idline_user_idhabit_task_idowner_idscheduled_datestatus(awaiting_answer|awaiting_other_note)created_at,updated_at
- 登録例
卵は3/15までライブチケット購入 3/20まで打ち合わせ日程調整 2/28まで
- 更新例
卵の期限を3/22にして更新 卵 2026-03-22
- 削除例
卵を使い切った卵 削除
- 一覧/リンク
一覧表示/リスト表示webで操作/webで表示
- ログイン導線
ログイン/webにログイン/サインイン
- 使い方
使い方/使い方教えて/何ができる
- LINE
LINEBOT_CHANNEL_SECRETLINEBOT_CHANNEL_ACCESS_TOKENLINE_LOGIN_CHANNEL_IDLINE_LOGIN_CHANNEL_SECRET
- OpenAI
OPENAI_API_KEYOPENAI_MODEL(default:gpt-4o-mini)
- Firestore
FIRESTORE_PROJECT_IDFIRESTORE_EMULATOR_HOST(ローカル時)
- App
SERVER_URLFLASK_ENVLOCAL_AUTH_USER_CODE,LOCAL_AUTH_PASSWORD(開発ログイン)
- Cloud Run
- project_id:
simple-alert-line-bot - service_name:
simple-alert-line-bot
- project_id:
- テスト
venvを利用- ローカル結合テストは Firestore Emulator を利用
- 自然文優先で運用しているが、互換のため一部明示キーワード(
登録,一覧,URL,アカウント連携)ルートは残っている。 ログイン系メッセージはURL返信(/stock?openExternalBrowser=1)へルーティングする。- 保留操作 (
line_pending_operations) に TTL は未実装。 - 日付の曖昧表現(来週など)は安全優先で実行不可。