.NET 搭建简单的通知服务
搭建簡單的通知服務
Intro
很多情況下,我們都會遇到一些需要進行通知報警的場景,比如說服務器資源監控報警,搶到火車票后通知用戶進行付款。
原來主要是用的釘釘群里的機器人來做的通知,周末看到原來做 【Server 醬】的大佬寫了一個簡單的基于企業微信的微信推送,代碼是 PHP 的非常簡單,可以參考:https://github.com/easychen/wecomchan
于是就自己嘗試了一下寫了一個 C# 版的,這樣就可以直接推送到微信上,對于不怎么用釘釘的小伙伴來說就更為方便了。
有的時候我會幫朋友做一些小東西會需要做通知,比如上次給朋友監控自如上的一個房子,有一個房子待解凍,朋友想要租這個房子,想要在解凍的第一時間去簽約這個房子,于是就寫了一個簡單的定時去刷房子狀態的一個小程序,當房子狀態變化的時候就發一個通知給我朋友,這樣就可以即時租到自己心儀的房子了。
覺得通知功能還是挺實用的所以結合之前一直在用的釘釘推送和剛學到的微信推送,寫了一個小示例來分享一下我用來通知推送的代碼,詳細參考后面的內容
釘釘推送
有用過釘釘的小伙伴可能都知道,釘釘群可以添加機器人,通過調用機器人的 Web Hook 來發送通知,用起來非常的方便。
步驟一:獲取自定義機器人Webhook
打開機器人管理頁面。以PC端為例,打開PC端釘釘,點擊頭像,選擇機器人管理。
在機器人管理頁面選擇自定義機器人,輸入機器人名字并選擇要發送消息的群,同時可以為機器人設置機器人頭像。
完成必要的安全設置,勾選我已閱讀并同意《自定義機器人服務及免責條款》,然后單擊完成。
目前有3種安全設置方式,請根據需要選擇一種:
自定義關鍵詞:最多可以設置10個關鍵詞,消息中至少包含其中1個關鍵詞才可以發送成功。
例如添加了一個自定義關鍵詞:監控報警,則這個機器人所發送的消息,必須包含監控報警這個詞,才能發送成功。
加簽:
IP地址(段):設定后,只有來自IP地址范圍內的請求才會被正常處理。支持兩種設置方式:IP地址和IP地址段,暫不支持IPv6地址白名單,格式如下。
格式說明 1.1.1.1 開發者的出口公網IP地址(非局域網地址) 1.1.1.0/24 用CIDR表示的一個網段
把timestamp+"\n"+密鑰當做簽名字符串,使用HmacSHA256算法計算簽名,然后進行Base64 encode,最后再把簽名參數再進行urlEncode,得到最終的簽名(需要使用UTF-8字符集)。
| timestamp | 當前時間戳,單位是毫秒,與請求調用時間誤差不能超過1小時。 |
| secret | 密鑰,機器人安全設置頁面,加簽一欄下面顯示的SEC開頭的字符串。 |
把 timestamp和第一步得到的簽名值拼接到URL中。
https://oapi.dingtalk.com/robot/send?access_token=XXXXXX×tamp=XXX&sign=XXX| timestamp | 第一步使用到的時間戳。 |
| sign | 第一步得到的簽名值。 |
完成安全設置后,復制出機器人的 Webhook 地址,可用于向這個群發送消息,格式如下:
https://oapi.dingtalk.com/robot/send?access_token=XXXXXX?請保管好此Webhook 地址,不要公布在外部網站上,泄露后有安全風險
通常建議使用關鍵詞就可以了(之前的版本其實可以都不設置,后來的版本添加了限制,上面的幾種方式需要選一種,推薦使用關鍵詞方式,簡單暴力)
釘釘機器人推送代碼:
//?釘釘機器人推送用的?WebHook?地址 private?const?string?DingBotWebHookUrl?="https://oapi.dingtalk.com/robot/send?access_token=";public?static?async?Task?MainTest() {using?var?httpClient?=?new?HttpClient();using?var?response?=?await?httpClient.PostAsync(DingBotWebHookUrl,new?StringContent(new?{msgtype?=?"text",?text?=?new?{content?=?$"Test...?{DateTime.Now:yyyy-MM-dd?HH:mm:ss}"}}.ToJson(),?Encoding.UTF8,?"application/json"));var?result?=?await?response.Content.ReadAsStringAsync();Console.WriteLine($"發送釘釘消息通知,result:{result}"); }企業微信推送
這個是根據大佬的這個項目改的 https://github.com/easychen/wecomchan,原來項目的代碼是 PHP 的,我改成了 C# 的,有需要的可以參考一下,現在的代碼里比較簡單沒有對 access_token 做緩存,實際使用的時候建議進行緩存,token 快過期的時候再去申請新的 token。
使用企業微信推送需要先注冊一個企業微信號,不需要進行認證,用微信注冊就好了,注冊步驟引用大佬的介紹
第一步,注冊企業
用電腦打開企業微信官網,注冊一個企業
第二步,創建應用
注冊成功后,點「管理企業」進入管理界面,選擇「應用管理」 → 「自建」 → 「創建應用」
應用名稱填入「Server醬」,應用logo可以到這里下載,可見范圍選擇公司名。創建完成后進入應用詳情頁,可以得到應用ID( agentid )①,應用Secret( secret )②。
注意:secret推送到手機端時,只能在企業微信客戶端中查看。
第三步,獲取企業ID
進入「我的企業」頁面,拉到最下邊,可以看到企業ID③,復制并填到上方。
推送UID直接填 @all ,推送給公司全員。
第四步,推送消息到微信
進入「我的企業」 → 「微信插件」,拉到下邊掃描二維碼,關注以后即可收到推送的消息。
上面的應用 id 和 logo 可以自定義,不必和上面保持一致
釘釘的推送較為簡單,直接調用一次接口就可以了,微信的稍微麻煩一些,需要先獲取一下 access_token,然后再調用發消息的接口
推送示例代碼如下:
//?企業?id private?const?string?CorpId?=?"ww3508de6cad12eebd"; //?應用?id private?const?string?AppId?=?"1000003"; //?應用?secret private?const?string?AppSecret?=?""; //?要推送的用戶,"@all"?表示全員推送 private?const?string?ToUid?=?"@all";public?static?async?Task?MainTest() {var?getTokenUrl?=$"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={CorpId.UrlEncode()}&corpsecret={AppSecret.UrlEncode()}";using?var?httpClient?=?new?HttpClient();var?responseStr?=?await?httpClient.GetStringAsync(getTokenUrl);Console.WriteLine(responseStr);var?accessToken?=?JsonNode.Parse(responseStr)["access_token"].GetValue<string>();var?sendMessageUrl?=$"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={accessToken.UrlEncode()}";using?var?response?=?await?httpClient.PostAsJsonAsync(sendMessageUrl,new{touser?=?ToUid,msgtype?=?"text",agentid?=?AppId,text?=?new?{content?=?$"Test?{DateTime.Now:yyyy-MM-dd?HH:mm:ss}"}});responseStr?=?await?response.Content.ReadAsStringAsync();Console.WriteLine(responseStr); }推送示例輸出結果如下:
More
感覺還是釘釘的推送更簡單一些,直接調用一次就好了,access_token 是固定的
使用微信推送的時候最好考慮緩存 access_token ,不能頻繁調用 gettoken 接口,否則會受到頻率攔截
上面的示例代碼可以從 Github 獲取
References
https://github.com/WeihanLi/SamplesInPractice/tree/master/notificationSample
https://developers.dingtalk.com/document/app/custom-robot-access
https://github.com/easychen/wecomchan
https://work.weixin.qq.com/api/doc/90000/90003/90487
https://work.weixin.qq.com/api/doc/90000/90135/90236
總結
以上是生活随笔為你收集整理的.NET 搭建简单的通知服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么 HTTP3.0 使用 UDP 协
- 下一篇: .NET5 WPF进阶教程