如何使用 Golang 開發(fā) Slack 機器人?
介紹
想學(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。
添加所需的詳細(xì)信息、團隊或公司名稱、頻道名稱,并邀請可以與機器人交互的其他隊友。
想要最好的?要求最好!獲得最好的!
今天就聯(lián)系 Bacancy 并從我們這里聘請 Golang 開發(fā)人員來滿足您的產(chǎn)品要求。您所需要的只是我們技術(shù)精湛的 Golang 專家。時期。
創(chuàng)建 Slack 應(yīng)用程序
創(chuàng)建一個 Slack 應(yīng)用程序,訪問slack 網(wǎng)站并選擇從頭開始選項。
添加 Workspace 允許進一步使用的應(yīng)用程序名稱。使用應(yīng)用程序創(chuàng)建機器人。
點擊機器人;這將重定向到幫助頁面,選擇添加范圍,并向應(yīng)用程序添加權(quán)限。
單擊Review Scopes to Add并添加四個主要范圍,使機器人與應(yīng)用程序一起工作。
現(xiàn)在安裝應(yīng)用程序;如果您不是所有者,則必須向管理員請求許可。
下一步是選擇機器人可以用來作為應(yīng)用程序發(fā)布的頻道。
單擊允許并獲取身份驗證過程所需的 OAuth 令牌和 Webhook URL。
邀請應(yīng)用加入頻道。就我而言,我使用了頻道名稱 slack-bot-golang。
現(xiàn)在,鍵入以此開頭的命令消息/.;現(xiàn)在我們可以通過輸入來邀請機器人/邀請@NameOfYourbot.
基本的 Golang 設(shè)置和安裝
創(chuàng)建一個新目錄,我們在其中進一步附加所有代碼,設(shè)置與 Slack 通道的通信,并使用身份驗證令牌編寫代碼。
我們使用支持常規(guī) REST API、WebSockets、RTM 和事件的 go-slack 包,我們使用godotenv包來讀取環(huán)境變量。
使用 Golang 開發(fā) Slack 機器人
首先,創(chuàng)建一個.env用于存儲松弛憑證的文件,包括通道 ID。在創(chuàng)建應(yīng)用的web UI中找到Token;頻道 ID 可以在 UI 中找到;去獲取頻道詳情單擊頻道的下拉箭頭。
讓我們開始編碼吧。創(chuàng)建main.go。從連接到工作區(qū)開始并發(fā)布一條簡單消息以檢查一切是否正常。
接下來,創(chuàng)建一個松弛附件,其中包括我們發(fā)送到通道的消息并添加一些字段以發(fā)送額外的上下文數(shù)據(jù);是否要添加這些數(shù)據(jù)完全取決于我們。
// 主程序
包主
進口 (
“調(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í)行程序。您可以在松弛通道中看到一條新消息。
Slack 事件 API 調(diào)用
現(xiàn)在,使用 Slack 事件 API 并處理 Slack 通道中的事件。我們的機器人只聽提到的事件;如果有人提到該機器人,它將收到一個觸發(fā)事件。這些事件通過 WebSocket 傳遞。
首先,我們需要激活該部分套接字模式; 這允許機器人通過 WebSocket 連接。
現(xiàn)在,添加事件訂閱。在“功能”選項卡中找到它,然后切換按鈕以將其激活。然后將app_mention范圍添加到事件訂閱。這將觸發(fā)應(yīng)用程序中提到的新事件。
最后一件事是生成應(yīng)用程序令牌。目前,我們只有一個機器人令牌,但對于事件,我們需要一個應(yīng)用程序令牌。
轉(zhuǎn)到設(shè)置->基本信息并向下滾動到應(yīng)用級令牌部分,然后單擊生成令牌和范圍并為您的令牌命名。
在應(yīng)用端,我們需要添加connections:write范圍到該令牌,確保通過將令牌作為SLACK_APP_TOKEN添加到.env文件來保存令牌。
要使用套接字模式,請?zhí)砑右粋€名為 socketmode 的 slack-go 子包。
接下來新建一個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ā)了一個事件。
包主
進口 (
“語境”
“調(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ù)載事件。
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ù)中之前打印事件的日志。
我們需要讓機器人響應(yīng)提到它的用戶。
接下來開始登錄應(yīng)用程序并將 users:read 范圍添加到 bot 令牌,就像我們之前所做的那樣。將范圍添加到令牌后,我們將創(chuàng)建HandleAppMentionEventToBot函數(shù)。此函數(shù)將采用*slackevents.AppMentionEvent和slack.Client作為輸入,以便它可以響應(yīng)。
該事件包含我們可以獲取用戶詳細(xì)信息的event.User中的用戶 ID 。通道響應(yīng)在event.Channel期間也可用。我們需要的數(shù)據(jù)是用戶在提及時發(fā)送的實際消息,我們可以從 event.Text 中獲取。
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”錯誤,則您錯過了一些范圍。
運行應(yīng)用程序
這是我當(dāng)前運行的機器人的輸出
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 機器人。如果您有任何問題、建議或反饋,請給我們回信。隨意克隆存儲庫并使用代碼。
(言鼎科技)