25
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

作るもの

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

スクリーンショット 2021-11-18 18.39.05.png

スクリーンショット 2021-11-18 18.41.02.png

環境

  • Ruby
  • Ruby on Rails 6
  • Heroku
  • LINE Developers(LINE Messaging API,LINEログイン)

大まかな手順

  1. LINEログインを実装
  2. LINEbotを作成しメッセージをpushしてみる
  3. herokuにデプロイし定期実行させる

下準備(すでに存在する場合はいらない)

  • タスクと期限日を投稿するためのテーブルを作成(私はbody:stringendday:dateを持ったpostsテーブルでやってます)
  • Deviseでusersテーブルを作成
  • Herokuでデプロイしていても良い(どちらでもいい)

STEP1 LINEログインを実装

【画像付き】RailsでDeviseを利用してLINEログイン機能を実装
LINEログインに関してはこちらの記事を参考に実装しました。
みなさんはこちらの記事の「3.LINE Developersに登録」以降を真似して実装してみてください!

STEP2 LINEbotを作成しメッセージをpushしてみる

LINE Messaging APIの準備

  1. STEP1で作成したプロバイダーのチャンネル設定で新規チャンネル作成を選択しMessaging APIを選択
  2. 必要事項を記入しチャンネルを作成
  3. LINEログインのチャンネルのリンクされたbotで今作ったチャンネルのbotを選択
  4. Messaging API設定で「Channel access token」を発行する
  5. 「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を開きます
  2. 自分のサービス一覧の中から現在作成中のものを選びます
  3. ResourcesにあるAdd-onsの検索欄でHeroku Schedulerと検索します
  4. Heroku Schedulerを開き、Add-jobをクリックするとモーダルがでてくる
  5. scheduleの部分にはタスクが実行されて欲しいタイミングを、Run Commandには先ほど作成したタスクを記入してSave jobをクリック!

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

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

おまけ

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

実際に挿入してみるとこんな感じ!
スクリーンショット 2021-11-18 18.54.17.png

参考記事

【画像付き】RailsでDeviseを利用してLINEログイン機能を実装
Rails+heroku+LINE Messager APIで秘書的なLINEbotを作ってみた(ゴミ出しの通知編)
LINE Developers ドキュメント

25
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?