Edited at

今更ながらRails5+line-bot-sdk-ruby+HerokuでLineBot作成してみたら、色々詰まったのでまとめました。


はじめに

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月)と少し変わっていたので軽く説明。


  1. LINE BusinessアカウントをLINE developerにて作成。

  2. サービスからbot用のアカウントを作成。



    • https://developers.line.me/ja/services/messaging-api/

    • この時Messaging APIのDeveloper Trialを指定していないとPush送信(bot側からの発信)が利用できないので注意して下さい。(2017/11/7現在)

    • ログインすると↓こんな感じの画面になります
      スクリーンショット 2017-11-07 16.03.41.png




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. 実装


config/routes.rb

Rails.application.routes.draw do

post '/callback' => 'linebot#callback'
end


linebot_controller.rb

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になります。

スクリーンショット 2017-11-07 17.37.31.png


6. 接続確認

実際にbotを友だち追加して、メッセージを送ってみて下さい、

オウム返しされたら完成です。


Cronの設定について

Herokuを利用したことがある方はご存知のように、無料アカウントではheroku appは30分間しか起きていられません。そのため、アドオンの Heroku Scheduler などを使って上手く起こすように設定したりします。

しかし、LINE Messenger APIのおかげ?かbotが寝ている際にこちらからメッセージを送ると、起きてメッセージを返してくれます(起動のためかメッセージ返信まで少しラグがあります)

(TwitterやSlack botとかだと寝てしまうのでなんで起きるのかよく分かってないです。)


おわりに

他にもPush実装やPush画面作成のCSSで詰まった部分などお伝えしたい内容があるのですが、過剰になるため省きました。別で投稿できたらします。

Heroku+Linebot系でこの記事が上に来ることで詰まる方を減らせたら幸いです。(๑´ڡ`๑)