Slack
node-red
slackbot
Unibo
skillcreator

SlackのWebAPIを直接呼ぶときに困ったこと

はじめに

cloudfunding-198x148.jpg
会社でUniboというAIロボットを扱っているのですが、こちらの記事にある通りSlackとつなげてみようということになりました。
が、巷にあるSlackと繋げてみた系の記事は軒並みランタイム環境用のライブラリを使っているものばかり。。
Uniboは、直接ソースからプログラムを実行することができず、またSkillCreator(Node-REDベース)でアクションを定義することができますが、オリジナルのNode-REDのように自由にノードを追加することができない制約があります。
そこで、Slack公式のAPIドキュメントを眺めつつ、直接APIをHTTP Requestするよう実装するには?で若干ハマりましたので、記事を起こしました。

困ったこと

UniboはロボットなのでBotTokenを取得して、BotとしてメッセージをSlackに投げるわけですが、APIは chat.postMessage を使用することになります。
で、公式のAPIドキュメントではこう書かれています。
chat.postMessage
キャプチャ.PNG

なので、tokenはchannelと同様にリクエストパラメータで送信してしまいそうになりますよね。

msg.payload = {
    "token": "xoxb-...",
    "channel": "CDVSKQUAZ",
    "text": "hello!"
};
return msg;

で、これをやると、Slackサーバーからは、こんな感じにツーンとされます。

{
    "ok": false,
    "error": "not_authed",
    "warning": "missing_charset",
    "response_metadata": {
        "warnings": [
            "missing_charset"
        ]
    }
}

認証されてないよ!

解決方法

結局、tokenってOAuth(認証のしくみ)のものなので、これに従ってHTTP Requestしてやる必要があります。
つまり、ヘッダに"Authorization"を指定してやります。
SkillCreator(Node-RED)だと、こんな感じ。

msg.headers = {
    "content-type": "application/json",
    "Authorization": "Bearer xoxb-..."
};
msg.payload = {
    "channel": "CDVSKQUAZ",
    "text": "hello!"
};
return msg;

"Bearer"については、このあたりに記事がありました。

まとめ

ライブラリは便利です。
が、ライブラリを使わなくても公式のWebAPIをそのまま使用することができます。
そんなときは、初心忘れるべからず。
ドキュメントはちゃんと読め。

キャプチャ.PNG

https://api.slack.com/web#posting_json
キャプチャ.PNG

以上です。