如何使用 Golang 开发 Slack 机器人?

yanding 2023-06-15 452

介绍

想学习使用 Golang 构建一个 slack 机器人吗?不确定从哪里开始?在这里,我们将减轻您的挫败感并缓解您的挣扎。在 go-slack 包的帮助下,我们将看到如何设置一个 slack 工作区并将 slack 机器人与 Golang 连接。

在本教程中,我们将主要关注设置和创建可以与 Slack 频道和工作区交互的机器人。指南主要分为两部分:

  • Slack 设置: Workspace 设置并向其添加机器人应用程序

  • Golang 设置和安装:编码部分设置,其中 bot 应用程序将通过 Web 套接字向 Go 后端发送请求,在 slack 世界中称为套接字模式。

事不宜迟,让我们开始我们的教程:如何使用 Golang 开发 Slack Bot

创建松弛工作区

转到slack并单击Create a Workspace

如何使用 Golang 开发 Slack 机器人? 如何使用 Golang 开发 Slack 机器人?

添加所需的详细信息、团队或公司名称、频道名称,并邀请可以与机器人交互的其他队友。

想要最好的?要求最好!获得最好的!
今天就联系 Bacancy 并从我们这里聘请 Golang 开发人员来满足您的产品要求。您所需要的只是我们技术精湛的 Golang 专家。时期。

创建 Slack 应用程序

创建一个 Slack 应用程序,访问slack 网站并选择从头开始选项。

如何使用 Golang 开发 Slack 机器人?

添加 Workspace 允许进一步使用的应用程序名称。使用应用程序创建机器人。

如何使用 Golang 开发 Slack 机器人?

点击机器人;这将重定向到帮助页面,选择添加范围,并向应用程序添加权限。

如何使用 Golang 开发 Slack 机器人?

单击Review Scopes to Add并添加四个主要范围,使机器人与应用程序一起工作。

如何使用 Golang 开发 Slack 机器人?

现在安装应用程序;如果您不是所有者,则必须向管理员请求许可。

如何使用 Golang 开发 Slack 机器人?

下一步是选择机器人可以用来作为应用程序发布的频道。

如何使用 Golang 开发 Slack 机器人?

单击允许并获取身份验证过程所需的 OAuth 令牌和 Webhook URL。

邀请应用加入频道。就我而言,我使用了频道名称 slack-bot-golang。

现在,键入以此开头的命令消息/.;现在我们可以通过输入来邀请机器人/邀请@NameOfYourbot.

如何使用 Golang 开发 Slack 机器人? 如何使用 Golang 开发 Slack 机器人?

基本的 Golang 设置和安装

创建一个新目录,我们在其中进一步附加所有代码,设置与 Slack 通道的通信,并使用身份验证令牌编写代码。

我们使用支持常规 REST API、WebSockets、RTM 和事件的 go-slack 包,我们使用godotenv包来读取环境变量。

如何使用 Golang 开发 Slack 机器人?

使用 Golang 开发 Slack 机器人

首先,创建一个.env用于存储松弛凭证的文件,包括通道 ID。在创建应用的web UI中找到Token;频道 ID 可以在 UI 中找到;去获取频道详情单击频道的下拉箭头。

如何使用 Golang 开发 Slack 机器人? 如何使用 Golang 开发 Slack 机器人?

让我们开始编码吧。创建main.go。从连接到工作区开始并发布一条简单消息以检查一切是否正常。

接下来,创建一个松弛附件,其中包括我们发送到通道的消息并添加一些字段以发送额外的上下文数据;是否要添加这些数据完全取决于我们。

// 主程序

如何使用 Golang 开发 Slack 机器人?
包主
进口 (
   “调频”
   “操作系统”
   “时间”

   “github.com/joho/godotenv”
   “github.com/slack-go/slack”)
