概要
LINE Bot APIの使ってLINEからメッセージを送ることで自宅のエアコンの電源を入れられるようにするシステムを試作した。
キーワード : LINE Bot API, AWS, Lambda, API Gateway
背景と目的
LINE Bot APIというものに興味がわいた。しかし、実際に使ってみないとよくわからないので、試しに使い方を調べ、せっかくなので以前作成したスマホからエアコンの電源を操作するシステムと連携させてみる。
詳細
1.LINE Bot APIについて知る
Web上でいろいろ情報を漁った結果、こちらにあるとおり、>>あなたのサービスとLINEユーザーの双方向コミュニケーションを可能にする機能<<とのこと。最低限使用するためには、
- LINE Business CenterでMessaging APIを利用するビジネスアカウントを作成
- 自分のシステムにLINEサーバからのWebhookを受け取るWebエンドポイントを用意
- Webhookを受け取ったときの動作を自分のシステム上に実装
という感じだ。というわけで、以下順を追ってやってみる。
2.システムの実装
2.1 Messaging APIを使うためのアカウントを作成
アカウント作成手順の詳細いは、こちらなどが詳しいので、それを参照するとして、最終的に以下のように
- Channel Secret
- Channel Access Token
- QR code
が見られるDeveloperのページまで無事たどり着いた。
ここで、スマホのLINEの友達追加でQR codeを読み取りこのアカウントと友達になった。
図2.1 Developerページ
2.2 AWS側にWebエンドポイントを用意
次に、先ほど作ったアカウントから、Webhookを受け取るためのエンドポイントを用意する。今回は、以前作成したエアコンの電源操作システムに、API Gatewayを使っているので、そこにリソースを追加した。設定は、
- メソッドはPOST
- 統合リクエスト
- 統合タイプはLambda関数(対象は2.3で作成する関数)
- マッピングテンプレートは特に設定なし
- 統合レスポンス、メソッドレスポンス、メソッドリクエストはデフォルトのまま
とした。そして、このAPIのデプロイされたURLを、以下のように2.1でたどり着いた画面のWebhook URLに入力する。VERIFYボタンを押して、API GatewayのログがCloud Watch等で残っていれば、ちゃんと呼び出されたことが確認できる。(2.3のLambda関数を実装してからのほうがわかりやすいが)
図2.2 Webhook用URLを記入
2.3 Webhook受信時の処理を実装
Lambda関数の実装を行う。Webhookを受信すると、eventという引数に呼び出し元のデータ(LINEアプリから送信したテキストなど)が入ってくる。今回は、送信されたテキストが、
- "電源入れて"だったら、"入れました"と返答し、エアコンの電源を入れる
- "電源切って"だったら、"切りました"と返答し、エアコンの電源を切る
- それ以外は、"ごめんなさい。を返答する
を実装してみた。エアコン操作部分は、以前作成したLambda関数があるので今回はそちらを呼び出すだけとする。
受け取る引数のjsonの構造は、APIのドキュメント等があるので詳細は割愛するが、基本的な流れは、入ってきたメッセージを解析して、リプライ用のAPIを叩くというだけだ。(メッセージの解析とリプライ文章作成をAIのようなもので実装すれば、はやりのAIチャットボットみたいなものができるはず。)
なお、LINE Bot APIには、Python向けのSDKが用意されているが今回はAPIドキュメント通りに実装してもそんなに大変でなかったので使わなかった。(これは状況に応じて使えばよいのだろう)
# coding: utf-8 import urllib2 import json def lambda_handler(event, context): for ev in event["events"]: # メッセージ解析 message = ev["message"]["text"] if message in u"電源入れて": t = u"入れました" elif message in u"電源切って": t = u"切りました" else: t = u"ごめんなさい。わかりません。" # リプライ用APIを叩く url = "https://api.line.me/v2/bot/message/reply" headers = { "Content-type": "application/json", "Authorization": "Bearer {Channel Access Token}" } body = { "replyToken": ev["replyToken"], "messages": [ { "type": "text", "text": t } ] } req = urllib2.Request(url, data=json.dumps(body), headers=headers) resp = urllib2.urlopen(req) print resp.read() # エアコン操作用の関数呼び出し # 詳細は省略 :
3.動作確認
というわけで、早速LINE上からメッセージを送ってみたところ、無事電源の操作ができた。また、LINE上に返信が来た!
図3 LINE上でメッセージのやり取りがなされた様子
まとめ
LINE Bot APIを使って自分の作ったWebシステムと連携させることができた。今回は、エアコン操作というIoT的なものをやってみたが、これ以外にもいろいろアイディアが思いつきそうなので、思いついたら適宜試してみたい。