文章目錄
使用 C# (.NET Core) 傳訊息至 Slack
公司有個臨時性需求:某個重要功能開啟或是關閉時,立即通知營運團隊及各級主管知道,讓大家在討論 production issue 有共同的討論基準。
經過一番討論後決定將功能開關通知透過 slack 來實作,雖然用 slack 整點好段時間卻沒真的自己寫過,一時間沒能快速找到程式碼可以抄XD 所以就能紀錄一篇以後就省事了 哈哈
建立 Slack workspace
- Create a new workspace
確認 email
輸入 workspace 名稱
輸入 channel 名稱
邀請其他人或略過
完成基本設定
建立 Token
使用 user token
建立個人 token : Legacy tokens
成功建立後會連帶建立
Slack API Tester
app 用來發送訊息
使用 bot token
透過 Build something amazing. 建立 Apps
填入名稱及選擇目標 workspace
加入 bot 功能
將 app 安裝至 workspace 中
取得 Bot User OAuth Access Token
- 關於 token 類型請參考 Types of tokens
取得 channel id
Slack 測試傳送訊息
可以透過 chat.postMessage 來測試發送訊息
User Token
bot token
傳送訊息至 Slack
Slack 的
chat.postMessage
是 REST API,以下透過 .NET Core console 搭配 HttpClientFactory 來傳送訊息
基本設定
如果想更深入了解相關設定可以參考 在 .NET Core console 上使用 Dependency Injection - DI 與 在 .NET Core 與 .NET Framework 上使用 HttpClientFactory
var builder = //新建 HostBuilder new HostBuilder() //設定所需 service .ConfigureServices((hostContext, services) => { //設定每次 request 都會建立 具名 HttpClient services.AddHttpClient("yowkoslacksender", c => { c.BaseAddress = new Uri("https://slack.com/api/"); }); }); var clientFactory = //使用上面建立的 host builder 來初始化 host builder.Build() //從 service provider 中取得建立的 IHttpClientFactory 服務 .Services.GetRequiredService<IHttpClientFactory>(); //由 HttpClientFactory 來建立 HttpClient var client = clientFactory.CreateClient("yowkoslacksender"); var token = "xoxb-xxxx";//access token var channel = "xxxx";//channelId
簡易內容 (僅文字)
var text = System.Web.HttpUtility.UrlEncode("yowko 測試");//實際內容 //透過 Get 傳送至 slack client.GetAsync($"chat.postMessage?token={token}&channel={channel}&text={text}");
格式化內容 (包含圖片、超連結、或是按鈕….)
//準備格式化內谷實際顯示值 var attachments = new List<Attachment>() { new Attachment(){ color="#36a64f",//實際顯示時的引用線顏色 pretext= "原本 text 位置內容", author_name= "第一行(作者)", author_link= "", author_icon= "http://flickr.com/icons/bobby.jpg", title= "標題", title_link= "", text= "實際內文", fields= new List<Field>(){ new Field(){ title= "Priority", value= "High"} } , footer= "置底內容", footer_icon= "https://platform.slack-edge.com/img/default_application_icon.png", } }; //格式化內容轉為 string 再進行 urlencode 以利 get 傳送 var attachment = System.Web.HttpUtility.UrlEncode(JsonConvert.SerializeObject(attachments)); //透過 Get 傳送至 slack client.GetAsync($"chat.postMessage?token={token}&channel={channel}&attachments={attachment}");
格式化內容相關設定可以參考 Basic message formatting
心得
Slack 文件滿雜亂的,感覺起來應該歷經了許多演化,就連 API 的使用也有類似的影子,就以傳送訊息為例,可以找到好幾種做法,每種做法間似乎又沒有什麼脈絡可以依循,很容易搞混
另外最令我困擾的是 REST API 的說明,明明文件說要用 POST,但怎麼用就是失敗,查了資料才發現很多人說應該是 GET 才對XD 將程式改為 GET 問題就解決了,不知道官方的立場是什麼 感覺不是基本的錯誤而是有其他層面的考量
參考資訊
文章作者 Yowko Tsai
上次更新 2021-11-03
授權合約
本部落格 (Yowko's Notes) 所有的文章內容(包含圖片),任何轉載行為,必須通知並獲本部落格作者 (Yowko Tsai) 的同意始得轉載,且轉載皆須註明出處與作者。
Yowko's Notes 由 Yowko Tsai 製作,以創用CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款 釋出。