買い物カメラ
買い物から帰ってきたら、「ついでに牛乳買ってきてほしかった」と言われちゃうのはよくある事故で、うちではこれを減らすため、買ってこないといけないものは、冷蔵庫に貼ったホワイトボードに書いておいて、買ってきたら消すことにしています。
この内容、外出先で見たいよね、ということで、冷蔵庫の買い物メモをLINEに投稿してくれる便利カメラを作りました。
市販の監視カメラ的なものを使って作ることも考えたのですが、それだと
- スマホからまともに見れなかったりするし
- パスワードを家族みんなに覚えてもらうとか、ありえなくない?
- 外出先でブラウザ立ち上げてカメラ見るとかタルいよね?時代はPUSH型
ということで、Raspberry Piで作ったカメラからLINE NOTIFY経由でLINEに投稿させることにしました。家族グループにLINE NOTIFYを追加してあるので、買い物メモが更新されるたびにLINEに画像が届きます。
LINE NOTIFYに画像を投稿させるメリット
プログラムからLINEにメッセージを送ることができるLINE NOTIFYは、URLをつけると画像を添付することができます。
こうして投稿された画像は、LINE側でキャッシュしてくれるので、投稿後サーバ上のファイルを削除したとしても、LINEアプリ上では引き続き見ることができるのです。
インターネット上に監視カメラ的なものを公開すると、誰が見るかわからない(ので認証の仕組みを作らないといけない=作る方も使う方も面倒くさい)という問題が発生しますが、速やかにファイルを削除することで、余計な人に見られる危険性を最低限にすることができます。削除する前に見られてしまう可能性はゼロじゃないですが、家庭の買い物メモには十分でしょう。
Dropbox APIで画像を公開する
とはいえインターネット上にWEBサーバを公開するとなると、ファイルを盗み見られるリスクだけでなく、WEBサーバに対する攻撃も懸念されます。
Dropboxには、保存したファイルをインターネット上で見られるようにシェアする機能がついています。特定のユーザーだけ共有とか、無認証で誰でも見られるようにするなど幾つかパターンがあります。
通常のシェア機能だと、取得できるURLは一度クッションページを挟むので、LINEに投稿する用途にはうまく使うことができません。
けれども、時間を区切ってファイルを公開するget_temporary_link APIで取得したURLだけは、画像を直接表示してくれるので、これなら、LINEに画像を投稿する用途に使うことができます。このURLは4時間で自動的に無効になるのもいい感じです
dropbox api gem を使えば、Rubyから実行するのも簡単。
client = DropboxApi::Client.new(access_token)
file = IO.read(filename)
upload_filename = Time.now.strftime('/%Y%m%d_%H%M%S.jpg')
client.upload(upload_filename, file)
client.get_temporary_link(upload_filename).link
まとめ
LINE NOTIFYとDropbox APIを組み合わせることで、インターネット上に公開するコードを書くことなく、限られたユーザーだけがカメラの映像を見ることができる仕組みを構築することができました。
カメラ側の詳細はまたそのうちに。