SlackからRaspberry Piにメッセージを送信する

PCやスマホのSlackからRaspberry Piにメッセージを送信します。メッセージ内容に応じた処理をラズパイに登録しておくことで、スマホからラズパイの再起動・シャットダウンといったことも可能になります。また、Node-REDからSlackにメッセージ（Emoji Icon付き）、画像ファイルを送信する方法についても記載します。スマホでラズパイを操作したい方、Slackに自動でメッセージを送信したい方はぜひお試しください。

# Slackノードのインストールと事前準備

導入手順は[こちら（botsを使用）](https://qiita.com/KURO-BLACK/items/0cb3fac16c26876e5d00)と[こちら（hubotを使用）](https://qiita.com/utti0331/items/7980bee5ca5f6481ee8e)に分かりやすくまとまっています。どちらか１つを導入すればよいです。また、slackノードからメッセージを送信する場合は、[こちら（botsを使用）](https://qiita.com/KURO-BLACK/items/0cb3fac16c26876e5d00)のIncoming WebHooksの手順にてWebHook URLを取得しておきます。また、Slackに画像も送信したい場合は、[こちら](https://qiita.com/stkdev/items/992921572eefc7de4ad8)か[こちら](https://qiita.com/tottu22/items/594e8c506ece0f8cc87c)の手順でChannel IDを取得しておきます。ありがたく参照させていただくことにして、ここでは割愛します。以上で必要なものは揃います。

# 実現方法

### PCやスマホのSlackからRaspberry Piにメッセージを送信：
事前準備の手順に従って、Slackにbotsもしくはhubotの設定が行い、トークンを取得してあるものします。**取得したトークンをSlack Bot Inノードに指定**することで、PCやスマホのSlackから当該ボット宛に送信したメッセージをSlack Bot Inが受け取ることができます（メッセージはmsg.payloadに格納される）。例えば**メッセージが「reboot」であれば、sudo rebootを行うexecノードを配置すれば、スマホから再起動が可能**になります。
![slack01.JPG](https://qiita-image-store.s3.amazonaws.com/0/317078/7c2925d3-53af-bfe1-b318-ec1a23f7dbe4.jpeg)
（起動時にNode-REDが自動起動する設定にしておかないと、再度スマホからrebootはできないのでご注意ください。）
また、**Slack Bot Outノードにも同じトークンを指定**しておくことで、Slack Bot Outに渡したmsg.payloadがボットに送信してPCやスマホから閲覧可能となります。

### Raspberry PiからSlackにメッセージ（Emoji Icon付き）を送信：
**slackノードにWebHook URLと「#」で始まるChannel名を指定**し、msg.username, msg.emojiIcon, msg.payloadにそれぞれ表示するユーザ名、Emoji Icon, メッセージをセットした状態でslackノードにmsgを渡します。そうすることで指定のChannelにメッセージを送信して、PCやスマホから閲覧可能となります。以下はslackノードに渡すmsgを用意するfunctionノードのコードイメージです。

```functionノードのコード
msg.username='user name'
msg.emojiIcon=':smile:';
msg.payload = 'メッセージ';
return msg;
```
（注意１）以下の「slackノードの編集」にて「Posting UserName」や「Emoji Icon」を設定していると、**これらの設定値のほうがmsgで渡すmsg.usernameやmsg.emojiIconよりも優先**されます。msgを使用して渡す値を切り替えたい場合は、**以下の編集画面の設定値は空白**にしておきます。（WebHook URLは空白ではなく設定が必要です。）
![slack02.JPG](https://qiita-image-store.s3.amazonaws.com/0/317078/683f9c71-f902-39e7-9187-8242852f8fb1.jpeg)
（注意２）msg.usernameは切り替えずにmsg.emojiIconのみ切り替えてメッセージ送信しても、Slack上に表示されるEmoji Iconは切り替わらないようです（同じユーザのメッセージとして連続でメッセージのみ表示される）。これは**msg.emojiIcon（もしくは編集画面の「Emoji Icon」）で指定するのがユーザのアイコンだから**であり、msg.emojiIconでユーザのアイコンをメッセージごとに切り替えたい場合は、ユーザを切り替える（msg.emojiIconとmsg.usernameをセットで切り替える）ようにすればよいようです。メッセージ内に表示するEmoji Iconを切り替えたい場合はmsg.payloadに切り替えた絵文字のコードを埋め込めばよいです。

```
msg.payload='メッセージ:smile:'
```
Emoji Iconの一覧は[こちら](https://qiita.com/yamadashy/items/ae673f2bae8f1525b6af)にまとまっていますので、めぼしいものをmsg.payloadに設定して表示してみるとよいかと思います。

### Raspberry PiからSlackにメッセージと画像（jpg等）を送信：
これはslackノードでは実現できなさそうでしたので、pythonでコードを書き、Node-RED上のexecノードから実行します。requests.postを使用するにあたりトークンとChannel IDが必要になりますが、前述の通りトークンはbotsもしくはhubotの設定時に取得したトークン、**Channel IDは「#」で始まるChannel名ではなく、別のもの**であることにご注意ください。（slackノードを使用した場合の送信はノードで指定したユーザからの送信、この方法の送信はトークンに対応するボットからの送信になります。）
Channel IDの確認方法とPythonコードは[こちら](https://qiita.com/stkdev/items/992921572eefc7de4ad8)と[こちら](https://qiita.com/tottu22/items/594e8c506ece0f8cc87c)を参照させていただきました。
また、Node-REDのフロー上で送信する画像ファイルを切り替えたい場合は、Pythonコードで

```
import sys
args = sys.argv
filename = args[1]
...
```
などで引数を取得するようにしておき、execノードは以下のようにmsg.payloadを引数に使用する旨のチェックボックスをonにしておけばよいです。execノードに対して画像ファイル名が格納されたmsg.payloadを渡せば、そのファイルをSlackに送信することができます（ファイル名は絶対パスで渡すのがよいかと思います）。
![slack03.JPG](https://qiita-image-store.s3.amazonaws.com/0/317078/7b320e65-cc96-2539-cb42-b545a2ebbebb.jpeg)

# まとめ
長々と書きましたが、ポイントは以下の通りです。
1. **PCやスマホからRaspberry Piにメッセージを送る**場合は、**Slackにボットの設定**と**トークンの取得**、**Slack Bot Inノードに当該トークンを設定**。
2. **Raspberry PiからPCやスマホ（のslack）にメッセージを送る**場合は、画像を送らないのであれば**SlackにIncoming WebHooksの設定**と**WebHook URLの取得**、**slackノードに当該WebHook URLと「#」で始まるChannel名を設定**。
3. 画像も送るのであれば**ボットのトークンと「#」で始まるChannel名とは異なるChannel IDを取得**、**Pythonコードを用意**したうえで**当該トークンと当該Channel IDを設定**。


# 参考にしたサイト
BotsとIncoming WebHooks: [node-redにSlackをつなげてみる](https://qiita.com/KURO-BLACK/items/0cb3fac16c26876e5d00)
Hubot: [一番シンプルにSlackでbotを作る](https://qiita.com/utti0331/items/7980bee5ca5f6481ee8e)
Channel ID取得と画像送信: [プログラムからSlackに画像投稿する方法まとめ](https://qiita.com/stkdev/items/992921572eefc7de4ad8)
Channel ID取得と画像送信：[PythonでSlackに画像をアップロードする方法](https://qiita.com/tottu22/items/594e8c506ece0f8cc87c)
Emoji Iconリスト:[Qiita/Github/Slack/Discord 絵文字一覧](https://qiita.com/yamadashy/items/ae673f2bae8f1525b6af)