Line botの導入の仕方

ここではrailsで実装したサーバーをHerokuで実行してLine botを作っています。
Gitのアカウントは持っている前提で進めます。持っていない人は以下のサイトが参考になると思います。

GitHubアカウント作成とリポジトリの作成手順 - Qiita

1. Developer用のLineアカウントをゲットする

2. Channel SecretとChannel Access Tokenをゲットする

以下サイトを参考にしてアカウント作成からChannel SecretとChannel Aceess Tokenをゲットしてみてくだい。

わずか5分。新LINE Messaging APIでbotを作ってみた手順全公開 - BITA デジマラボ

3. サーバープログラムの作成

今回はLineで呟いたものを返答してくれるbotを作成します。
まずはrailsの初期ファイル群を作成します。

rails new botApp

次にサーバープログラムを作成していきます。
公式サイトでも紹介されている以下のAPIを利用。

github.com

botApp/app/controllers/webhook_controller.rb

require 'line/bot'

class WebhookController < ApplicationController
  protect_from_forgery with: :null_session # CSRF対策無効化

  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']
    # this statement maybe mistake.
    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']
          }
          response = client.reply_message(event['replyToken'], message)
        when Line::Bot::Event::MessageType::Image, Line::Bot::Event::MessageType::Video
          response = client.get_message_content(event.message['id'])
          tf = Tempfile.open("content")
          tf.write(response.body)
        end
      end
    }

    render status: 200, json: { message: 'OK' }
  end
end

次にGemfileを以下のように修正。

Gemfile
修正前

# Use sqlite3 as the database for Active Record
get 'sqlite3'

修正後

gem 'sqlite3', group: :development
# 本番ではpostgressを使用する
gem 'pg', group: :production
gem 'rails_12factor', group: :productio

また、

gem 'line-bot-api'

も追加。

*注意点
実はこれだけではForbidden 403というエラーが出たのであとで修正をします。

4. 作成したプログラムをgitにコミット

git init
git add .
git commit -m "initial commit"

5. Herokuへのデプロイ

まずはHerokuのアプリを登録するところを確保します。

heroku apps:create botAPPheroku

ここでbotAPPherokuは適当な名前で!他のひとが使っている名前は使えません。

次にこのスペースに先ほど作ったサーバープログラムを登録します。また、その際にLINE_CHANNEL_SECRETとLINE_CHANNEL_TOKENの変数も登録して下さい。

git push heroku master
heroku config:set LINE_CHANNEL_SECRET="Lineのdeveloperアカウントで取得したchannel_secret"
heroku config:set LINE_CHANNEL_TOKEN="Lineのdeveloperアカウントで取得したchannel_token"

git push heroku masterの時点でサーバーアプリは起動します。

6. Fixieアドオンを使う

このFixieアドオンを使うことでプロキシ経由の通信ができます。(Line botHTTPSによる通信でないとできないためこのようなことをします。)

heroku addons:create fixie:tricycle 

これによりherokuのアプリページにfixieアドオンが追加されています。 fixieアドオンのページに飛んでもらい右上のaccountをクリックするとプロキシURLとIPアドレスが作成されています。
これをメモしてください。

heroku config:set FIXIE_URL="example.com"

exmple.comにはプロキシURLを設定してください。

8. LineアカウントでコールバックURLとホワイトリストの設定

アカウントペーにcallback URLという欄があるので以下のように入力してください。隠れているところにはherokuに作ったアプリページ名を。

f:id:takuocean:20161108214429p:plain

ホワイトリストは左のメニューバーに
「Server IP Whitelist」
があるので選択。
表示されるページにIPアドレスを入力できるスペースがあるので先ほどfixieで取得したIPアドレスを入力。

7. サーバーアプリのログを見る

heroku logs -t

ここで紐づけられたLineアカウントにコメントしてみましょー
おそらく何も返ってこないでしょう。

はい、足りないものがありました。

8. プログラムの修正

プロキシを通す際には設定がhttpクラスに設定が必要でした。

botApp/app/controllers/webhook_controller.rbに以下の行を追加。

module Line
  module Bot
    class HTTPClient
      def http(uri)
        proxy = URI(ENV["FIXIE_URL"])
        http = Net::HTTP.new(uri.host, uri.port, proxy.host, proxy.port, proxy.user, proxy.password)
        if uri.scheme == "https"
          http.use_ssl = true
        end

        http
      end
    end
  end
end

...

修正後、gitに追加、コミット、herokuへpushすると、、、

f:id:takuocean:20161108221601p:plain

こんな感じでつぶやきが返ってきました。

次はこれをIFTTTとの連携に活かしてみます。

この記事は以下も参考にしました。

github.com