如何使用 Golang 開發(fā) Slack 機器人?

yanding 2023-06-15 774

介紹

想學(xué)習(xí)使用 Golang 構(gòu)建一個 slack 機器人嗎?不確定從哪里開始?在這里,我們將減輕您的挫敗感并緩解您的掙扎。在 go-slack 包的幫助下,我們將看到如何設(shè)置一個 slack 工作區(qū)并將 slack 機器人與 Golang 連接。

在本教程中,我們將主要關(guān)注設(shè)置和創(chuàng)建可以與 Slack 頻道和工作區(qū)交互的機器人。指南主要分為兩部分:

  • Slack 設(shè)置: Workspace 設(shè)置并向其添加機器人應(yīng)用程序

  • Golang 設(shè)置和安裝:編碼部分設(shè)置,其中 bot 應(yīng)用程序?qū)⑼ㄟ^ Web 套接字向 Go 后端發(fā)送請求,在 slack 世界中稱為套接字模式。

事不宜遲,讓我們開始我們的教程:如何使用 Golang 開發(fā) Slack Bot。

創(chuàng)建松弛工作區(qū)

轉(zhuǎn)到slack并單擊Create a Workspace。

如何使用 Golang 開發(fā) Slack 機器人? 如何使用 Golang 開發(fā) Slack 機器人?

添加所需的詳細(xì)信息、團隊或公司名稱、頻道名稱,并邀請可以與機器人交互的其他隊友。

想要最好的?要求最好!獲得最好的!
今天就聯(lián)系 Bacancy 并從我們這里聘請 Golang 開發(fā)人員來滿足您的產(chǎn)品要求。您所需要的只是我們技術(shù)精湛的 Golang 專家。時期。

創(chuàng)建 Slack 應(yīng)用程序

創(chuàng)建一個 Slack 應(yīng)用程序,訪問slack 網(wǎng)站并選擇從頭開始選項。

如何使用 Golang 開發(fā) Slack 機器人?

添加 Workspace 允許進一步使用的應(yīng)用程序名稱。使用應(yīng)用程序創(chuàng)建機器人。

如何使用 Golang 開發(fā) Slack 機器人?

點擊機器人;這將重定向到幫助頁面,選擇添加范圍,并向應(yīng)用程序添加權(quán)限。

如何使用 Golang 開發(fā) Slack 機器人?

單擊Review Scopes to Add并添加四個主要范圍,使機器人與應(yīng)用程序一起工作。

如何使用 Golang 開發(fā) Slack 機器人?

現(xiàn)在安裝應(yīng)用程序;如果您不是所有者,則必須向管理員請求許可。

如何使用 Golang 開發(fā) Slack 機器人?

下一步是選擇機器人可以用來作為應(yīng)用程序發(fā)布的頻道。

如何使用 Golang 開發(fā) Slack 機器人?

單擊允許并獲取身份驗證過程所需的 OAuth 令牌和 Webhook URL。

邀請應(yīng)用加入頻道。就我而言,我使用了頻道名稱 slack-bot-golang。

現(xiàn)在,鍵入以此開頭的命令消息/.;現(xiàn)在我們可以通過輸入來邀請機器人/邀請@NameOfYourbot.

如何使用 Golang 開發(fā) Slack 機器人? 如何使用 Golang 開發(fā) Slack 機器人?

基本的 Golang 設(shè)置和安裝

創(chuàng)建一個新目錄,我們在其中進一步附加所有代碼,設(shè)置與 Slack 通道的通信,并使用身份驗證令牌編寫代碼。

我們使用支持常規(guī) REST API、WebSockets、RTM 和事件的 go-slack 包,我們使用godotenv包來讀取環(huán)境變量。

如何使用 Golang 開發(fā) Slack 機器人?

使用 Golang 開發(fā) Slack 機器人

首先,創(chuàng)建一個.env用于存儲松弛憑證的文件,包括通道 ID。在創(chuàng)建應(yīng)用的web UI中找到Token;頻道 ID 可以在 UI 中找到;去獲取頻道詳情單擊頻道的下拉箭頭。

