LINE BOT と "何か" をリアルタイムでつなごう!
こんにちは!
突然ですが、2016年は BOT の年になるとかならないとか
わりと前ですが、LINE、 Facebook Messanger が API を公開し、僕らもメッセンジャーアプリ上の BOT を自由に開発できるようになりました
試しに LINE BOT をつくってみたので、その時にやったことをまとめてみます
この記事では
1. LINE BOT API を使うための準備
2. APIと "何か" がリアルタイムでつながるためには
3. サンプルコード
4. まとめ
について解説します
こんな感じの BOT の作り方を見ていきましょう
※API の細かい仕様は公式サイトをチェック!
Messaging API reference
1. LINE BOT API を使うための準備
さて、まず LINE BOT を作りたいと思ったときに何を用意したらいいでしょうか
実は単純にテキトーな場所から API を叩けばいいというわけではなく、微妙に事前準備が面倒くさいです
具体的には以下を用意する必要があります
サーバーの環境構築が必要になるのでそれなりにハードルはありますが、がんばれば何とかなるくらいの感じです
それぞれどんな感じで用意すればいいかを見ていきましょう
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万人限定だったんですが、その後上限が追加されたようで いまは普通に登録できます
2. SSL が利用できるサーバーを用意
LINE BOT をつくるにはサーバーを用意する必要があります
用意するサーバーは HTTPS でアクセスでき、固定 IP である必要があるのでそれなりに手間がかかります
よくある方法では Heroku を使うか自前のサーバーを用意するかどちらかです
どちらも試しましたが、とりあえず試してみるのであれば Heroku が簡単でおすすめですし、
サーバー上にいろいろ機能を入れたければ自前でサーバーを用意した方がいいです
Heroku のありがたみを感じるためにも、サーバーを1から構築していく方が勉強にはなりますね
※ちなにみ、Heroku を利用する場合は以下の記事を参考にすればいい感じに BOT をつくれると思います
自前でサーバーを構築する
僕は EC2 上に ubuntu をたてて構築してみました
独自ドメインを用意する必要がありますが、Elastic IP で IP を固定できますし Let's Encrypt で SSL 証明書をつくれば、それなりの環境を無料で構築できます
4月上旬ころには Let’s Encrypt の SSL 証明書には対応してなかったんですが、その後 Let’s Encrypt に対応されているので現在は問題なく使えます
リバプロ用の Nginx に SSL の設定をするには以下の記事がとても参考になりました
SSL の設定後に Qualys SSL Report から、たてたサーバーの URL をテストして A 評価になってればとりあえずOKです
EC2 の無料枠のインスタンスで試してみましたが、Heroku の無料枠と比較すると、自前サーバーの方がパフォーマンスがかなりよくハッキリ違いがわかるくらいレスポンスが速いです
まあ、とはいえ無料枠なんでそんなもんですよね・・・
Heroku でそれなりに運用するのであれば、当然課金してスペック上げると思うので問題ないと思います
2. APIと "何か" がリアルタイムでつながるためには
さて、ようやく本題です
LINE BOT をつくれる環境は整ったわけですが、LINE BOT の応答処理を単純にサーバー上だけでやっていてもあまり面白くありません
デプロイの手間もあるし、もっとお手軽にいろいろ実験しつつ繋げてみたいなーと思いました
そこで、GushiSnow さんの記事で紹介されている Slack の Real Time Messaging API を使って自分の PC 上でボットを動かすのがとても便利だと感じたので、
LINE BOT API と WebSocket でつなげられるようになれば、お手軽に "何か" をリアルタイムでつなげらるようにできる!と考えました
ただ、LINE BOT API に WebSocket で接続するような便利な機能はないのです
なので自分で作ってみることにしました
そしてこんな仕組みを考えました
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 という構成でサンプルをつくってみました
構築した 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 に置きました
ちなみに、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 にメッセージを送ると自動で応答が返ってきます
"何か" と繋がってる感がわかりにくいかもしれませんが、LINE BOT のメッセージはサーバー上ではなく僕の Macbook が生成しています
なのでこの例だと、LINE BOT と PC がリアルタイムで繋がってるわけですね
また、linebot-proxy にはメッセージの送受信を確認できる Web 画面をつくりました
index.html にアクセスすると、BOT に送られてきたメッセージの内容が確認できて、Web 画面からユーザーにメッセージを送信することもできます
このサンプルでは 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 の使い方と、それに "何か" をリアルタイムで繋ぐ方法について紹介しました!