はじめに
LinebotをRuby on Railsで開発した話になります。
Linebot、Rails+Herokuの内容の記事は既にいくつもありますが、記事の内容が古く詰まる部分が多かったので、まとめました。
主に伝えたい内容は、以下になります。
- LINE Developer用のページが新しくなっていたこと
- HerokuのaddonであるFixieを使用する必要ないこと(クレジットカード登録不要ということ)
- Rails5により
gem install
不要なパッケージがあったこと。 - 寝かせないためのcronの設定は不要なこと
当方、Railsについては初心者のため、理解できてない部分説明不足な点があるかもしれません。その際はコメントでご指摘頂けると幸いですm(_ _)m
※ 1/31追記 callback関数でhead :ok
を返すようにしました。
環境
- Ruby 2.4.2p198
- Rails 5.1.4
LINEbotアカウント作成
Developer用のページが以前(2017/7月)と少し変わっていたので軽く説明。
- LINE BusinessアカウントをLINE developerにて作成。
- サービスからbot用のアカウントを作成。
- https://developers.line.me/ja/services/messaging-api/
- この時Messaging APIのDeveloper Trialを指定していないとPush送信(bot側からの発信)が利用できないので注意して下さい。(2017/11/7現在)
- ログインすると↓こんな感じの画面になります
Herokuにbot用app追加
- Herokuでアカウント作成して、bot用appを追加して下さい。
- 今回こちらからaddonは追加しないのでクレジットカードの登録は不要です!
FixieとかLine側のIPのWhitelistの設定は不要
大体Heroku*LineBot系の記事を見るとFixieというHeorkuのAddOnを使ってIPを固定しようとしているのですが,Line側のIPのWhitelistの設定は今年の4月ぐらいから任意になっているためその辺の設定不要です(FixieがあるとアウトバウンドのProxyを指定しなくてはいけないのでSDKが使えなくなる).
参考 : Heroku(+Scheduler) + RailsでLineのリマインダーBotを作ったら世界に平和が訪れた
Railsプロジェクトの作成
淡々と公式通りに進めていけば大丈夫です
https://devcenter.heroku.com/articles/getting-started-with-rails5
1. アプリケーションの作成
Heorkuがpostgresqlで動いているため、postgresqlオプションをつけておくと諸々設定してくれます。
rails new sample_bot --database=postgresql
2. Gemfileにline-bot-api
を追記
line-bot-sdk-rubyを使用するため、Gemfileを編集
ここで、他の記事ですとログ出力用にgem 'rails_12factor'
も入れるとありますが、Rails5では不要になりました。
参考 : https://devcenter.heroku.com/articles/getting-started-with-rails5#heroku-gems
gem 'line-bot-api'
パッケージをインストール
bundle install
動作確認
rails s
http://0.0.0.0:3000/ に接続できれば大丈夫です。
4. HerokuへDeploy
ログインしてなければ
heroku login
Git repositoryを作成
git init
heroku git:remote -a <herokuのapp名>
git add .
git commit -m "init"
git push heroku master
https://<heroku app名>.herokuapp.com/
にアクセスして接続できれば大丈夫です。
Bot作成
公式サンプル見ながら、テンプレであるオウム返しbotを作ります。
1. コントローラーの作成
rails g controller linebot
2. 環境変数の設定
Gemfiileに追記&インストール
gem 'dotenv-rails'
bundle install
Heroku側に環境変数を設定
heroku config:set LINE_CHANNEL_SECRET=xxxx
heroku config:set LINE_CHANNEL_TOKEN=xxxx
SettingsのReveal Config Varsからでも設定出来ます。
3. 実装
Rails.application.routes.draw do
post '/callback' => 'linebot#callback'
end
class LinebotController < ApplicationController
require 'line/bot' # gem 'line-bot-api'
# callbackアクションのCSRFトークン認証を無効
protect_from_forgery :except => [:callback]
def client
@client ||= Line::Bot::Client.new { |config|
config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
}
end
def callback
body = request.body.read
signature = request.env['HTTP_X_LINE_SIGNATURE']
unless client.validate_signature(body, signature)
head :bad_request
end
events = client.parse_events_from(body)
events.each { |event|
case event
when Line::Bot::Event::Message
case event.type
when Line::Bot::Event::MessageType::Text
message = {
type: 'text',
text: event.message['text']
}
client.reply_message(event['replyToken'], message)
end
end
}
head :ok
end
end
4. Deploy
本来はローカルで確認しないといけないですが、replyToken
が用意できないためこのままDeployします。
git add .
git commit -m "add linebot_controller"
git push heroku master
5. LINE DeveloperへWebhook URLの設定
LINE Developersのページで作成したbot用アカウントの基本設定を開き、Webhook URLを設定します。
今回ですと、https://<herokuのapp名>.herokuapp.com/callback
になります。
6. 接続確認
実際にbotを友だち追加して、メッセージを送ってみて下さい、
オウム返しされたら完成です。
Cronの設定について
Herokuを利用したことがある方はご存知のように、無料アカウントではheroku appは30分間しか起きていられません。そのため、アドオンの Heroku Scheduler などを使って上手く起こすように設定したりします。
しかし、LINE Messenger APIのおかげ?かbotが寝ている際にこちらからメッセージを送ると、起きてメッセージを返してくれます(起動のためかメッセージ返信まで少しラグがあります)
(TwitterやSlack botとかだと寝てしまうのでなんで起きるのかよく分かってないです。)
おわりに
他にもPush実装やPush画面作成のCSSで詰まった部分などお伝えしたい内容があるのですが、過剰になるため省きました。別で投稿できたらします。
Heroku+Linebot系でこの記事が上に来ることで詰まる方を減らせたら幸いです。(๑´ڡ`๑)