Rails6 LINEログインとプッシュ通知

# 作るもの
LINEログインを利用し、アプリ上で登録したタスクを期限の日に通知をしてくれる簡単なLINEbot。
メンターとしての経験上、rails初学者でCRUDやその他簡単な機能がつけれるようになったら、ユーザーに直接通知や連絡を送る機能を付けたいと言う生徒さんがちらほらいるので記事として残します。
ちょこっといじくると期限の前日などに通知がくるようにもできます。
かなり雑な記事なのでわかりにくいところや間違いがあればなんでも言ってください！

![スクリーンショット 2021-11-18 18.39.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674324/49f3663b-6d5d-2bb2-d89f-6d801915dd2a.png)

![スクリーンショット 2021-11-18 18.41.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674324/2253b851-0a01-82c0-eb8d-b6af50370b95.png)



# 環境
- Ruby
- Ruby on Rails 6
- Heroku
- LINE Developers（LINE Messaging API,LINEログイン）

# 大まかな手順
1. LINEログインを実装
1. LINEbotを作成しメッセージをpushしてみる
1. herokuにデプロイし定期実行させる

# 下準備（すでに存在する場合はいらない）
- タスクと期限日を投稿するためのテーブルを作成（私は`body:string`と`endday:date`を持ったpostsテーブルでやってます）
- Deviseでusersテーブルを作成
- Herokuでデプロイしていても良い（どちらでもいい）

# STEP1 LINEログインを実装
[【画像付き】RailsでDeviseを利用してLINEログイン機能を実装](https://qiita.com/s10aim_tana/items/2d174d4e31e4041700ee)
LINEログインに関してはこちらの記事を参考に実装しました。
みなさんはこちらの記事の「3.LINE Developersに登録」以降を真似して実装してみてください！

# STEP2 LINEbotを作成しメッセージをpushしてみる
### LINE Messaging APIの準備
1. STEP１で作成したプロバイダーのチャンネル設定で`新規チャンネル作成`を選択し`Messaging API`を選択
1. 必要事項を記入しチャンネルを作成
1. LINEログインのチャンネルの`リンクされたbot`で今作ったチャンネルのbotを選択
1. Messaging API設定で「Channel access token」を発行する
1. 「Channel access token」と「channel Secret」は後々使いまーす！

### Railsの準備
必要なgemのインストール

```Gemfile.rb
gem 'rails-line-bot'
```

```
$bundle insatall
```

LINEログインの際にも使用した.envファイルに以下を記入

```
LINE_CHANNEL_SECRET=[channel Secret]
LINE_CHANNEL_TOKEN=[Channel access token]
```

投稿されたタスクが誰のタスクかを判断させるためにpostsにカラムを追加する（LINEログインすることでusersのuidに登録されたそれぞれのユーザーのLINEユーザーIDをpostsのレコードごとに登録するためのカラム）

```
$rails g migration AddColumnToPosts user_uid:string

$rails db:migrate
```

タスクの投稿の際に投稿者のLINEのユーザーIDも保存させる

```posts_controller.rb
#省略
  def create
    @post = Post.new(post_params)
    @post.user_id = current_user.id
#以下の1行を追加
    @post.user_uid = current_user.uid
    if @post.save
      redirect_to posts_path
    else
      redirect_to new_post_path
    end
  end
#省略
```


### rakeタスクを追加
以下のコマンドでrakeタスクを追加します。
`push_task`の部分は好きな名前で構いません。

```
$rails g task push_task
```

```lib.tasks.push_task.rake
namespace :push_task do
    desc "LINEBOT：タスクの通知" 
    task :push_line_message_task => :environment do
        client = Line::Bot::Client.new { |config|
            config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
            config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
        }

        limit_tasks = Post.where(endday: Date.today)
        limit_tasks.each do |t|
            message = {
                type: 'text',
                text: "「#{t.body}」の期限は今日でっせ！"
            }
            response = client.push_message(t.user_uid, message)
            p response
        end
    end
end
```

タスクが登録されたか確認しましょう！

```
$rails -T
```

確認できたらローカルでタスクを投稿してから確認してみましょう

```
$rails push_task:push_line_message_task
```
以下のコマンドが表示されラインのアカウントにメッセージが来たら成功です。

```
#<Net::HTTPOK 200 OK readbody=true>
```

### STEP3 herokuにデプロイし定期実行させる
デプロイは自分でやってください:sweat:
デプロイ完了後、.envファイルに書いているLINE Developers関連の環境変数をherokuに登録します。

```
$heroku config:set LINE_KEY=
$heroku config:set LINE_SECRET=
$heroku config:set LINE_CHANNEL_SECRET=
$heroku config:set LINE_CHANNEL_TOKEN=
```

herokuの時間を日本時間に合わせます。

```
$heroku config:add TZ=Asia/Tokyo
```

実際に本番環境でアプリにLINEログインしタスクを登録したらrakeタスクが実行されるか試します

```
$heroku run rails push_task:push_line_message_task
```

### heroku scheduler
heroku上のサービスでコマンドを定期的に自動で実行してくれるもの

1. webでherokuを開きます
1. 自分のサービス一覧の中から現在作成中のものを選びます
1. `Resources`にある`Add-ons`の検索欄で`Heroku Scheduler`と検索します
1. Heroku Schedulerを開き、`Add-job`をクリックするとモーダルがでてくる
1. `schedule`の部分にはタスクが実行されて欲しいタイミングを、`Run Command`には先ほど作成したタスクを記入して`Save job`をクリック！

※この際、タスクの頭にheroku runを記入するのを忘れないように！

あとはscheduler通りにメッセージが届けば完成です！

# おまけ
LINE Developersには作成したアプリやサービスに設置する用の友達追加ボタンやQRコードなどがコピペするだけの状態で利用できるのでしっかりつけときましょう〜:raised_hand:

実際に挿入してみるとこんな感じ！
![スクリーンショット 2021-11-18 18.54.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674324/24aa43a6-c01a-e29d-da6d-3209f4bc937a.png)




# 参考記事
[【画像付き】RailsでDeviseを利用してLINEログイン機能を実装](https://qiita.com/s10aim_tana/items/2d174d4e31e4041700ee)
[Rails＋heroku+LINE Messager APIで秘書的なLINEbotを作ってみた（ゴミ出しの通知編）](https://qiita.com/natsukingdom-yamaguchi/items/e84dffdd90d7f5ef8224)
[LINE Developers ドキュメント](https://developers.line.biz/ja/docs/)