Golang から Slack API を使って,画像を投稿する
Overview
golangを使って画像ファイルをslackに投稿します.
slack apiを利用しますが,テキストを投稿する場合とは少し異なる準備が必要なので,画像投稿までの手順について整理しました.
Contents
事前準備
投稿に必要な権限について
slack に画像を投稿するには,files.uploadのスコープを備えた api token が必要になります.
*files.uploadについてはこちら
上記を満たすスコープは
- bot
- files:write:user
の2種類があるので,今回は bot スコープを利用します.
ちなみに, files:write:user のスコープを利用すると,slackへの画像投稿主がトークン作成者になります.
作成者による投稿と api による投稿の区別がつかなくなってしまうので, bot スコープによる投稿をお勧めします.
slack api token の取得
Slack API | Slack にアクセスして, Your Apps から bot を生成してください.
生成が完了すると,以下の Bot User OAuth Access Token から bot 権限をもつ api token が取得できます.
このトークンを利用して, slack に画像を投稿します.
画像を投稿するコード
取得した bot スコープを持つ api token と,画像を投稿するチャンネル名を設定します.
実環境で運用する場合は,環境変数に設定した上で, os.Getenv() 経由で api token を受け取ってください.
package main
import (
"os"
"github.com/nlopes/slack"
)
var (
slackAPIToken = "<先ほど取得した, bot スコープを持つ api token>"
slackChannel = "<画像を投稿するチャンネル名>"
)
func main() {
if err := postImage(slackAPIToken, slackChannel); err != nil {
panic(err)
}
}
func postImage(slackAPIToken, slackChannel string) error {
file, err := os.Open("<投稿する画像へのパス>")
if err != nil {
return err
}
api := slack.New(slackAPIToken)
_, err = api.UploadFile(
slack.FileUploadParameters{
Reader: file,
Filename: "upload file name",
Channels: []string{slackChannel},
})
return err
}
上記コードを起動すると, 変数 slackChannel で指定した slack channel に画像が投稿されます.
テキストを投稿する場合
bot スコープには画像を投稿する権限(chat.postMessage)もあります.
したがって,これまでに設定した環境からテキストを投稿することも可能です.
テキストを投稿するコード
package main
import (
"os"
"github.com/nlopes/slack"
)
var (
slackAPIToken = "<bot スコープを持つ api token>"
slackChannel = "<画像を投稿するチャンネル名>"
)
func main() {
if err := postText(slackAPIToken, slackChannel); err != nil {
panic(err)
}
}
func postText(slackAPIToken, slackChannel string) error {
text := "This is test."
api := slack.New(slackAPIToken)
_, _, err := api.PostMessage(
slackChannel,
slack.MsgOptionText(text, false))
return err
}
注意事項
今回の slakc api では,
- api token 作成者による投稿
- api token を利用した投稿
の2つを区別するために bot 権限を利用しました.
しかし,これまでに見たように,
「画像をアップロードする権限を与えたら,テキストの投稿もできるようになった」
というような,意図しない権限付与が発生するので, bot スコープの乱用にはご注意ください.