功能主要(){

   godotenv.Load(".env")

   令牌:= os.Getenv(“SLACK_AUTH_TOKEN”)
   channelID := os.Getenv("SLACK_CHANNEL_ID")

   客户端:= slack.New(令牌,slack.OptionDebug(真))
   附件 := slack.Attachment{
       借口:“超级机器人消息”,
       文字:“一些文字”,
       颜色:“4af030”,
       字段:[]slack.AttachmentField{
           {
               标题:“日期”,
               值:time.Now().String(),
           },
       },
   }

   _, 时间戳, 错误 := client.PostMessage(
       频道ID,

       slack.MsgOptionAttachments(附件),
   )

   如果错误!=无{
       恐慌(错误)
   }
   fmt.Printf("消息在 %s 发送", 时间戳)}

运行以下命令来执行程序。您可以在松弛通道中看到一条新消息。

如何使用 Golang 开发 Slack 机器人?
去运行 main.go

如何使用 Golang 开发 Slack 机器人?

Slack 事件 API 调用

现在,使用 Slack 事件 API 并处理 Slack 通道中的事件。我们的机器人只听提到的事件;如果有人提到该机器人,它将收到一个触发事件。这些事件通过 WebSocket 传递。

首先,我们需要激活该部分套接字模式; 这允许机器人通过 WebSocket 连接。

如何使用 Golang 开发 Slack 机器人?

现在,添加事件订阅。在“功能”选项卡中找到它,然后切换按钮以将其激活。然后将app_mention范围添加到事件订阅。这将触发应用程序中提到的新事件。

如何使用 Golang 开发 Slack 机器人? 如何使用 Golang 开发 Slack 机器人?

最后一件事是生成应用程序令牌。目前,我们只有一个机器人令牌,但对于事件,我们需要一个应用程序令牌。

转到设置->基本信息并向下滚动到应用级令牌部分,然后单击生成令牌和范围并为您的令牌命名。

如何使用 Golang 开发 Slack 机器人? 如何使用 Golang 开发 Slack 机器人?

在应用端,我们需要添加connections:write范围到该令牌,确保通过将令牌作为SLACK_APP_TOKEN添加到.env文件来保存令牌。

如何使用 Golang 开发 Slack 机器人?

要使用套接字模式,请添加一个名为 socketmode 的 slack-go 子包。

如何使用 Golang 开发 Slack 机器人?

接下来新建一个socket方式的client;这样,我们就有了两个客户端,一个用于常规 API,一个用于 WebSocket 事件。

现在通过调用socketmode.New连接 WebSocket 客户端并将常规客户端作为输入转发,并将OptionAppLevelToken添加到常规客户端,因为现在需要连接到套接字。

最后,我们调用socketClient.Run(),这将阻止并处理通道上的新 WebSocket 消息socketClient.Events. 我们放置一个 for 循环,它将不断检查新事件并添加一个类型切换来处理不同的事件。我们附加了一个 go-routine,它将在后台处理传入消息以侦听新事件。有了这个,我们在 Slack 的 EventAPI 上触发了一个事件。

如何使用 Golang 开发 Slack 机器人?
包主
进口 (
   “语境”
   “调频”
   “日志”
   “操作系统”
   “时间”

   “github.com/joho/godotenv”
   “github.com/slack-go/slack”
   “github.com/slack-go/slack/slackevents”
   “github.com/slack-go/slack/socketmode”)
功能主要(){

   godotenv.Load(".env")

   令牌:= os.Getenv(“SLACK_AUTH_TOKEN”)
   appToken := os.Getenv("SLACK_APP_TOKEN")

   客户端:= slack.New(令牌,slack.OptionDebug(真),slack.OptionAppLevelToken(appToken))

   socketClient := socketmode.New(
       客户,
       socketmode.OptionDebug(true),
       socketmode.OptionLog(log.New(os.Stdout, "socketmode: ", log.Lshortfile|log.LstdFlags)),
   )

   ctx, 取消 := context.WithCancel(context.Background())

   推迟取消()

   go func(ctx context.Context, client *slack.Client, socketClient *socketmode.Client) {
       为了 {
           选择 {
           案例 <-ctx.Done():
               log.Println("关闭 socketmode 侦听器")
               返回
           案例事件:= <-socketClient.Events:

               切换事件.Type {
       
               案例 socketmode.EventTypeEventsAPI:

                   eventsAPI,好的:= event.Data。(slackevents.EventsAPIEvent)
                   如果!好{
                       log.Printf("无法将事件类型转换为 EventsAPI: %v\n", event)
                       继续
                   }

                   socketClient.Ack(*event.Request)
                   log.Println(eventsAPI)
               }
           }
       }
   }(ctx, 客户端, socketClient)

   socketClient.Run()}

