集团是使用钉钉进行工作交流的, 发现群里有很多问题其实是重复的,就在想是不是可以使用钉钉的群机器人,虽然说的确是可以部分实现,但是感觉还是差点什么,而且公司内部很多东西也不方便放上去,所以就想开发一个群机器人,然后就看钉钉开发文档,发现是有这个功能的,就开始研究,官方文档使用的语言主要是Java,并没有c#或者asp.net的相关文档,这就意味着要从头开始开发, 所幸的是他是有c#的SDK开发包,开发包里是有DLL的,这样能省下不少事,废话不多说,上链接
https://open.dingtalk.com/document/resourcedownload/download-server-sdk
打开页面后往下拉,知道如图所示处
我下载的是.net版本,下载下来后,导入到项目中即可
然后是配置机器人,这些在往上教程很多就不多赘诉了,直接上图
一开始我是在页面上面写的,看到官方文档上面说到了header,考虑到可能要使用到request 获取,就直接在页面写了,
后来在页面上通过以后改到了WebService中,毕竟感觉上webservice 会好一些,
把消息接收地址改成了这样,其实两者代码类似,只是我可能更喜欢在接口里写
1 protected string secret = 改成你自己的机器人的appSecret; 2 #region 机器人操作类 3 [WebMethod] 4 public void Reboot() 5 { 6 string result = ""; 7 using (StreamReader reader = new StreamReader(HttpContext.Current.Request.InputStream, Encoding.UTF8)) 8 { 9 result = reader.ReadToEnd(); 10 } 11 try 12 { 13 string sign = HttpContext.Current.Request.Headers.GetValues("sign")[0].ToString(); 14 string timestamp = HttpContext.Current.Request.Headers.GetValues("timestamp")[0].ToString(); 15 string json = result; 16 CommonJsonModel model = SymmetricMethod.DeSerialize(json); 17 string text = model.GetModel("text").GetValue("content"); 18 string sessionWebhook = model.GetValue("sessionWebhook"); 19 string senderStaffId = model.GetValue("senderStaffId"); 20 DBHelper.InsertRebootLog(HttpContext.Current.Request, HttpContext.Current.Request.Url.ToString(), "调用机器人", text + "--" + sessionWebhook + "--" + senderStaffId, sign + "----------" + timestamp, result, HttpContext.Current.Request.Headers, "调用机器人"); 21 } 22 catch (Exception ex) 23 { 24 DBHelper.InsertRebootLog(HttpContext.Current.Request, HttpContext.Current.Request.Url.ToString(), "调用机器人", result, ex.Message, "接口调用来源不正确","", "调用机器人"); 25 } 26 } 27 #endregion
这是webservice 接口的
1 string result = ""; 2 using (StreamReader reader = new StreamReader(Request.InputStream, Encoding.UTF8)) 3 { 4 result = reader.ReadToEnd(); 5 } 6 try 7 { 8 string sign = Request.Headers.GetValues("sign")[0].ToString(); 9 string timestamp = Request.Headers.GetValues("timestamp")[0].ToString(); 10 string json = result; 11 CommonJsonModel model = SymmetricMethod.DeSerialize(json); 12 string text = model.GetModel("text").GetValue("content"); 13 string sessionWebhook = model.GetValue("sessionWebhook"); 14 string senderStaffId = model.GetValue("senderStaffId"); 15 DBHelper.InsertRebootLog(Request, Request.Url.ToString(), "调用机器人", text + "--" + sessionWebhook + "--" + senderStaffId, sign + "----------" + timestamp, result, Request.Headers, "调用机器人"); 16 } 17 catch (Exception ex) 18 { 19 DBHelper.InsertRebootLog(Request, Request.Url.ToString(), "调用机器人", result, ex.Message, "", "", "调用机器人"); 20 }
这是写在页面Page_Load方法里面的,因为只要执行到这个页面,就是直接执行,没有任何其他操作,所以一定要写在Page_Load方法里
那么json 解析的源码我也放后面,也就是 CommonJsonModel 这个方法的代码
直接建两个类,名字分别是CommonJsonModelAnalyzer 和 CommonJsonModel
1 using System; 2 using System.Collections.Generic; 3 using System.Web; 4 using System.Text; 5 6 /// <summary> 7 ///CommonJsonModelAnalyzer 的摘要说明 8 /// </summary> 9 public class CommonJsonModelAnalyzer 10 { 11 public CommonJsonModelAnalyzer() 12 { 13 // 14 //TODO: 在此处添加构造函数逻辑 15 // 16 17 } 18 protected string _GetKey(string rawjson) 19 { 20 if (string.IsNullOrEmpty(rawjson)) 21 return rawjson; 22 23 rawjson = rawjson.Trim(); 24 25 string[] jsons = rawjson.Split(new char[] { ':' }); 26 27 if (jsons.Length < 2) 28 return rawjson; 29 30 return jsons[0].Replace