LINE BOT !!

こんばんは、三週連続登板の久保田です。

野球選手ならば三連戦を一人で投げ続けている状態なわけですね。
そんな満身創痍な僕が今回登板したわけは、ずばりこちらのニュースがあったからです。

【LINE】メッセージングAPIのオープン化に先駆け、先着1万名限定でBOTアカウントを自由に開発できる「BOT API Trial Account」の無償提供を開始

ここ最近毎日のようにマイクロソフトの「りんなちゃん」といちゃいちゃしている私としましては、これは記事にしないわけにはいかない、と思い今回筆を執らせていただきました。

もう公開から一週間経ってしまったので、いろんな人が面白いBotをたくさん作っていますので、
今回はこの LINE Bot を使い始めるまで設定などなどを重点的に書いて行きたいと思います!

BOT API Trial Accountの用意

こちらは限定一万名らしいですね。たぶんまだ取れるのではないでしょうか。
記事執筆時点では取れていましたが、こちらもう終わってしまったようですね。。。
正式公開を楽しみにしましょう!

まずはBotの登録をします。
ビジネスアカウントを作成し、そこからBOT API Trial Account を申し込むことができます。

色々入力しますが、まぁここは書いてある通りにやっていけば問題ないと思います。
CallbackURLがbotに対してアクションがあった場合にリクエストが送られるURLになります。確か何も入力しないというのはできなかったはずなので、何か適当にいれておきましょう。後で正しいものを入れます。わかる方はここで正しいURLを入力してください。

登録が完了すると、各IDやtoken, QRコードが発行されます。QRコードをLINEで読み取ると、友達追加ができます。

こんな感じですね。(IDとかは上に書かれています!)

ここらへんの情報は後で使います。

私は今回は仮で「大塩平八郎Bot」を作ります

HTTPSサーバーの用意

LINE Botからのリクエストを受け付けるエンドポイントはHTTPSでなければなりません。
私、恥ずかしながら、自前でHTTPSサーバーを構築した経験がなく、先輩に助けていただきながら作りました。
そして、せっかくなのでちゃんと用意してみよう!と思ったので、
ドメインの取得からはじめ、証明書をAWSのCertificate Manager で作り、AWSのELBに登録してEC2にリクエストを流すという割とガチな環境にしました。

AWSのAPIゲートウェイやHerokuなどなどを使えば絶対にもっと簡単にできるはずなので、お手軽にやりたい方はそちらを検討してください。

環境もろもろは以下の通りです

サーバー: EC2(Amazon Linux AMI  t2.micro)(AWS)
ロードバランサ: ELB(AWS)
DNS: Route53(AWS)
証明書: Certificate Manager(AWS)
ドメイン: お名前.com

ここは1つずつ解説致します。

まずは、ドメインです。

証明書を作る際に必要なので、取得しましょう。1000円/年とかなので、そこまでお金もかかりません。
このとき注意するのは、whoisの設定なのですが、代行サービスにしてしまうと、Certificate Managerでの証明書作成の時に確認のメールが届かない可能性があるので、注意してください。

次は証明書の申請です。

今回はなるべくAWSの中で完結したかったので、AWSの証明書サービス「Certificate Manager」を利用しました。(2016/4/15時点ではus-east-1でしか使えなかったのでご注意を)
https://aws.amazon.com/jp/certificate-manager/
これが思っていたよりも便利で、ドメインを入力して確認のメールから承認するだけで鍵の管理やれなにやらをすべてAWSが担ってくれるんですね。しかも無料。大丈夫かと心配になるほど。

次にwebサーバーとロードバランサーを立ち上げます。

まずはEC2(webサーバー)です。これはポチっと立ち上げてしまいましょう。
そしてELB(ロードバランサー)です。EC2のサイドバーの下の方に「ロードバランサー」というメニューがあるので、こちらから立ち上げます。
色々聞かれますが、大切なのはここでhttpsの登録することです。

ここでhttpsの登録をしておくとELBの登録の途中で証明書の登録をすることができるので楽チンです。
証明書登録の時に、証明書タイプをACMにすると、先ほどCertificate Managerで作った証明書の選択ができます。
色々設定したら、EC2をELBの「インスタンス」メニューから紐付けておきます。

