🐣
[作ってみた] Ruby on Rails で LINE BOT
0. 初めに
A. Rails歴半年程度です、お察しください。
1. 開発環境
| Name | Plan | |
|---|---|---|
| IDE | AWS Cloud9 | |
| PaaS | Heroku | |
| Data store | Heroku Postgres | Hobby Dev |
| Data store | Heroku Redis | Hobby Dev |
| Scheduler | Heroku Scheduler | Standard |
2. ブロック図

A. LINEでのログイン情報(アクセストークン)を利用してデータにアクセスする
B. データの登録編集表示はRuby on Railsで作成したWebサイトで行う
C. データの表示はLINE BOTでも行える
D. リマインダー通知はLINE Notifyを通して行う
3. ルートイメージ

4. サイトイメージ

5. 操作 - フォローとコマンド
- [LINE] BOTと友達になる。
- [LINE -> Rails] Followイベントが発生する。
- [Rails -> Postgres] 管理者として登録される。
- [LINE] "こまんど"と発言する。
- [LINE -> Rails] Messageイベントが発生する。
- [Rails -> LINE] コマンド一覧を返す。
- [LINE] "Show events"ボタンを押す。
- [LINE -> Rails] Postbackイベントが発生する。
- [Rails -> LIFF] Reminder BOT Webサイトを表示する。
6. 操作 - フォローとコマンド(二人目以降)
- [LINE] BOTと友達になる。
- [LINE] "こまんど"と発言する。
- [LINE] "Register"ボタンを押す。
- [LINE -> Rails] Postbackイベントが発生する。
- [Rails -> Postgres] ユーザーとして登録される。
- [LINE] "こまんど"と発言する。
- [LINE] "Show events"ボタンを押す。
- [LINE -> Rails] Postbackイベントが発生する。
- [Rails -> LIFF] Reminder BOT Webサイトを表示する。
7. LINE コマンド

| コマンド | 動作 | 備考 |
|---|---|---|
| こまんど | コマンドボタン一覧を表示 | 8. コマンドボタン |
| ばいばい | BOTを退出させる | |
| きょう | 今日の予定を表示 | 現在時までに終了した予定は含まない |
| あした | 明日の予定を表示 | |
| きょうあした | 今日と明日の予定を表示 | 現在時までに終了した予定は含まない |
| こんしゅう | 今週の予定を表示 | 現在時までに終了した予定は含まない |
| らいしゅう | 来週の予定を表示 | |
| こんげつ | 今月の予定を表示 | 現在時までに終了した予定は含まない |
| らいげつ | 来月の予定を表示 | |
| ?[WORD] | [WORD]に指定した言葉を含む予定を表示 |
※ 定期予定は次回分のみ表示
8. コマンドボタン
| コマンド | 機能 | 対象者 |
|---|---|---|
| Register | ユーザーとして登録する | ユーザーのみ |
| Show events (All) | Reminder BOT Webサイトを表示する | 管理者のみ (全ての予定を表示する) |
| Show events | Reminder BOT Webサイトを表示する | 全て (自分の予定を表示する) |
| Sidekiq | Sidekiq Webサイトを表示する | 管理者のみ |
9. Reminder BOT Webサイト
9-1-1. 予定一覧画面

9-1-2. 各要素の動作
| 要素 | 動作 | 備考 |
|---|---|---|
| Createボタン(青色) | 予定作成画面へ | |
| Dataボタン(緑色) | 予定編集画面へ | |
| Deleteボタン(赤色) | 予定を削除する |
※ 終了済みの予定には"[Ended]"と表記
※ 次の通知には"[Next time]"と表記
9-2-1. 予定作成画面

