【RaspberryPi×Chatwork API×GAS】冷蔵庫のスナップショットをチャットに投稿して在庫管理する

好きなモノは酒と女とラーメン、LIFULLのてぃば(@rechiba3)です。

# はじめに
この記事は[LIFULL Advent Calendar2018](https://qiita.com/advent-calendar/2018/lifull)　の2日目の記事です。

# 準備するもの

1. RaspberryPi3
2. Webカメラ
3. GoogleドライブへのGASプロジェクト追加
4. Chatwork APIトークン

オフィス冷蔵庫の在庫監視をやろうとしたので、今回は職種部署横断して使っているChatWorkを採用しました。

# やり方
## 1. RaspberryPi3で冷蔵庫を撮影する

下準備をする。
基本は手元のPCのターミナル上で行います。

>《参考》
[Raspberry Piのセットアップ（ssh接続まで）](https://qiita.com/aryoa/items/86ddae2212c789ddece0#4-ssh%25E3%2581%25A7%25E3%2581%25AE%25E6%258E%25A5%25E7%25B6%259A)
[ラズパイでUSBカメラから撮影した画像をSlackに投稿](http://banbara-studio.hatenablog.com/entry/2017/02/16/221425)

ウェブカメラのUSBをRaspberryPi3に挿して認識確認。
パッケージのアップデートをする

>《参考》
[RASPBERRY PI のファームウェアのアップデート](https://raspberrypi.akaneiro.jp/archives/1431)

motionを入れる。

```shell
$ sudo apt-get install motion
```

motion.confのtarget_dirを変更して、画像を保存するディレクトリを指定します。

```shell
$ sudo vi /etc/motion/motion.conf
```


```motion.conf
# Target base directory for pictures and films
# Recommended to use absolute path. (Default: current working directory)
target_dir /任意のディレクトリ/
```

## 2. 撮影した画像をGoogleドライブへ保存する

Googleドライブへのアップロードはgdriveコマンドを使います。

>《参考》
[[RaspberryPi]google driveにファイルをアップロードする](https://qiita.com/jun1_0803/items/bd0ea883b9fe41bb1e69)

参考に書かれている通りにインストールを進め、

```shell
$ gdrive about
```
を実行すると、https://accounts.google.com/o/oauth2/~~~~ といったような、長いURLが表示されます。

URLコピーしてブラウザでアクセスすると、Googleの認証が求められます、
<img width="636" alt="スクリーンショット 2018-12-03 0.56.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/86461/7c9c8d65-abbc-c099-390a-3a0dab98a623.png">

許可した後、表示された認証コードをコピーしてターミナルに貼り付けてEnter。

次のコマンドでGoogleドライブに作られたフォルダ一覧を見て、画像のアップロード先のフォルダIDを確認しておきます。

```shell
$ gdrive list
```

写真をsaveする度に起動するスクリプトを`motion.conf`に指定する。

```motion.conf
on_picture_save /home/pi/upload.sh %f
```

ファイルを作って実行権限を追加。

```shell
touch upload.sh
chmod a+x upload.sh
```

```upload.sh
#!/bin/bash

/home/pi/bin/gdrive upload -p ******(先程確認したID) $1
```

motionを起動して写真を撮ってみる

```
$ motion -c /etc/motion/motion.conf
```

保存された！
<img width="875" alt="スクリーンショット 2018-12-03 1.05.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/86461/9aa824de-b4db-81ba-cf62-b5e563d514a1.png">

何度か試して一番きれいだった写真。
<img width="375" alt="01-20181202163326-20.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/86461/1970d839-039b-5e81-ee9a-0cc3564fb18c.jpeg">

カメラの位置は突っ張り棒とか使って無理やり離した（家に余ってたウェブカメラの限界）。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">RaspberryPi3にウェブカメラつないで、自宅の冷蔵庫の画像を撮るデモ。<br>扉につけてるだけじゃ近接すぎてダメだ…<br>カメラ変えるか、天井から固定とかべつのところから撮影しないといかんですね。 <a href="https://t.co/FBkqi9JQ1S">pic.twitter.com/FBkqi9JQ1S</a></p>&mdash; てぃば (@rechiba3) <a href="https://twitter.com/rechiba3/status/1069271795084083200?ref_src=twsrc%5Etfw">2018年12月2日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 3. Chatworkへの自動投稿botを作る
ChatworkのAPI利用の仕方は[コチラ](http://developer.chatwork.com/ja/)に記載されています。

API > API Tokenを開き、Chatworkアカウントのパスワードを入力。
<img width="988" alt="スクリーンショット 2018-12-02 23.48.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/86461/ab01633e-6570-00fc-9c02-3c3762b010a8.png">

「表示」を押下するとトークンが表示されます。
これをコピーして控えておきます。
<img width="999" alt="スクリーンショット 2018-12-02 23.48.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/86461/bfb64c46-a289-dd31-1fef-27f031127970.png">

Googleドライブを開き、任意のフォルダで「新規」を押下。
その他 > Google Apps Scriptを開きます。
<img width="656" alt="スクリーンショット 2018-12-02 23.53.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/86461/153aa619-946e-6e7e-dad6-92eb6ab2caa2.png">

Google Apps Script（以下、GAS）が無い人は、　その他 > アプリを追加 で追加します。
<img width="752" alt="スクリーンショット 2018-12-02 18.19.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/86461/7c845372-1515-ae09-77fd-7b74fb966b3d.png">

GASの画面を開き、リソース > ライブラリ >　ライブラリを追加から、「ChatWorkClient」を追加します。
<img width="613" alt="スクリーンショット 2018-12-03 0.02.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/86461/20de66d1-56e4-1a37-bac1-8a8f13ddbe95.png">

tokenのところに、先程ChatworkのAPI Tokenで控えたトークンを貼り付け。
room_idのところには任意のグループチャットのIDを（URLにある、#!rid以降の数字列）貼り付け。
bodyには任意の文言を入力。今回はアナウンスのように目立たせたいので、装飾タグで囲みます。
<img width="1280" alt="スクリーンショット 2018-12-02 23.58.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/86461/8da51808-cf5d-1439-1a56-9184bf78bc07.png">

実際のチャット画面では以下のように投稿されます。
<img width="622" alt="スクリーンショット 2018-12-02 18.44.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/86461/9482ca7b-ad70-9685-ca6e-c8ef312890d1.png">

## 4. botにGoogleドライブのURLを投稿する

画像が溜まるGoogleドライブのフォルダを共有設定にします。
<img width="541" alt="スクリーンショット 2018-12-03 0.07.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/86461/f36ca5f0-905b-625f-6169-98cb0f33e4b4.png">
共有可能なリンクを取得 > リンクの共有をONにして発行されたURLをコピーして、3で登録したbodyに追記します。
<img width="372" alt="スクリーンショット 2018-12-03 0.07.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/86461/ec7eb795-5df2-9dd2-0295-9f541b3b7e43.png">

実際の画面は以下になります。
投稿されたらURLリンク先に遷移します。
<img width="629" alt="スクリーンショット 2018-12-02 23.55.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/86461/091bc9d6-fd85-63f2-1ac9-37aec1e13cbb.png">

```actionscript
function chatBot() {
  var client = ChatWorkClient.factory({token: "******"}); // Chatwork API
  client.sendMessage({
    room_id: ******, // room ID
    body: "[info][title]👮🚨今日の冷蔵庫パトローーール 🚨👮[/title]帰宅前に冷蔵庫の状況を確認しましょう(talk)(https://drive.google.com/******) [/info]"}); // message
}
```

今回、初めてChatwork API触って知ったんですが、画像投稿できないんですね／(^o^)＼
本来であれば、画像投稿できたらいいのにな〜〜って思いました。
この程度であれば非公式Twitterアカウント作って垂れ流したほうがいいわな。

それかリアルタイム動画か、動体検知してスナップショット送る系（以下、参考）。

>《参考》
[#RaspberryPi で愛猫の定点監視ガジェット「トイレにゃう」を作りました](http://teppei.hateblo.jp/entry/2013/08/10/114147)


# 今後やりたいこと
冷蔵庫、閉めると暗くなるじゃん？
開けたときの明るさをセンサーで検知させないと写真撮れないじゃん？
そもそも広角で撮れないと中身網羅できなくない？？

などなど、パーツをアドオンすることでもっと良くなるような伸びしろを感じさせるネタですね。


「**オフィス共有冷蔵庫に賞味期限切れのものが放置される**」問題は常にストレスの種として存在しています。

自分が入れたものぐらい覚えとけ！共有スペースだぞ！と声高々に叫んだとしても、変わることはありません。
だってみんな、**忘れたくて忘れているわけじゃない**のです。
故意的に起こるものではなく、事故。

ということで、**人間が管理できないことはシステムで解決させましょう**。

## オフィス導入の課題
* 会社ネットワーク×ラズパイのIP固定（再起動するとIP変わる）
* モバイルバッテリーだとラズパイ3だと電圧が安定しない（電力供給どうすっぺ）
* 自宅で突っ張り棒使ったような、物理的な調整がきかない
* ChatworkAPIだと画像投稿されない

気が向いたらオフィスに本導入できるようにがんばりまーす！
まずは自席のある4Fから。

自分の作ったお弁当、カビの生えた食品と一緒にしたくは無いわな^q^