最後にDNSの設定です。

AWSのRoute53を使います。
ここでは、取得したドメインでアクセスした際にELBにリクエストが行くようにします。
(このときにRoute53でドメインも取れるやん。。。そしたらAWSだけで完結したやん。。。と気づいたのは内緒です。)
まずはHosted Zoneを作ります。取得したドメインを入力します。
そしてさらにCreate Record SetからAレコードを指定します。左上のCreate Record Setを押すと、画像のようなフォームがでてきます。

中ほどのAliasをYesにすると、Alias Targetが選べます。そしてここから先ほど立ち上げたELBが選択できます。

そして最後に、NameServerをドメインと紐付けます。アクセスされた際に、どのDNSに聞きに言ったらいいかを登録するわけです。
作ったHosted Zoneを選択すると、このドメインが登録されたNameServerが右にあるので、それをそのままドメインを取ったサービスのほうで登録します。必ずあるはずです。

少ししてから、whois や digで確認すると名前解決ができるはずです。

これでHTTPSの用意は完了です!

CallBack URLとWhite Listの登録

ここで少しやらなければいけないことがあります。CallBack URLとWhite Listの登録です。
CallBack URLは、ユーザーからアクションがあった際に、リクエストをどこに送るかの設定です。Botを作る際に適当な値をいれたところですね。
Botアカウントを作る際に正しいものを入力しておいたならば何もしなくて大丈夫です。
正しいもの値を入れなおす方は、BotアカウントのEditから編集して登録しましょう。もしドメインを新しく取得している場合は、そのドメインを入力します。
ここでの注意点は、ポート番号が必ず必要な点です。
以下のように書いてください。

https://取得したドメイン:443

White Listは、サーバーからユーザーに何か送る際に、決められたIPからしか送れないようにする設定です。
なのでメッセージを送るサーバーのIPを登録しておきます。
Line Botのチャンネル設定の左メニューにあります。

Botアプリケーションの作成

さて、長くなりましたが、いよいよBotの作成です。

今回はさくっと作りたかったので、Rubyの軽量フレームワーク「Sinatra」を使いました。
私のRuby環境は以下の通りです

Ruby: 2.3.0
Sinatra: 1.4.7

とりあえず何か言われたら「平八郎です」とだけ返すBotを作ります。
ここはみなさんの作りたいものによってかなり違うと思うので、今はとりあえずメッセージに反応するだけのシンプルなものにしておきます。
コードはこんな感じです。

#bot.rb

require 'sinatra'
require 'json'
require 'faraday'

post '/' do
params = JSON.parse request.body.read
to = params["result"][0]["content"]["from"] # ここにメッセージを送ってきたユーザーのIDがあるので、とって置いて後でメッセージを返す

conn = Faraday.new(url: 'https://trialbot-api.line.me') do |faraday|
faraday.request :url_encoded
faraday.response :logger
faraday.adapter Faraday.default_adapter
end

p = JSON.pretty_generate ({to: ['送る相手のID'], toChannel: 1383378250, eventType:"138311608800106203", content:{contentType: 1, toType: 1, text: '平八郎です'# ここに送るメッセージ'}})


conn.post do |req|
req.url '/v1/events'
req.headers['Content-type'] = 'application/json; charset=UTF-8'
req.headers['X-Line-ChannelID'] = '作成したBotのChannelID'
req.headers['X-Line-ChannelSecret'] = '作成したBotのChannelSecret'
req.headers['X-Line-Trusted-User-With-ACL'] = '作成したBotのMID' # この辺の情報はすべて、アカウントを作った時のページの上のほうに書いてあります!
req.body = p
end
end

そしてsinatra起動!
(僕は443のリクエストをEC2の3030に流すようにELBに設定したので、ここで3030番ポートを指定)

bundle exec ruby bot.rb -o 0.0.0.0 -p 3030

これで全て完了です!

Botにメッセージを送ってみます!

いい感じですね!こんな感じでLINE Botは作れます!
かなり色々できそうですね、僕も色々考えているので、色々と作って行きたいと思います!

すこし長くなりましたが、突如やってきたこのBotの波に取り残されないように今後もキャッチアップして行きます。

ありがとうございました。ではまた。