9-2-2. 各要素の動作
| 要素 | 動作 | 備考 |
|---|---|---|
| Backボタン(青色) | 予定一覧画面へ | |
| Title | タイトル | |
| Description | 説明 | |
| Start date | 開始日 | |
| End date | 終了日 | |
| Start time | 開始時間 | |
| End time | 終了時間 | |
| Day of week | 曜日 | |
| With order | 何番目 | 曜日と組合せて、「第ニ金曜日」などを表す |
| Week of month | 何週目 | 曜日と組合せて、「第四週の火曜日」などを表す |
| Day of month | 月の特定の日 | 毎月25日や末日(-1を選択)などを表す |
| Reminder-1 | 通知1 | |
| Reminder-2 | 通知2 | |
| Reminder-3 | 通知3 | |
| Create eventボタン(緑色) | 予定を作成する |
9-2-3. 主な入力規則
| 要素 | 空欄 | 備考 |
|---|---|---|
| Title | 不可 | |
| Description | 可 | |
| Start date | 可 | 1. 現在日以降であること |
| End date | 可 | 1. 開始日が入力されていること 2. 開始日以降であること |
| Start time | 可 | 1. 開始日が入力されている場合、現在時以降であること |
| End time | 可 | 1. 開始時が入力されていること 2. 開始時以降であること 3. 開始日が入力されている場合、開始日時以降であること |
| Day of week | 可 | 1. 開始日と開始時が入力されていないこと 2. 月の特定の日が入力されていないこと |
| With order | 可 | 1. 曜日が入力されていること |
| Week of month | 可 | 1. 曜日が入力されていること |
| Day of month | 可 | 1. 開始日と開始時間が入力されていないこと 2. 曜日が入力されていないこと |
| Reminder-1 | 不可 | |
| Reminder-2 | 不可 | |
| Reminder-3 | 不可 |
9-3-1. 予定編集画面

9-3-2. 各要素の動作
| 要素 | 動作 | 備考 |
|---|---|---|
| Backボタン(青色) | 予定一覧画面へ | |
| Save eventボタン(緑色) | 編集を保存する |
※上記以外は予定作成画面(9-2-2. 各要素の動作)と同等
9-3-3. 主な入力規則
※予定作成画面(9-2-3. 主な入力規則)と同等
9-4-1. ユーザー一覧画面

9-4-2. 各要素の動作
| 要素 | 動作 | 備考 |
|---|---|---|
| Dataボタン(緑色) | ユーザー編集画面へ | |
| Deleteボタン(赤色) | ユーザーを削除する |
9-5-1. ユーザー編集画面

9-5-2. 各要素の動作
| 要素 | 動作 | 備考 |
|---|---|---|
| Backボタン(青色) | ユーザー一覧画面へ | |
| LINE name | ユーザー名 | LINEサーバーより取得 |
| Activate | アクティベート | ユーザーの有効/無効 |
| Notify token | トークン | LINE Notifyより取得 |
| Expires in | 有効期限 | |
| Reminded at | 最終通知日時 | |
| Save userボタン(緑色) | 編集を保存する |
9-5-3. 主な入力規則
| 要素 | 空欄 | 備考 |
|---|---|---|
| LINE name | 不可 | |
| Activate | 不可 | |
| Notify token | 可 | |
| Expires in | 可 | |
| Reminded at | 可 |
10. Sidekiq Webサイト

11. LINE Notfiy

12. 管理者とユーザーの権限
| 操作 | 管理者 | ユーザー |
|---|---|---|
| Users [表示、編集、削除] | 全て | 自分のみ (編集はNotify tokenのみ) |
| Events [登録、表示、編集、削除] | 全て | 自分のみ |
13. ソースコード
14. 環境変数
・Development、Production、Test
| 要素 | 説明 | 備考 |
|---|---|---|
| LINE_CHANNEL_ID | LINE チャネルID | LINE Developersより取得 |
| LINE_CHANNEL_SECRET | LINE チャネルシークレット | LINE Developersより取得 |
| LINE_CHANNEL_TOKEN | LINE チャネルアクセストークン | LINE Developersより取得 |
| LIFF_CHANNEL_ID | LIFF チャネルURL | LINE Developersより取得 |
| LIFF_CHANNEL_URL | LIFF チャネルURL | LINE Developersより取得 |
| HASH_SALT | Hash Salt | テストでは使用しない |
| ENCRYPTION_PEPPER | Encryption Pepper | |
| HEROKU_URL | Heroku URL | |
| SIDEKIQ_USERNAME | Sidekiq Username | |
| SIDEKIQ_PASSWORD | Sidekiq Password | |
| LINE_NOTIFY_TOKEN | LINE Notifyトークン | LINE Notifyより取得 |
・Test専用
| 要素 | 説明 | 備考 |
|---|---|---|
| HASH_SALT_TEST | Hash Salt | テスト中の低コスト生成用 |
15. おわり
様々な面で不足している部分が多いことは認識しています。
ひとまずの成果物としてアウトプットしました。
Discussion