29
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-11-09

はじめに

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

以上です。

29
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?