GoでSlackのThreadに対応したbotを作る話

普段、業務で Slack を使っています。



Slackは前職から使っていますし、使い手の事を本当によく考えた Chat App で使いやすいと思っています。
SRE Lounge ( #srelounge ) や SRE NEXT ( #srenext ) といったコミュニティ活動や、カンファレンスのやりとりでも使わせていただいています。
UXにしろ何にしろ色んなことを学べる良いツールだと感心しています。
(ステマっぽいw)

さて、そんなSlackですがBotを作ってる方は多いのではないでしょうか。

例えば、 Zapier だったり、 try.io だったり、またはそれらのAlt OSS の n8n を使っていたり、最近出ました ワークフロービルダー を使ったり、または自分で開発したりしてると思います。

自分でSlack Botを開発する場合は、Node.js かPythonを使用するのが多いと思います。

しかし、実はGoでも基本的なところが簡単に対応できることを紹介したく、7月ですが Slack Dev Meetup Tokyo というのがあったので、LTで紹介させていただきました。

Slack には thread という機能があります。

そのthread 内でSlack botを応答させるには threadのtimestampを使用するのですが、Goでこれを簡単に使うためのsampleが当時なかったため、それを紹介しました。

Go + Google Cloud Functions で Slack のスレッドにも対応した bot を簡単に作る方法

Sample code

package gcf_slack_sample  

import (  
    "net/http"  
    "os"  
    "strings"  

    "github.com/nlopes/slack"  
)  

var (  
    threadTs slack.RTMsgOption  
)  

type SlackParams struct {  
    accessToken string  
    botUserID   string  
    rtm         *slack.RTM  
}  

func PostMessage(w http.ResponseWriter, r *http.Request) {  
    params := SlackParams{  
        accessToken: os.Getenv("ACCESS_TOKEN"),  
        botUserID:   "",  
    }  

    api := slack.New(params.accessToken)  
    params.rtm = api.NewRTM()  

    go params.rtm.ManageConnection()  

    go func() {  
        for msg := range params.rtm.IncomingEvents {  
            switch ev := msg.Data.(type) {  
            case *slack.ConnectedEvent:  
                params.botUserID = ev.Info.User.ID  
            case *slack.MessageEvent:  
                if !strings.Contains(ev.Msg.Text, params.botUserID) {  
                    continue  
                }  
                threadTs = slack.RTMsgOptionTS(ev.ThreadTimestamp)  
                params.rtm.SendMessage(params.rtm.NewOutgoingMessage("Sample TEST", ev.Channel, threadTs))  
            }  
        }  
    }()  
}  

懇親会で話した時に「Goに興味はある」というお話を聞きました。
Goの練習にも良いのではないでしょうか。
少しはSlack botで特殊な書き方が必要ですがほとんどそのままで書けますし、私はそれでGoの理解を深められました。

実際の業務でもこれでGoにてSlack bot を作って運用しています。
それはまた今度どこかで紹介できれば紹介したいと思います。