【ドヤリングにも安心】Facebookメッセンジャーbotで作るMac盗難防止用カメラ監視サービス

最近毎週沼津に行くようになったCTO室のJ.Nです。

CTO室では研究期間というものがあり、好きなテーマで一定期間技術検証することができるため今回はFacebookメッセンジャーbotの検証も兼ねて監視カメラサービスをMacAirを使い作成してみました。

IMG_3025

上記はFacebookボットに「写真(マシン名)撮ってね」と問いかけると、対象のMacAirのカメラが写真を撮って送信してくれるサービスです。

 

 

cafe_nomad_man

カフェでMacAirを扱っている時(ドヤリングしている時)に、机にMacAirを置いたままトイレに行った時などに使うと簡易盗難防止になります。

 

Facebookメッセンジャーbotとは?

Facebookメッセンジャーbotとはメッセンジャーの会話の相手となってユーザーとの会話から自動的に何らかの処理をしてくれるアプリケーションになります。

LINEもボットサービスを展開していますが、ボットサービスの狙いとしてはEC、クーポン、MAP、銀行、賃貸、宿泊など各社のサービスアプリの機能を全てボットの会話で完結することにあるようです。

 

スクリーンショット 2016-06-29 16.47.10

https://developers.facebook.com/docs/messenger-platform/

 

 

Facebookメッセンジャーbot開発に必要なもの

  • Facebookアプリケーション (Facebook開発者登録をしてアプリを作成)
  • Facebookページ (botはFacebookページに紐づける必要があるため)
  • Facebookからメッセージを受け取るHTTPSのコールバックサーバー (VPSやクラウドサービスをレンタルして構築)
  • HTTPS証明書  (Let’s Encryptで無料で取得可能)

上記までの手順は特に難しくはないでしょう。

HTTPSのサーバーは今回ConoHa(https://www.conoha.jp/conoha/)でRuby Sinatra+Nginxで作成しました。

FacebookメッセンジャーBotサーバー概要図

 

Untitled(1) (6)

  1. クライアントからBotへメッセージを送信
  2. Facebootのメッセンジャーサーバーがメッセージを指定されたコールバックURLへ転送
  3. ボットアプリケーション・サーバーが何らかの処理をして応答メッセージをメッセンジャーサーバーに送信
  4. メッセンジャーサーバーがクライアントにメッセージを転送

上記の手順のポイントは、ボットアプリケーションサーバーはクライアントに直接メッセージを送れないという事です。

コーディング自体は簡単でエコーサーバーや、Amazon商品検索ボットなどはすぐ作成できます。

 

 

IMG_2535

 

スクリーンショット 2016-06-29 15.34.17

 

作成した監視カメラサービス「SAKIMORI」

概要

sakimori

Bot Application Server

基本的な構成は「FacebookメッセンジャーBotサーバー概要図」と同じですが、カメラマシン(MacAir)がカメラ撮影命令を待機(ポーリング)するため、今回はAWSのSQSを利用しています。メッセージ・キューシステムが使えればなんでもいいのですが、kafkaやRabbitMQをグローバルIPでポート開放するのもセキュリティ的に不安なのとサーバー構築にも工数がかかるのでHTTPでキューがやり取りできるAmazon Simple Queue Serviceを選定しました。リクエスト100万までは無料なので良いです(https://aws.amazon.com/jp/sqs/pricing/)。

Bot Application Serverはクライアント(メッセンジャー)からの撮影メッセージ「写真 (マシン名) 撮ってね」を変換し、SQSにメッセージキューを格納します。

 

 

カメラマシン

クライアントには今回MacAirを使用します。

スクリーンショット 2016-06-29 16.26.49

プログラムからMacAirのカメラを制御するには「imagesnap」というアプリケーションが必要になるのでインストールします。

home  brewでインストール可能です。(http://brewformulas.org/Imagesnap)

SQSをポーリングし撮影命令を受け取ると撮影し画像ファイルをImage Serverに送信し、画像URLを取得しBot Application Serverに返却します。

 

Image Server

メッセンジャーBotの仕様として、画像ファイルを直接クライアントに送信することができない(画像URLとして送信する必要がある)ため画像ファイルを一度どこかのサーバーにアップロードする必要があります。そのためcurlのコマンドでファイルがアップロードできる簡易アップロードサーバーをSinatraで作成しました。

カメラマシンからのアップロード要求を受付し、画像ファイル格納後の画像URLをカメラマシンに返却します。

ソースコード

SAKIMORI Server
SAKIMORI Client for mac
SAKIMORI Image Server

作ってみた感想

  • botサーバーを作る事自体は簡単なのでボットサービスではアイディアが必要。
  • FacebookメッセンジャーのメッセージはコールバックURLとの通信がうまくいかなかった場合再送を繰り返すので、メッセージの重複チェックが必要。
  • 一通りサービスを作ってしばらく使っていくと作成したアプリで安定しない個所がわかるので、まずは自分が使いたくなるボットを作ると良い。
  • Facebookボットはcallbackサーバーと一定時間通信がないと一度アプリケーションごと遮断するのでreactiveの作業が必要(下記の画面)

スクリーンショット 2016-06-29 16.15.55

改善点

今回はサービスの完成度として自分が使える程度に作ったのでちゃんとしたサービスとしてリリースする場合以下の改善点が残っています。

  • 複数人が使える想定に作っていないため、サービスとして作るにはユーザーIDやマシンIDの採番を考える必要がある。
  • 画像はHTTP/HTTPSで公開しているのでGoogleなどのキャッシュに残って困る画像が映る場合は、画像のURLのパラメーターに認証キーをつけるなどの対策が必要。
  • クライアントからの撮影完了メッセージを受け取るのは別バッチサーバーを立てるべき。HTTPのやりとりの中でポーリングしない、
  • Facebookメッセンジャーのメッセージはうまく届かないときなど同じメッセージを再送し続けるので、重複したメッセージは処理しないようにする。(そうしないと延々と画像がメッセージに送られてくる)
  • MacAirを持ち運びするとWiFiが切れた場合SQSポーリングアプリはネットワークエラーを起こすので対策が必要。
  • クライアントはMacだけでなくラズパイやintel EdisonなどのIoT機器でも動作できるようにするべき。

上記の改善点をプルリクエストしてくれたりforkして改善してもらえるとありがたいです!!