Golang + Slack App を用いてサーバーからメッセージを送る bot を作る

Custom Integrations がレガシーな機能になって、
2025年の4月くらいから使えなくなった?ので、
Slack APP に移行してみる。

下記にチュートリアル的なのが書いてある。

ひとまず、
サーバーから Slack に簡易的なメッセージを送るだけの bot を作成する。

環境

  • Golang v1.23

Slack api での作業

APP を作成する

  • 「Create New App」クリック
    • Create an app
      • 「From a manifest」選択。適当
    • Pick a workspace to develop your app
      • Pick a workspace to develop your app in: 任意のワークスペースを選択
      • 「Next」クリック
    • Create app from manifest
      • 後で変更可能なのでとりあえず「Next」クリック
    • Review summary & create your app
      • 「Create」クリック

権限を付与&ワークスペースにインストールする

  • 「Features」→「OAuth & Permissions」クリック
    • 「Scopes」
      • 「Bot Token Scopes」
        • 「Add an OAuth Scope」クリック
          • 「chat:write」選択
          • 「chat:write.public」選択
          • 「im:write」選択
    • 「OAuth Tokens」
      • 「Install to 任意のワークスペース」クリック
      • 「Allow」クリック
      • Bot User OAuth Token をコピー

Slack アプリでの作業

チャンネル作成

割愛。
適当に「00_bottest」というチャンネルを作成したつもりで進める。

チャンネルに APP を追加する

パブリックなチャンネルにメッセージ送るだけなら、
権限に「chat:write.public」を付与しているので、
この操作はスルー。

自分の環境下ではバグ?かキャッシュか知らないけど、
作成した Slack APP がデスクトップアプリに出てこないので、
ブラウザから操作する。

また、一度チャンネルに追加した APP をそのチャンネルから取り除く操作が、
どこでやればいいか分からなかったので、
追加するチャンネルに注意。

  • 左メニュー上部のチャンネル名をクリック →「Tools & settings」→「Manage App」クリック
    • 「Manage」→「Installed apps」→ 作成した APP を選択
      • ここもバグかキャッシュか知らないけど、作成した APP が出てきたり消えてたりする
    • 「App Details」クリック →「Open in Slack」クリック
    • 作成した APP の DM 画面に以下のメッセージが出てくるので「@作成したアプリ名」にカーソルを合わせる
      • This is the very beginning of your direct message history with @作成したアプリ名
        • 「Add this app to a channel...」クリック
          • メッセージを送りたいチャンネルを選択 →「Add」クリック

以下操作が多分正しいんだろうけど、
作成した APP が出てこない。

  • メッセージを送りたいチャンネルに移動 → 右上メニューアイコンクリック →「Open channel details」クリック →「Integrations」→「Add apps」クリック → 本来なら多分ここで作成した APP を選択できるはず

Golang 側

nlopes/slack - GitHub を長らく使ってきたけど、
プロジェクトが slack-go/slack - GitHub に移行されていたので、これを使う。

サンプルコード

package main

import (
	"github.com/slack-go/slack"
)

type Slack struct {
	Channels struct {
		Test string
	}
	Connection *slack.Client
}

func NewSlack() *Slack {
	s := &Slack{}
	s.Connection = slack.New("YOUR_BOT_USER_OAUTH_TOKEN")
	s.Channels.Test = "00_bottest"
	return s
}

func (s *Slack) SendMessageToTest(message string) (channel string, timestamp string, text string, err error) {
	return s.Connection.SendMessage(
		s.Channels.Test,
		slack.MsgOptionText(message, true),
	)
}

func main() {
	s := NewSlack()
	s.SendMessageToTest("hello")
}