時間指定してLINEbotでメッセージを送信するpush機能を実装
LINEbotでメッセージおうむ返しアプリケーションを作成 - 学習記録
上記の記事の作業を事前に済ましている前提で説明していきます。時間指定をしたいのでRakeタスクとwheneverを使って実装していきたいと思います。
また以前書いたRakeタスクについての記事を参考にしました。
やることリスト
タスクファイルを作成
$ rails g task push_line
lib/tasksディレクトリ配下にpush_line.rakeファイルが作成されました。このファイルの中にpush機能の内容などを書いていきます。今回はtaskを2つ作成しました。
namespace :push_line do desc "朝メッセージを送る" task push_line_message_morning: :environment do message = { type: 'text', text: 'あれ?まだ寝てるのかな?太陽の光を浴びてスッキリ起きよう?' } client = Line::Bot::Client.new { |config| config.channel_secret = ENV["LINE_CHANNEL_SECRET"] config.channel_token = ENV["LINE_CHANNEL_TOKEN"] } response = client.push_message(ENV["LINE_USER_ID"], message) p response end desc "夜メッセージを送る" task push_line_message_night: :environment do message = { type: 'text', text: 'もうすぐ日付超えちゃうよ〜。。今日もお疲れ様です。毎日頑張ってる君はえらい!おやすみなさい。' } client = Line::Bot::Client.new { |config| config.channel_secret = ENV["LINE_CHANNEL_SECRET"] config.channel_token = ENV["LINE_CHANNEL_TOKEN"] } response = client.push_message(ENV["LINE_USER_ID"], message) p response end end
response = client.push_message(ENV["LINE_USER_ID"], message)
このコードはメッセージを送信する相手を指定しています。Herokuなどにあげてデプロイする予定はないので、.envファイルに自分のユーザーIDを管理しておきました。
LINE_USER_ID=Your user IDを貼り付ける
※Your user IDはLINE Developersの指定チャンネル内、Basic settingに記載されています。
wheneverを使って時間指定の処理を実装
まず最初にwheneverのgemを追加して、bundle install
をします。
gem 'whenever', require: false
時間指定をするためにschedule.rbファイルを作成します。このように出力され、configディレクトリ配下にschedule.rbファイルが作成されたら成功です。
$ bundle exec wheneverize . >[add] writing `./config/schedule.rb' >[done] wheneverized!
そして作成したschedule.rbファイルに設定を追記していきます。ここでcronを使うための設定などを行っています。
そして毎朝7時と深夜11時50分に各rakeタスクの指定した処理が走るように記載しています。
require File.expand_path(File.dirname(__FILE__) + "/environment") rails_env = ENV['RAILS_ENV'] || :development set :environment, rails_env set :output, "#{Rails.root}/log/cron.log" every 1.day, at: ['7:00 am'] do rake 'push_line:push_line_message_morning' end every 1.day, at: ['11:50 pm'] do rake 'push_line:push_line_message_night' end
上記の設定を更新して実行できるようにするために下記のコマンドを打ちます。
$ bundle exec whenever --update-crontab
今回の実装では、友達登録してくれたユーザー全員にメッセージを自動送信するという実装は行っていません。
この実装で定義したrakeタスクはサーバーを起動していなくても設定時間になるとメッセージが送信されます。