要进行测试,请运行该程序并进入 Slack 应用程序或网络,然后使用@yourbotname由机器人提及。

去运行 main.go

您应该能够在运行机器人的命令行中看到记录的事件。我们得到的事件是event_callback类型的,它包含一个负载和实际执行的事件。

接下来开始实现 HandleEventMessage ,会继续进行类型切换。我们可以使用类型字段来了解如何处理事件。然后我们可以使用 InnerEvent 字段到达有效负载事件。

如何使用 Golang 开发 Slack 机器人?
func HandleEventMessage(事件 slackevents.EventsAPIEvent,客户端 *slack.Client)错误 {
   切换事件.Type {

   案例 slackevents.CallbackEvent:

       innerEvent := 事件.InnerEvent

       switch evnt := innerEvent.Data.(type) {
           错误:= HandleAppMentionEventToBot(evnt,客户端)
           如果错误!=无{
               返回错误
           }
       }
   默认:
       return errors.New("不支持的事件类型")
   }
   返回零}

用新的HandleEventMessage函数替换主函数中之前打印事件的日志。

如何使用 Golang 开发 Slack 机器人?
log.Println(eventsAPI)
用。。。来代替
错误:= HandleEventMessage(eventsAPI,客户端)如果错误!=无{
   log.Fatal(错误)}

我们需要让机器人响应提到它的用户。

接下来开始登录应用程序并将 users:read 范围添加到 bot 令牌,就像我们之前所做的那样。将范围添加到令牌后,我们将创建HandleAppMentionEventToBot函数。此函数将采用*slackevents.AppMentionEventslack.Client作为输入,以便它可以响应。

该事件包含我们可以获取用户详细信息的event.User中的用户 ID 。通道响应在event.Channel期间也可用。我们需要的数据是用户在提及时发送的实际消息,我们可以从 event.Text 中获取

如何使用 Golang 开发 Slack 机器人?
func HandleAppMentionEventToBot(event *slackevents.AppMentionEvent, client *slack.Client) error {

   用户,错误 := client.GetUserInfo(event.User)
   如果错误!=无{
       返回错误
   }

   文本 := strings.ToLower(event.Text)

   附件 := slack.Attachment{}

   如果 strings.Contains(text, "hello") || strings.Contains(text, "hi") {
       attachment.Text = fmt.Sprintf("你好 %s", user.Name)
       attachment.Color = "#4af030"
   } else if strings.Contains(text, "weather") {
       attachment.Text = fmt.Sprintf("今天天气晴朗。%s", user.Name)
       attachment.Color = "#4af030"
   } 别的 {
       attachment.Text = fmt.Sprintf("我很好。你好吗 %s?", user.Name)
       attachment.Color = "#4af030"
   }
   _, _, err = client.PostMessage(event.Channel, slack.MsgOptionAttachments(附件))
   如果错误!=无{
       return fmt.Errorf("发布消息失败: %w", err)
   }
   返回零}

现在重新启动程序,打个招呼或嗨,再说点别的,看看它是否按预期工作。如果您收到“missing_scope”错误,则您错过了一些范围。

如何使用 Golang 开发 Slack 机器人?

运行应用程序

这是我当前运行的机器人的输出

如何使用 Golang 开发 Slack 机器人?

Github 存储库:使用 Golang 示例的 Slack Bot

如果您想访问源代码,请克隆存储库并在您的系统上设置项目。您可以尝试试用演示应用程序并探索更多内容。

这是 github 存储库:slack-bot-using-golang-example

结论

我希望本教程的目的:如何使用 Golang 开发 Slack Bot 达到预期效果。这是一个基本的分步指南,可帮助您开始使用 go-slack 包实施 slack 机器人。如果您有任何问题、建议或反馈,请给我们回信。随意克隆存储库并使用代码。

言鼎科技

The End