作るもの
LINEログインを利用し、アプリ上で登録したタスクを期限の日に通知をしてくれる簡単なLINEbot。
メンターとしての経験上、rails初学者でCRUDやその他簡単な機能がつけれるようになったら、ユーザーに直接通知や連絡を送る機能を付けたいと言う生徒さんがちらほらいるので記事として残します。
ちょこっといじくると期限の前日などに通知がくるようにもできます。
かなり雑な記事なのでわかりにくいところや間違いがあればなんでも言ってください!
環境
- Ruby
- Ruby on Rails 6
- Heroku
- LINE Developers(LINE Messaging API,LINEログイン)
大まかな手順
- LINEログインを実装
- LINEbotを作成しメッセージをpushしてみる
- herokuにデプロイし定期実行させる
下準備(すでに存在する場合はいらない)
- タスクと期限日を投稿するためのテーブルを作成(私は
body:string
とendday:date
を持ったpostsテーブルでやってます) - Deviseでusersテーブルを作成
- Herokuでデプロイしていても良い(どちらでもいい)
STEP1 LINEログインを実装
【画像付き】RailsでDeviseを利用してLINEログイン機能を実装
LINEログインに関してはこちらの記事を参考に実装しました。
みなさんはこちらの記事の「3.LINE Developersに登録」以降を真似して実装してみてください!
STEP2 LINEbotを作成しメッセージをpushしてみる
LINE Messaging APIの準備
- STEP1で作成したプロバイダーのチャンネル設定で
新規チャンネル作成
を選択しMessaging API
を選択 - 必要事項を記入しチャンネルを作成
- LINEログインのチャンネルの
リンクされたbot
で今作ったチャンネルのbotを選択 - Messaging API設定で「Channel access token」を発行する
- 「Channel access token」と「channel Secret」は後々使いまーす!
Railsの準備
必要なgemのインストール
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も保存させる
#省略
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
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にデプロイし定期実行させる
デプロイは自分でやってください
デプロイ完了後、.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上のサービスでコマンドを定期的に自動で実行してくれるもの
- webでherokuを開きます
- 自分のサービス一覧の中から現在作成中のものを選びます
-
Resources
にあるAdd-ons
の検索欄でHeroku Scheduler
と検索します - Heroku Schedulerを開き、
Add-job
をクリックするとモーダルがでてくる -
schedule
の部分にはタスクが実行されて欲しいタイミングを、Run Command
には先ほど作成したタスクを記入してSave job
をクリック!
※この際、タスクの頭にheroku runを記入するのを忘れないように!
あとはscheduler通りにメッセージが届けば完成です!
おまけ
LINE Developersには作成したアプリやサービスに設置する用の友達追加ボタンやQRコードなどがコピペするだけの状態で利用できるのでしっかりつけときましょう〜
参考記事
【画像付き】RailsでDeviseを利用してLINEログイン機能を実装
Rails+heroku+LINE Messager APIで秘書的なLINEbotを作ってみた(ゴミ出しの通知編)
LINE Developers ドキュメント