Line Messaging API オウム返しBot(rails × heroku)

  • 17
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Line Messaging APIがリリースされたのでおうむ返しBotを作ってみました。
https://devdocs.line.me/ja/

rubyのsdkも同時にリリースされたのですが、herokuと併用する際にfixieのproxy設定ができないようだったので利用しませんでした。
https://github.com/line/line-bot-sdk-ruby

Githubにもソース公開しました。
https://github.com/YoheiMiyamoto/line-bot-test

アカウント

作成

以下のガイダンスに沿って、
https://developers.line.me/messaging-api/overview

  • Line@アカウント
  • Messaging APIアカウント

を作成。

キーをメモ

https://business.line.me/ja/
から作成したMessaging APIのアカウントの

  • CHANNEL_SECRET
  • CHANNEL_ACCESS_TOKEN

を後ほど設定に利用するので任意の場所にメモしておきます。


railsアプリケーション

gemインストール

Gemfile
gem 'dotenv-rails'
gem 'faraday'
gem 'faraday_middleware'

// heroku
group :production do
  gem 'rails_12factor'
end

line_client クラス作成

lib/line_client.rb
class LineClient
  END_POINT = "https://api.line.me"

  def initialize(channel_access_token, proxy = nil)
    @channel_access_token = channel_access_token
    @proxy = proxy
  end

  def post(path, data)
    client = Faraday.new(:url => END_POINT) do |conn|
      conn.request :json
      conn.response :json, :content_type => /\bjson$/
      conn.adapter Faraday.default_adapter
      conn.proxy @proxy
    end

    res = client.post do |request|
      request.url path
      request.headers = {
        'Content-type' => 'application/json',
        'Authorization' => "Bearer #{@channel_access_token}"
      }
      request.body = data
    end
    res
  end

  def reply(replyToken, text)

    messages = [
      {
        "type" => "text" ,
        "text" => text
      }
    ]

    body = {
      "replyToken" => replyToken ,
      "messages" => messages
    }
    post('/v2/bot/message/reply', body.to_json)
  end

end
config/environment.rb
# Load the Rails application.
require_relative 'application'

# line_clientを追加
require 'line_client'

# Initialize the Rails application.
Rails.application.initialize!

コントローラー作成

webhook_controller.rb
class WebhookController < ApplicationController
  // Lineからのcallbackか認証
  protect_from_forgery with: :null_session

  CHANNEL_SECRET = ENV['CHANNEL_SECRET']
  OUTBOUND_PROXY = ENV['OUTBOUND_PROXY']
  CHANNEL_ACCESS_TOKEN = ENV['CHANNEL_ACCESS_TOKEN']

  def callback
    unless is_validate_signature
      render :nothing => true, status: 470
    end

    event = params["events"][0]
    event_type = event["type"]
    replyToken = event["replyToken"]

    case event_type
    when "message"
      input_text = event["message"]["text"]
      output_text = input_text
    end

    client = LineClient.new(CHANNEL_ACCESS_TOKEN, OUTBOUND_PROXY)
    res = client.reply(replyToken, output_text)

    if res.status == 200
      logger.info({success: res})
    else
      logger.info({fail: res})
    end

    render :nothing => true, status: :ok
  end

  private
  # verify access from LINE
  def is_validate_signature
    signature = request.headers["X-LINE-Signature"]
    http_request_body = request.raw_post
    hash = OpenSSL::HMAC::digest(OpenSSL::Digest::SHA256.new, CHANNEL_SECRET, http_request_body)
    signature_answer = Base64.strict_encode64(hash)
    signature == signature_answer
  end
end

ルート設定

config/routes.rb
Rails.application.routes.draw do
  post '/callback' => 'webhook#callback'
end

heroku

fixieインストール

herokuアカウント作成後、fixieをインストール

heroku addons:create fixie:tricycle

設定を確認

  • Proxy URL
  • Outbound IPs

を確認。

こちらも後ほど設定するので任意の場所にメモしておきます。

※参考
http://qiita.com/yuya_takeyama/items/0660a59d13e2cd0b2516

キー設定(Line管理画面)

https://business.line.me/ja/
から作成したMessaging APIのアカウントに遷移します。

Outbound Ips

Server IP WhitelistにメモしたOutboud Ipsを記述します

Webhook URL

Basic Infomation > Webhook URL
に、以下を設定。

https://{ご自身のherokuアプリ名}.herokuapp.com:443/callback

キー設定(heroku)

herokuに環境変数の設定を行います

heroku config:add OUTBOUND_PROXY = '先ほどメモした設定値'
heroku config:add CHANNEL_SECRET = '先ほどメモした設定値'
heroku config:add CHANNEL_ACCESS_TOKEN = '先ほどメモした設定値'

挙動確認

以上のようにおうむ返しを行うBotの作成ができます。
Screenshot 2016-10-10 12.19.17.png