今更ながら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/route.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)
      error 400 do 'Bad Request' end
    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系でこの記事が上に来ることで詰まる方を減らせたら幸いです。(๑´ڡ`๑)

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.