如何使用 Golang 開發(fā) Slack 機器人? 如何使用 Golang 開發(fā) Slack 機器人?

讓我們開始編碼吧。創(chuàng)建main.go。從連接到工作區(qū)開始并發(fā)布一條簡單消息以檢查一切是否正常。

接下來,創(chuàng)建一個松弛附件,其中包括我們發(fā)送到通道的消息并添加一些字段以發(fā)送額外的上下文數(shù)據(jù);是否要添加這些數(shù)據(jù)完全取決于我們。

// 主程序

如何使用 Golang 開發(fā) Slack 機器人?
包主
進口 (
   “調(diào)頻”
   “操作系統(tǒng)”
   “時間”

   “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{
           {
               標(biāo)題:“日期”,
               值:time.Now().String(),
           },
       },
   }

   _, 時間戳, 錯誤 := client.PostMessage(
       頻道ID,

       slack.MsgOptionAttachments(附件),
   )

   如果錯誤!=無{
       恐慌(錯誤)
   }
   fmt.Printf("消息在 %s 發(fā)送", 時間戳)}

運行以下命令來執(zhí)行程序。您可以在松弛通道中看到一條新消息。

如何使用 Golang 開發(fā) Slack 機器人?
去運行 main.go

如何使用 Golang 開發(fā) Slack 機器人?

Slack 事件 API 調(diào)用

現(xiàn)在,使用 Slack 事件 API 并處理 Slack 通道中的事件。我們的機器人只聽提到的事件;如果有人提到該機器人,它將收到一個觸發(fā)事件。這些事件通過 WebSocket 傳遞。

首先,我們需要激活該部分套接字模式; 這允許機器人通過 WebSocket 連接。

如何使用 Golang 開發(fā) Slack 機器人?

現(xiàn)在,添加事件訂閱。在“功能”選項卡中找到它,然后切換按鈕以將其激活。然后將app_mention范圍添加到事件訂閱。這將觸發(fā)應(yīng)用程序中提到的新事件。

如何使用 Golang 開發(fā) Slack 機器人? 如何使用 Golang 開發(fā) Slack 機器人?

最后一件事是生成應(yīng)用程序令牌。目前,我們只有一個機器人令牌,但對于事件,我們需要一個應(yīng)用程序令牌。

轉(zhuǎn)到設(shè)置->基本信息并向下滾動到應(yīng)用級令牌部分,然后單擊生成令牌和范圍并為您的令牌命名。

如何使用 Golang 開發(fā) Slack 機器人? 如何使用 Golang 開發(fā) Slack 機器人?

在應(yīng)用端,我們需要添加connections:write范圍到該令牌,確保通過將令牌作為SLACK_APP_TOKEN添加到.env文件來保存令牌。

如何使用 Golang 開發(fā) Slack 機器人?

要使用套接字模式,請?zhí)砑右粋€名為 socketmode 的 slack-go 子包。

如何使用 Golang 開發(fā) Slack 機器人?

接下來新建一個socket方式的client;這樣,我們就有了兩個客戶端,一個用于常規(guī) API,一個用于 WebSocket 事件。

現(xiàn)在通過調(diào)用socketmode.New連接 WebSocket 客戶端并將常規(guī)客戶端作為輸入轉(zhuǎn)發(fā),并將OptionAppLevelToken添加到常規(guī)客戶端,因為現(xiàn)在需要連接到套接字。

最后,我們調(diào)用socketClient.Run(),這將阻止并處理通道上的新 WebSocket 消息socketClient.Events. 我們放置一個 for 循環(huán),它將不斷檢查新事件并添加一個類型切換來處理不同的事件。我們附加了一個 go-routine,它將在后臺處理傳入消息以偵聽新事件。有了這個,我們在 Slack 的 EventAPI 上觸發(fā)了一個事件。

