← 一覧に戻る
Phase 2: みんなが使えるようにする(電話番号登録 + 使いすぎ防止)
2026年3月14日 18:12 更新
MD から自動変換されたページです。内容について質問があれば右下の ? ボタンからどうぞ。
今の問題
今のBotは「あなた専用」。電話番号がコードに直書きされてて、友達が使おうとしても全部あなたの電話にかかっちゃう。友達に試してもらうには:
- ユーザーごとに電話番号を登録できるようにする
- 使いすぎを防ぐ仕組みを入れる(1回の電話で約20〜30円かかるから、無制限だと破産する)
Codex(GPT-5.4)にレビューしてもらって見つかった危険な穴
プランの初版をCodexにチェックしてもらったら、「このまま作ると危険なものがきれいにできあがるだけ」と3つの致命的な問題を指摘された:
穴1: 電話番号を再送信するだけで無料枠がリセットされる
- 何が起きる: 月10回の制限に達しても、電話番号をもう一度送るだけで回数がゼロに戻る
- 原因: データの保存方法(INSERT OR REPLACE)が「古いデータを消して新しく入れ直す」動きだった
- 対策: 「電話番号だけ上書きして、回数はそのまま」に変更した
穴2: 誰でも好きな番号に電話をかけられる
- 何が起きる: LINEで友達追加した人が適当な電話番号を送ると、知らない人の電話にBotから電話がかかる。迷惑電話の発信装置になる
- 対策: β版(テスト版)では「招待制」にする。あなたが許可したLINEユーザーだけが使える仕組みを追加
穴3: 月初に100件まとめて予約すると制限を突破できる
- 何が起きる: 無料枠チェックは「登録する時」、回数カウントは「電話が成功した後」。このタイミングのズレで、月初に大量予約すれば全部通る
- 対策: 「まだ電話してない予約」の件数も含めてチェックするように変更
やること(6ステップで順番に実装)
ステップ1: 電話番号かどうかを見分ける機能を作る
LINEに「09012345678」と送ったら電話番号として扱い、「明日9時に歯医者」はリマインダーとして扱う。この判定をする関数(プログラムの部品)を作る。
チェックするパターン:
09012345678 → 電話番号 ✓
090-1234-5678(ハイフン付き) → 電話番号 ✓
080〜、070〜 → 電話番号 ✓
明日9時に歯医者 → 電話番号じゃない ✗
0901234567(桁数が足りない) → 電話番号じゃない ✗
09012345678です(余計な文字が付いてる) → 電話番号じゃない ✗
090…(全角数字) → 電話番号じゃない ✗
ステップ2: 電話番号の登録 + 招待制の仕組み
LINEに電話番号を送ると、データベース(情報を保存する倉庫)に登録される。
ただし許可されたユーザーだけが使える。
動き:
- 許可ユーザーが
09012345678 を送信 → 「電話番号を登録したよ!」と返信
- 許可ユーザーが別の番号を再送信 → 番号だけ更新、回数はそのまま
- 許可されてないユーザーが何か送信 → 「このBotはβ版で招待制だよ」と返信
ステップ3: 電話番号未登録の人にはリマインダーを受け付けない
電話番号を登録してない人が「明日9時に歯医者」と送っても、電話先がわからないから受け付けない。
動き:
- 電話番号を登録してない人がリマインダーを送信 → 「電話番号を教えてね(例: 09012345678)」と返信
- 電話番号を登録済みの人がリマインダーを送信 → 今まで通り登録される
ステップ4: 電話をかける時に、ユーザーごとの電話番号を使う
今はコードに書かれた固定の番号にしか電話できない。これを「登録された番号に電話する」に変える。
動き:
- リマインダーの時間が来る → そのユーザーが登録した番号に電話
- もしユーザーが見つからない(登録を消してたとか) → エラーとして記録
デプロイ前にやること:
- 今あるリマインダーが「ユーザー未登録」でエラーにならないよう、あなた自身のデータを先に登録しておく
ステップ5: 電話が成功したら回数をカウントする
月ごとに「何回電話したか」を数える。月が変わったらカウントをリセット。
動き:
- 電話が成功 → 今月のカウントを+1
- 月が変わった後の最初の電話 → カウントを1にリセット
- 月の判定は日本時間(JST)基準 — 3月31日の深夜0時はJSTで判定(サーバーはイギリス時間なので、ここを間違えると月初の判定がずれる)
ステップ6: 月10回の使用制限
月10回を超えたらリマインダーを受け付けない。
動き:
- 今月の電話回数(8回) + 予約中の件数(2件) = 10 → 「今月の無料枠を使い切ったよ」と返信
- 今月の電話回数(5回) + 予約中の件数(2件) = 7 → 通常通り登録OK
- 先月の回数が10でも、今月はリセットされて0からスタート
- 予約中(まだ電話してない)の件数も含めてチェック ← これが穴3の対策
今回は対応しないこと(Phase 3以降)
- 電話の二重発信防止: 毎分動くプログラムが重なって同じ電話を2回かけるリスク(今のPhase 1からある問題)
- 電話番号の本人確認: 送った番号が本当にその人のものかSMSで確認する仕組み(β版では招待制で代替)
- 050番号への切り替え: 申請中。番号が届いたら設定を差し替えるだけ
作り方の方針
- 各ステップでテストを先に書く(RED: テストが失敗する状態)
- テストを通す実装は Codex(GPT-5.4)に任せる(GREEN: テストが通る状態)→ コンテキスト温存
- 実装後に私がレビューして整理(REFACTOR)
- 各ステップ完了後に
tsc --noEmit(型チェック)→ pnpm test(テスト実行)→ コミット&プッシュ
最終確認(全ステップ完了後)
- 許可されてないユーザーでメッセージ送信 → 「β版で招待制」と返ってくる
- 許可ユーザーで
09012345678 を送信 → 「電話番号を登録したよ!」と返ってくる
明日9時に歯医者 を送信 → リマインダーが登録される
- 時間が来たら → 登録した番号に電話がかかる
- 月10回使った後にリマインダー送信 → 「無料枠を使い切った」と返ってくる
変更するファイル
| ファイル |
何をするか |
schema.sql |
ユーザー情報を保存するテーブルを追加 |
src/index.ts |
メインのプログラム全体に変更を入れる |
src/index.test.ts |
webhookのテストを更新・追加 |
src/cron.test.ts |
電話発信のテストを更新・追加 |
wrangler.toml |
許可ユーザーリストの設定を追加 |
src/phone.ts(新規) |
電話番号の判定・変換の関数 |
src/phone.test.ts(新規) |
上記のテスト |