Carpe Diem

備忘録

Slack Botでアイコンをメッセージごとに変更したい

背景

  • slack botが投稿するメッセージによって伝えたい内容が異なるため、アイコン(アバター)をそれぞれ変えたい
  • けれどslackアプリはたくさん管理するのは大変

という状況の時に、1つのslackアプリでもメッセージ投稿でアイコンを変更する方法について紹介します。

環境

あらかじめslackアプリを用意しておきます。

見ての通りデフォルトのアプリアイコンには猫を設定しています。

方法

方法としては2つの対応をするだけです。

  1. slackアプリにchat:write.customize権限をつける
  2. 投稿時にIcon変更のオプションをつける

slackアプリにchat:write.customize権限をつける

OAuth & Permissionsにある、

Scopesで、通常メッセージ投稿のためにchat:writeが付いていると思いますが、それに加えてchat:write.customize権限をつけます。

この状態です。

2. 投稿時にIcon変更のオプションをつける

次に実装で

などを使います。

package main

import (
        "fmt"
        "log"

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

type Client struct {
        cli *slack.Client
}

func NewClient(cli *slack.Client) *Client {
        return &Client{
                cli: cli,
        }
}

const (
        token     = "xoxb-xxx-xxx-xxx"
        channelID = "xxx"
        imgURL    = "https://xxxx"
)

func main() {
        client := NewClient(slack.New(token))
        resp, _, err := client.cli.PostMessage(channelID,
                slack.MsgOptionText("Hello", false),
                // slack.MsgOptionIconURL(imgURL),
                slack.MsgOptionIconEmoji(":wave:"),
        )
        if err != nil {
                log.Fatal(err)
        }
        fmt.Println(resp)
}

絵文字は次のようなサイトでどんなものが使えるかを確認できます。

🎁 Emoji cheat sheet for GitHub, Basecamp, Slack & more

動作確認

期待通りデフォルトのアイコン以外のアイコンでメッセージが投稿されています。

※注意として投稿間隔が短いとUI上表示されないので動作確認できないです

その他

IconURLとIconEmoji両方設定するとEmojiが勝つ

次のように両方設定した場合だと、IconEmojiの方が勝ちます。

        resp, _, err := client.cli.PostMessage(channelID,
                slack.MsgOptionText("Hello", false),
                slack.MsgOptionIconURL(imgURL),
                slack.MsgOptionIconEmoji(":wave:"),
        )

ドキュメントにも書いてあります。

ref: chat.postMessage method | Slack

まとめ

SlackのBotメッセージを投稿する際にアイコンを都度変更する方法を紹介しました。

参考