如何使用 Golang 開發(fā) Slack 機器人?
包主
進口 (
   “語境”
   “調(diào)頻”
   “日志”
   “操作系統(tǒng)”
   “時間”

   “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("關(guān)閉 socketmode 偵聽器")
               返回
           案例事件:= <-socketClient.Events:

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

                   eventsAPI,好的:= event.Data。(slackevents.EventsAPIEvent)
                   如果!好{
                       log.Printf("無法將事件類型轉(zhuǎn)換為 EventsAPI: %v\n", event)
                       繼續(xù)
                   }

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

   socketClient.Run()}

要進行測試,請運行該程序并進入 Slack 應(yīng)用程序或網(wǎng)絡(luò),然后使用@yourbotname由機器人提及。

去運行 main.go

您應(yīng)該能夠在運行機器人的命令行中看到記錄的事件。我們得到的事件是event_callback類型的,它包含一個負(fù)載和實際執(zhí)行的事件。

接下來開始實現(xiàn) HandleEventMessage ,會繼續(xù)進行類型切換。我們可以使用類型字段來了解如何處理事件。然后我們可以使用 InnerEvent 字段到達(dá)有效負(fù)載事件。

如何使用 Golang 開發(fā) Slack 機器人?
func HandleEventMessage(事件 slackevents.EventsAPIEvent,客戶端 *slack.Client)錯誤 {
   切換事件.Type {

   案例 slackevents.CallbackEvent:

       innerEvent := 事件.InnerEvent

       switch evnt := innerEvent.Data.(type) {
           錯誤:= HandleAppMentionEventToBot(evnt,客戶端)
           如果錯誤!=無{
               返回錯誤
           }
       }
   默認(rèn):
       return errors.New("不支持的事件類型")
   }
   返回零}

用新的HandleEventMessage函數(shù)替換主函數(shù)中之前打印事件的日志。

如何使用 Golang 開發(fā) Slack 機器人?
log.Println(eventsAPI)
用。。。來代替
錯誤:= HandleEventMessage(eventsAPI,客戶端)如果錯誤!=無{
   log.Fatal(錯誤)}

我們需要讓機器人響應(yīng)提到它的用戶。

接下來開始登錄應(yīng)用程序并將 users:read 范圍添加到 bot 令牌,就像我們之前所做的那樣。將范圍添加到令牌后,我們將創(chuàng)建HandleAppMentionEventToBot函數(shù)。此函數(shù)將采用*slackevents.AppMentionEventslack.Client作為輸入,以便它可以響應(yīng)。

該事件包含我們可以獲取用戶詳細(xì)信息的event.User中的用戶 ID 。通道響應(yīng)在event.Channel期間也可用。我們需要的數(shù)據(jù)是用戶在提及時發(fā)送的實際消息,我們可以從 event.Text 中獲取。

如何使用 Golang 開發(fā) 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("發(fā)布消息失敗: %w", err)
   }
   返回零}

現(xiàn)在重新啟動程序,打個招呼或嗨,再說點別的,看看它是否按預(yù)期工作。如果您收到“missing_scope”錯誤,則您錯過了一些范圍。

如何使用 Golang 開發(fā) Slack 機器人?

運行應(yīng)用程序

這是我當(dāng)前運行的機器人的輸出

如何使用 Golang 開發(fā) Slack 機器人?

Github 存儲庫:使用 Golang 示例的 Slack Bot

如果您想訪問源代碼,請克隆存儲庫并在您的系統(tǒng)上設(shè)置項目。您可以嘗試試用演示應(yīng)用程序并探索更多內(nèi)容。

這是 github 存儲庫:slack-bot-using-golang-example

結(jié)論

我希望本教程的目的:如何使用 Golang 開發(fā) Slack Bot 達(dá)到預(yù)期效果。這是一個基本的分步指南,可幫助您開始使用 go-slack 包實施 slack 機器人。如果您有任何問題、建議或反饋,請給我們回信。隨意克隆存儲庫并使用代碼。

言鼎科技

The End