読者です 読者をやめる 読者になる 読者になる

もろず blog

もろちゃん (@Chan_moro) がITに関しての様々なトピックを解説します


LINE BOT と "何か" をリアルタイムでつなごう!

BOT Python JavaScript Nginx node.js


f:id:chanmoro999:20160615203238j:plain

こんにちは!

突然ですが、2016年は BOT の年になるとかならないとか
わりと前ですが、LINE、 Facebook Messanger が API を公開し、僕らもメッセンジャーアプリ上の BOT を自由に開発できるようになりました

試しに LINE BOT をつくってみたので、その時にやったことをまとめてみます


この記事では
1. LINE BOT API を使うための準備
2. APIと "何か" がリアルタイムでつながるためには
3. サンプルコード
4. まとめ
について解説します


こんな感じの BOT の作り方を見ていきましょう

f:id:chanmoro999:20160616095703g:plain


※API の細かい仕様は公式サイトをチェック!
LINE Developers - BOT API (Deprecated) - API reference


1. LINE BOT API を使うための準備

さて、まず LINE BOT を作りたいと思ったときに何を用意したらいいでしょうか


f:id:chanmoro999:20160616102449j:plain


実は単純にテキトーな場所から API を叩けばいいというわけではなく、微妙に事前準備が面倒くさいです
具体的には以下を用意する必要があります

  1. BOT API Trial Account
  2. SSL が利用できるサーバー
  3. LINE BOT のプログラム

サーバーの環境構築が必要になるのでそれなりにハードルはありますが、がんばれば何とかなるくらいの感じです

それぞれどんな感じで用意すればいいかを見ていきましょう

1. BOT API Trial Account を登録

以下のリンクから LINE のビジネスアカウントを作成し、BOT API Trial Account を登録します
アカウントを作成するためには LINE に登録する必要があります

BOT API Trial Account は通常の LINE ID 1つに対して 1つしか登録できないように制限がかかっているようです
business.line.me


BOT API Trial Account が公開されたときには先着1万人限定だったんですが、その後上限が追加されたようで いまは普通に登録できます

LINE BOT API はまだトライアルという位置付けなので友達の上限数などに制限があります

2. SSL が利用できるサーバーを用意

LINE BOT をつくるにはサーバーを用意する必要があります
用意するサーバーは HTTPS でアクセスでき、固定 IP である必要があるのでそれなりに手間がかかります

よくある方法では Heroku を使うか自前のサーバーを用意するかどちらかです

どちらも試しましたが、とりあえず試してみるのであれば Heroku が簡単でおすすめですし、
サーバー上にいろいろ機能を入れたければ自前でサーバーを用意した方がいいです

Heroku のありがたみを感じるためにも、サーバーを1から構築していく方が勉強にはなりますね


※ちなにみ、Heroku を利用する場合は以下の記事を参考にすればいい感じに BOT をつくれると思います

qiita.com

自前でサーバーを構築する

僕は EC2 上に ubuntu をたてて構築してみました
独自ドメインを用意する必要がありますが、Elastic IP で IP を固定できますし Let's Encrypt で SSL 証明書をつくれば、それなりの環境を無料で構築できます

4月上旬ころには Let’s Encrypt の SSL 証明書には対応してなかったんですが、その後 Let’s Encrypt に対応されているので現在は問題なく使えます


リバプロ用の Nginx に SSL の設定をするには以下の記事がとても参考になりました

postd.cc

postd.cc


SSL の設定後に Qualys SSL Report から、たてたサーバーの URL をテストして A 評価になってればとりあえずOKです



EC2 の無料枠のインスタンスで試してみましたが、Heroku の無料枠と比較すると、自前サーバーの方がパフォーマンスがかなりよくハッキリ違いがわかるくらいレスポンスが速いです
まあ、とはいえ無料枠なんでそんなもんですよね・・・

Heroku でそれなりに運用するのであれば、当然課金してスペック上げると思うので問題ないと思います

3. LINE BOT のプログラム

ここが LINE BOT と繋げたい "何か" を担う部分です
BOT の応答を返すためのプログラムなので、どんな言語でも OK です

ただし、2 で用意した SSL サーバーを経由しないと LINE BOT API にアクセスできないので、
サーバー上でプログラムを動かすか、サーバーと連携させて動かす必要があります

この記事に載せているサンプルでは Python でつくりました



記事の先頭に戻る


2. APIと "何か" がリアルタイムでつながるためには

さて、ようやく本題です

LINE BOT をつくれる環境は整ったわけですが、LINE BOT の応答処理を単純にサーバー上だけでやっていてもあまり面白くありません
デプロイの手間もあるし、もっとお手軽にいろいろ実験しつつ繋げてみたいなーと思いました


