1. 程式人生 > 其它 >.Net Core 釘釘自定義機器人接入

.Net Core 釘釘自定義機器人接入

接入步驟

獲取自定義機器人Webhook

1.選擇需要新增機器人的群聊,然後依次單擊群設定 > 智慧群助手。

2.在機器人管理頁面選擇自定義機器人,輸入機器人名字並選擇要傳送訊息的群,同時可以為機器人設定機器人頭像。

3.完成必要的安全設定,勾選我已閱讀並同意《自定義機器人服務及免責條款》,然後單擊完成。這裡有三種加密方式,
常用的一般都是使用加密方式,其他兩種方式比較簡單,這裡不錯特殊介紹

3.完成安全設定後,複製出機器人的Webhook地址,可用於向這個群傳送訊息,格式如下
https://oapi.dingtalk.com/robot/send?access_token=XXXXXX

當前自定義機器人支援以下訊息型別,請根據自己的使用場景選擇合適的型別,詳情參見訊息型別及資料格式。

  • 文字 (text)
  • 連結 (link)
  • markdown(markdown)
  • ActionCard
  • FeedCard

程式碼

    [ApiController]
    [Route("[controller]/[Action]")]
    public class NoticeController : ControllerBase
    {
        private readonly IHttpClientFactory _httpClientFactory;

        public NoticeController(IHttpClientFactory httpClientFactory)
        {
            _httpClientFactory = httpClientFactory;
        }

        [ActionName("DingDing")]
        [HttpPost]
        public async Task<string> DingDing(DindDingInput input)
        {
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            var client = _httpClientFactory.CreateClient("dingding");

            if (input.AccessToken.Length == 0 || input.Secret.Length == 0)
            {
                return "非法請求";
            }

            // 時間戳精確到毫秒,這裡需要注意下
            var timestamp = ((DateTime.Now.Ticks - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)).Ticks) / 10000).ToString();

            var stringToSign = timestamp + "\n" + input.Secret;

            var sign = EncryptWithSHA256(stringToSign, input.Secret);

            // https://oapi.dingtalk.com/robot/send?access_token=XXXXXX&timestamp=XXX&sign=XXX
            var url = new Uri($"https://oapi.dingtalk.com/robot/send?access_token={input.AccessToken}&timestamp={timestamp}&sign={sign}");
            client.Timeout = new TimeSpan(0, 0, 10);

            var context = new DinDingMessageText()
            {
                Text = new Text() { Content = input.Text },
                AT = new MessageAT()
                {
                    AtMobiles = input.AtMobiles
                }
            };

            var response = await client.PostAsJsonAsync(url, context);
            var result = await response.Content.ReadAsStringAsync();
            Console.WriteLine(result);

            return result;
        }

        /// <summary>
        /// Base64 SHA256
        /// </summary>
        /// <param name="data">待加密資料</param>
        /// <param name="secret">金鑰</param>
        /// <returns></returns>
        public static string EncryptWithSHA256(string data, string secret)
        {
            secret = secret ?? "";

            // 1、string 轉換成 utf-8 的byte[]
            var encoding = Encoding.UTF8;
            byte[] keyByte = encoding.GetBytes(secret);
            byte[] dataBytes = encoding.GetBytes(data);

            // 2、 HMACSHA256加密
            using (var hmac256 = new HMACSHA256(keyByte))
            {
                byte[] hashData = hmac256.ComputeHash(dataBytes);
                // 3、轉換成base64
                var base64Str = Convert.ToBase64String(hashData);
                // 4、urlEncode編碼
                return System.Web.HttpUtility.UrlEncode(base64Str, Encoding.UTF8);
            }
        }
    }

參考文件