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
を使っているので実際にアプリケーションとして使う際には対策するなり気をつけてください。
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
とかっていうメッセージを投げると計算結果を返してくれます。数式以外を入れるとどんうさぎに怒られます。
こんな感じ。