1
0

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.

GolangからSlackに画像を投稿する

Posted at

Golang から Slack API を使って,画像を投稿する

Overview

golangを使って画像ファイルをslackに投稿します.
slack apiを利用しますが,テキストを投稿する場合とは少し異なる準備が必要なので,画像投稿までの手順について整理しました.

Contents

事前準備

投稿に必要な権限について

slack に画像を投稿するには,files.uploadのスコープを備えた api token が必要になります.
*files.uploadについてはこちら

Screen Shot 2019-06-03 at 0.02.14.png

上記を満たすスコープは

  1. bot
  2. 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 に画像を投稿します.

Screen Shot 2019-06-03 at 0.17.36.png

画像を投稿するコード

取得した 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)もあります.
したがって,これまでに設定した環境からテキストを投稿することも可能です.

Screen Shot 2019-06-03 at 0.36.27.png

テキストを投稿するコード

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 スコープの乱用にはご注意ください.

参照サイト

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?