自動化厨のプログラミングメモブログ │ CODE:LIFE

Python/ExcelVBA/JavaScript/Raspberry Piなどで色んなことを自動化

Slackへの投稿をRaspberry Pi×Node-REDでAlexaとGoogleに読み上げてもらう③ - Slack Botとngrok導入

Alexaを喋らせるだけならGCPの永久無料枠を使うのも良いなと思ったけどGoogle Home Miniしか置いていない部屋もあるのでChromecastによる発話も対応するためにRaspberry PiでNode-RED環境を構築します。ちょっと長くなるので全4回の予定。

f:id:maru0014:20200924212224p:plain

前回

前回はAlexaを喋らせるためのモジュール「node-red-contrib-alexa-remote2」をインストール、設定、喋らせてみるところまでを行いました。

codelife.cafe

今回はSlackの特定チャンネルに投稿したらAlexaが読み上げるという状態にするため、Slack Botの作成、ngrokで公開するところまでを進めていきます。

Slack Botを作成して設定

英語だしちょこちょこ仕様変更されるので迷うこともありますが、今回必要な設定は割と少ないです。

https://api.slack.com/apps にアクセスして「Create App」からアプリを作成 f:id:maru0014:20200924205121p:plain


OAuth & Permissionsに移動して必要な権限を付与してインストール

User Token Scopes で channels:history を追加 f:id:maru0014:20200924221228p:plain

Slackからのリクエストを受けるためのノードnode-red-contrib-chatbotを追加

かなり多くのノードが追加されますが今回使うのはSlack Inのみ f:id:maru0014:20200924204903p:plain


フローに追加してダブルクリックするとこのようなメニューが表示されるのでBot configuration (development)に設定を追加 f:id:maru0014:20200924205050p:plain


Bot Name、Bot Token、Signing Secretを入力 f:id:maru0014:20200924211000p:plain


Bot User OAuth Access TokenはOAuth & Permissions内 f:id:maru0014:20200924210333p:plain


Signing SecretはBasic Information内にあります f:id:maru0014:20200924210541p:plain

ngrokでSlackからのリクエストを受け付ける

ngrok.com

Slack Botの認証設定は完了しましたがインターネット経由でRaspberry Piが情報を受け取るために ウェブ上へ公開する必要がありますが自宅のネットワークを公開しておくのは危ないのでngrokというVPNトンネルサービスを使います。

以前までは別途ngrokをインストールしていましたが、どうやらNode-REDのモジュールも存在しているようなので活用しましょう。

※アカウントがない場合は登録しておくこと

node-red-contrib-ngrok パッケージをインストール・設定

f:id:maru0014:20200924212804p:plain

ngrokノードを追加して認証情報を設定

Slackのときと同様にauthtokenの編集マークからアカウントの追加画面へ移動し ngrok - secure introspectable tunnels to localhostで確認できる自分のトークンを入力


その他の情報はPort:3001、Region:Japan、Protocol:HTTPと設定して完了 f:id:maru0014:20200924213507p:plain


injectを2つ追加

injectの1つはmsg.payload=on、もう一つはmsg.payload=offにしてngrokノードに接続 f:id:maru0014:20200924213635p:plain


onをクリックしてngrokのURLを生成

生成されたURLをコピーしておいてからデプロイ f:id:maru0014:20200924213901g:plain

Slack Botの設定画面に戻ってEvent Subscriptionを設定

まずはコピーしたngrokのアドレス末尾に「/test」を追加してアクセスして「ok」と表示されるか確認

https://XXXXXXXX.jp.ngrok.io/test

f:id:maru0014:20200924215113p:plain
okと出ていればSlackから情報を受け付ける準備が完了しています


アドレス末尾に「/events」を追加したものをSlack botの設定画面 Event Subscriptions の Request URL に設定

https://XXXXXXXX.jp.ngrok.io/events

f:id:maru0014:20200924215334p:plain
Verified となれば成功


Subscribe to events on behalf of users に message.channelsを追加

忘れずにSave Changesを押して保存。チャンネルに投稿されたメッセージをNode-REDに対して送信する設定が完了しました。

f:id:maru0014:20200924221109p:plain

Slack InノードにDebugノードを接続して正常にデータが転送されているか確認

Debugノードを接続してデプロイ f:id:maru0014:20200924215935p:plain


Slackのチャンネルで何かしら投稿してみてデバッグウィンドウにデータが表示されるか確認

f:id:maru0014:20200924221556g:plain


Slackの特定チャンネルへの投稿のみをAlexaに読んでもらう

switchノードによるチャンネル条件分岐

間にswitchノードを追加して条件分岐することで特定チャンネルだけ処理させます f:id:maru0014:20200924221840p:plain


チャンネル情報はmsg.payload.chatIdに格納されているのでmsg.payload.chatId == <対象のchatId>のように設定 f:id:maru0014:20200924222022p:plain

Alexa Routineの設定

Alexaに喋ってもらう内容はmsg.payload.contentに格納されているのでTextの値として設定

忘れずデプロイしてからSlackにメッセージを投げてみましょう f:id:maru0014:20200924222228p:plain


あとは色々喋らせてあそぶだけーーー。


次回はGoogle Home miniたちも同時に喋らせるように設定していきます。