学習記録

アウトプット用に作りました

時間指定して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タスクはサーバーを起動していなくても設定時間になるとメッセージが送信されます。