Edited at

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

以上です。