そこで、GushiSnow さんの記事で紹介されている Slack の Real Time Messaging API を使って自分の PC 上でボットを動かすのがとても便利だと感じたので、
LINE BOT API と WebSocket でつなげられるようになれば、お手軽に "何か" をリアルタイムでつなげらるようにできる!と考えました

qiita.com


ただ、LINE BOT API に WebSocket で接続するような便利な機能はないのです
なので自分で作ってみることにしました

そしてこんな仕組みを考えました


f:id:chanmoro999:20160616102837j:plain


LINE BOT API に対してのエンドポイントとなるサーバー(linebot-proxy)を用意し、LINE とのデータのやりとりは linebot-proxy が行います
そして、LINE BOT とリアルタイムに連携させたい "何か" は WebSocket で linebot-proxy と接続します

こんな感じにすると、連携させたい "何か" はサーバー上で動いている必要はなく、
PC とかロボットとか、インターネットにつなげるものであれば何でも繋げられるようになります


記事の先頭に戻る


3. サンプルコード

そんな感じで LINE BOT API を WebSocket で中継する linebot-proxy と、BOT API に繋ぐ "何か" を担う linebot-client という構成でサンプルをつくってみました


f:id:chanmoro999:20160616105252j:plain


構築した Nginx は SSL 通信だけを担うリバースプロキシとして使うので、Nginx への通信を linebot-proxy へプロキシさせるように設定します


linebot-proxy は node.js、linebot-client は Python で実装しています
※それぞれ、node.js 5.9.1、python 3.5.0 で動作を確認しました

僕は linebot-proxy を EC2 上にデプロイして動かしましたが、同じコードのまま Heroku 上でも動かせます


サンプルコードは github に置きました

github.com


ちなみに、linebot-client には超簡易版の会話シナリオてきな機能を付けてます
ソースの以下の部分がシナリオにあたります

・linebot-client/linebot.py

# dialog and action
scenario = []
scenario.append({'msg': ['hi'], 'res': ['hi\nwhat\'s up?']})
scenario.append({'msg': ['こんにちは'], 'res': ['こんにちは!\n調子はどうですか?'], 'action': 'debug'})
scenario.append({'msg': ['how', 'are', 'you'],
                 'res': ['not bad\nhow about you?']})
scenario.append({'msg': ['もうかりまっか'], 'res': ['ぼちぼちでんな'], 'action': 'debug'})

random_response = ['oh', 'good', 'uh-huh', 'right', 'I see']

受信したメッセージに msg の文字列を全て含んでいれば res で定義した文字列をメッセージとして応答します
どのパターンにも当てはまらなければ、random_response 内のどれかをランダムに返します


PC で linebot.py を実行すると、linebot-proxy と接続されます
その状態で BOT にメッセージを送ると自動で応答が返ってきます

f:id:chanmoro999:20160616095703g:plain

"何か" と繋がってる感がわかりにくいかもしれませんが、LINE BOT のメッセージはサーバー上ではなく僕の Macbook が生成しています
なのでこの例だと、LINE BOT と PC がリアルタイムで繋がってるわけですね


また、linebot-proxy にはメッセージの送受信を確認できる Web 画面をつくりました
index.html にアクセスすると、BOT に送られてきたメッセージの内容が確認できて、Web 画面からユーザーにメッセージを送信することもできます

f:id:chanmoro999:20160615200919g:plain


このサンプルでは linebot-client は Python で実装してますが、WebSocket でつなげて JSON が解釈できるものであれば、
Python でなくてもどんな言語でも OK です



記事の先頭に戻る


4. まとめ

さて、そんな感じで僕が考えた linebot-proxy という仕組みを使うと LINE BOT と "何か" をリアルタイムで繋ぐことができます

これは単純に WebSocket 経由で API にアクセスするための仕組みなので、
これを応用すれば LINE BOT API でなくてもどんな API ともリアルタイムに繋げられるようになります


BOT アプリケーションが充実してくると、メッセンジャーアプリから様々なサービスを利用することができるようになります
まだあまり想像できないかもしれませんが、BOT が新しいインターフェースになっていく感じがおもしろいです


BOT 自体は技術的には新しいものでも難しいものでもありませんが BOT と "何か" を繋げることによって、
メッセンジャーアプリがインターフェースになって様々なサービスを使えるようになるというのは、とても大きなトレンドの変化なんじゃないかと思います


アメリカでは BOT アプリケーションは既に実際のサービスで使われ始めているみたいです

メールとも違う、Webともちがう、新しいインターフェースとして BOT が浸透するといろいろと便利になっていくかもしれませんね


そんな感じで今回は LINE BOT API の使い方と、それに "何か" をリアルタイムで繋ぐ方法について紹介しました!



記事の先頭に戻る