LoginSignup
149

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-11-08

はじめに

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系でこの記事が上に来ることで詰まる方を減らせたら幸いです。(๑´ڡ`๑)

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
149