using System; using System.Data; using System.Security.Cryptography; using System.Text; using WX.CRM.BLL.Base; using WX.CRM.DAL; namespace WX.CRM.CRMServices.WeiXin { public static class WWHHuserMonitor { private static BAS_PARAMETER_BL paramter_bl = new BAS_PARAMETER_BL(); private static MySqlDbHelper mySqlhelper = new MySqlDbHelper("MysqlQWConn"); public static void Monitor() {//6:30 -10 //dingtalk("企业号[ww796732d1128554fc],超30分钟没有聊天互动!"); var syskey = paramter_bl.GetModel_Patameter("WW_Hhuser_Monitor");//获取监听聊天记录 配置 var corpIds = paramter_bl.GetModel_Patameter("WW_Hhuser_Monitor_corpIds");//监听企业微信 string sql = $@"select corpId,max(lmsgtime) maxlmsgtime from ww_hhuser where corpId in ('" + string.Join("','", corpIds.PARAVALUE.Split(',')) + "') group by corpId";//查找最新时间数据 string msgStr = ""; var now = DateTime.Now; //9.00-12.00-30; 开始监听时间-结束监听时间-超时分钟 //13.00-18.00-30; //18.30-22.00-30 //周六日不判断 if (now.DayOfWeek == DayOfWeek.Sunday || now.DayOfWeek == DayOfWeek.Saturday) return; foreach (var str in syskey.PARAVALUE.Trim().Split(';')) { var valArry = str.Split('-'); var startHour = valArry[0];//监听开始小时 var endHour = valArry[1];//监听结束小时 var limitMon = Convert.ToInt32(valArry[2]);//监听判断离线分钟数 if (CreateTime(startHour) < now && now < CreateTime(endHour)) { DataSet table = mySqlhelper.ExecuteDataTable(sql);//查询数据 foreach (DataRow row in table.Tables[0].Rows) { var corpId = row["corpId"].ToString(); var maxlmsgtime = Convert.ToDateTime(row["maxlmsgtime"].ToString()); if ((now - maxlmsgtime).TotalMinutes > limitMon) { msgStr += "企业号[" + corpId + "],超" + limitMon + "分钟没有聊天互动!"; } } } } if (!string.IsNullOrEmpty(msgStr)) { //钉钉推送 var key = "WW_Hhuser_Monitor_Msg"; if (!Common.CacheHelper.Exists(key)) { //钉钉通知 dingtalk(msgStr); //缓存20分钟//缓存内容直接用key Common.CacheHelper.Set(key, key, DateTime.Now.AddMinutes(20)); } } } //钉钉通知 private static void dingtalk(string content) { string secret = "SEC492a12483adb64be903b54c716ce4e4be09ade0b79f061520a17f98952dc25f3";//机器人令牌 var timeStamp = getTimeStamp(); var sign = getSign(timeStamp, secret); var dingtalk = $"https://oapi.dingtalk.com/robot/send?access_token=9f414d80a708399e7350e59daecae9ffb92ec1d1788eac5414e43f9b2d753c27×tamp={timeStamp}&sign={sign}"; var postBody = "{\"at\": {\"atMobiles\":[\"15710171652\"],\"atUserIds\":[],\"isAtAll\": false},\"text\": { \"content\":\"" + content + "\"},\"msgtype\":\"text\"}"; var res = Common.Utility.PostAjaxData(dingtalk, postBody, Encoding.UTF8); } private static string getSign(string timeStamp, string secret) { string stringToSign = timeStamp + "\n" + secret; var encoding = new System.Text.ASCIIEncoding(); byte[] keyByte = encoding.GetBytes(secret); byte[] messageBytes = encoding.GetBytes(stringToSign); using (var hmacsha256 = new HMACSHA256(keyByte)) { byte[] hashmessage = hmacsha256.ComputeHash(messageBytes); return System.Web.HttpUtility.UrlEncode(Convert.ToBase64String(hashmessage), Encoding.UTF8); } } private static string getTimeStamp() { TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0); long shijianchuo = ((DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000); return shijianchuo.ToString(); } private static DateTime CreateTime(string str) { var now = DateTime.Now; if (str.IndexOf(".") > -1) { var H = Convert.ToInt32(str.Split('.')[0]); var m = Convert.ToInt32(str.Split('.')[1]); return new DateTime(now.Year, now.Month, now.Day, H, m, 0); } else { return new DateTime(now.Year, now.Month, now.Day, Convert.ToInt32(str), 0, 0); } } } }