LINE botでどんうさぎ簡易電卓を作った

LINE botをアプリケーションのUIに出来ないかなーと思ってまして、技術検証のためどんな感じか試してみました。 結論から言うと、まあ特筆すべきこともなく、期待通りの挙動といったところ。

Sinatra, Heroku+ Fixie, Ruby2.3.0でやりました。

事前準備

アカウント取得はこちらのエントリに詳しく書いてありますので参照くだしあ。特に難しいことは何もありません。 現時点ではトライアルで1万人まで発行なのでもう取得できないかもしれない。

http://qiita.com/Yuki_BB3/items/5c18073181b5eea94164

Herokuのアプリケーションを立ち上げておきます。Herokuの基本的な使い方については割愛しますね。アプリケーション名(line-bot-sample-harada4atsushiの部分)は各自適当に決めてください。

$ mkdir line-bot-sample-harada4atsushi
$ heroku create line-bot-sample-harada4atsushi
Creating ⬢ line-bot-sample-harada4atsushi... done
https://line-bot-sample-harada4atsushi.herokuapp.com/ | https://git.heroku.com/line-bot-sample-harada4atsushi.git

LINE公式のGetting startedによると、callback urlを指定せよと書いてある。

https://developers.line.me/bot-api/getting-started-with-bot-api-trial

言われた通り、チャンネルのコールバックURLを指定します。 URLは今回herokuで立ち上げたアプリケーションのURLを指定します。

どうやらLINE botのAPIは特定IP(ホワイトリスト)だけ許可する仕様らしい。Herokuアプリケーションは固定IPを持たないのですが、FixieというAddonを使ってproxyを経由すればIP固定出来る模様。こちらも設定していきます。

FixieをHerokuアプリケーションにAddonします。無料のtricycleプランでOKです。Addon完了したら、「Account」をクリックし、「Outbound IPs」を「Proxy URL」をメモってください。

https://elements.heroku.com/addons/fixie

次にLINE側のWhiteListを編集します。Channelのページの「Server IP Whitelist」から設定できるので、先ほどメモった「Outboud IPs」を登録する。

ちなみに、この設定をやっておかないとcallback時に403エラーになってしまいます。

2016-04-27T05:34:39.299458+00:00 app[web.1]: {:status=>403, :body=>{"statusCode"=>"427", "statusMessage"=>"Your ip address [54.82.83.184, 10.32.127.107] is not allowed to access this API."}}

これで設定は完了。

実装

Heroku側のコードを実装してきます。WEBのインターフェースが必要なので今回は簡単に動かせるSinatraを使います。割りと雑な入力チェックをしてからevalを使っているので実際にアプリケーションとして使う際には対策するなり気をつけてください。

完成品のGitHubリポジトリはこちら。

https://github.com/harada4atsushi/line-bot-sample

main.rb

require 'dotenv'
require 'sinatra'
require 'json'
require 'line/bot/client'

Dotenv.load

CONTENT_TYPE_TEXT = 1

post '/' do
  client = Line::Bot::Client.new do |config|
    config.channel_id     = ENV['LINE_CHANNEL_ID']
    config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
    config.channel_mid    = ENV["LINE_CHANNEL_MID"]
    config.proxy          = ENV["FIXIE_URL"]
  end

  params = JSON.parse(request.body.read)
  params['result'].each do |message|
    next unless message['content']['contentType'] == CONTENT_TYPE_TEXT
    text = message['content']['text']
    puts "text: #{text}"
    line_user_id = message['content']['from']

    if text =~ /^[\d +-\/*]*$/  # 数式形式
      response = client.send_text([line_user_id], text: eval(text))
    else
      response = client.send_text([line_user_id], text: '数式で入力しろよ')
    end

    puts response
  end

  'OK'
end

Gemfile

source 'https://rubygems.org'

gem 'sinatra'
gem 'shotgun'
gem 'dotenv'
gem 'line-bot'

Procfile。このファイルはHerokuでSinatraを動かすために必要なおまじないなので、こういうもんだと思っていただければ。

web: bundle exec ruby main.rb -p $PORT

Herokuに環境変数を設定する。値は各自Channel画面から取得した値を設定してね。ここで上でメモったFixieのProxy urlを使います。

$ heroku config:set LINE_CHANNEL_ID=123456789 LINE_CHANNEL_SECRET=aaaaaaaaaaaaaaaaaaaaaaaa LINE_CHANNEL_MID=bbbbbbbbbbbbbbbbbbbbbbbbb FIXIE_URL=http://aaaaa:bbbbb@usefixie.com:80

デプロイする

$ git add .
$ git commit
$ git push heroku master

これで出来上がり。まあ簡単。

動かしてみる

実際に動かすには、今回作ったbotをLINEの友達に追加する必要があるのですが、ChannelのページにQRコードがあるので、それを使えば簡単に友達登録出来ます。

簡易電卓と言うか、2 + 5とか10 * 3とかっていうメッセージを投げると計算結果を返してくれます。数式以外を入れるとどんうさぎに怒られます。

こんな感じ。



mofmof inc.では、一緒に仕事をしてくださるエンジニアを募集しております。
募集要項については以下をご確認ください。
興味を持っていただけましたら、ぜひ一度ゆっくりお話出来れば嬉しいです。

募集一覧(wantedly)
https://www.wantedly.com/companies/mof-mof/projects

mofmofは何をしたいのか
https://www.mof-mof.co.jp/recruit/want-to-do

mofmof入社ガイド
http://everyday.mof-mof.co.jp/entry/2017/01/25/141201