From 52d0f7d9234058af19a013a35f0b8af3fe9fe1c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=88=E6=A3=AE=E5=90=B4?= <8402134@qq.com> Date: Mon, 24 Oct 2022 11:11:14 +0800 Subject: [PATCH] 111 --- FLSystem/Forms/main.cs | 203 ++++++-- 类库/Api.Framework/Api.Framework.csproj | 2 + 类库/Api.Framework/ApiClient.cs | 26 +- 类库/Api.Framework/Model/ModelExtend.cs | 35 +- 类库/Api.Framework/Model/fl_upload_record.cs | 31 ++ 类库/Api.Framework/Tools/UserRobotUpLoad.cs | 497 +++++++++++++++++++ 6 files changed, 758 insertions(+), 36 deletions(-) create mode 100644 类库/Api.Framework/Model/fl_upload_record.cs create mode 100644 类库/Api.Framework/Tools/UserRobotUpLoad.cs diff --git a/FLSystem/Forms/main.cs b/FLSystem/Forms/main.cs index 1f2d2e6..b2c32b7 100644 --- a/FLSystem/Forms/main.cs +++ b/FLSystem/Forms/main.cs @@ -35,6 +35,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; +using DevExpress.Data.Helpers; using Microsoft.Win32; using UI.Framework.Controls; using UI.Framework.Forms; @@ -394,7 +395,6 @@ namespace FLSystem.Forms timerLok.Interval = 5 * 60000;//测试1分钟锁屏 timerLok.Start(); - #region 激活抖音xxx //TODO 禁用抖音禁用 //if (StartDy == "1") @@ -574,7 +574,7 @@ namespace FLSystem.Forms System.Timers.Timer timer = new System.Timers.Timer(); timer.Elapsed += Timer_Elapsed; timer.Interval = 40 * 60 * 1000; - //timer.Interval = 1000; + //timer.Interval = 1000 * 10; timer.Start(); //下载黑名单 @@ -961,7 +961,27 @@ namespace FLSystem.Forms bool isinsert = user.id == 0 ? true : false; session.SaveOrUpdate(user); - if (isinsert) EventClient.OnEvent(this, MethodType.刷新机器人); + if (isinsert) + { + try + { + var result = UserRobotUpLoad.CustomerLink_UpLoadRobot(new List() + { + new UserRobotUpLoad.CustomerRobotInput() + { + HeadUrl = string.Empty, + NickName = user.nick, + Remark = user.remark, + RobotType = UserRobotUpLoad.ConvertRobotType(user.type), + UserName = user.name + } + }); + } + catch (Exception e) + { } + + EventClient.OnEvent(this, MethodType.刷新机器人); + } } } catch { } @@ -1098,7 +1118,26 @@ namespace FLSystem.Forms bool isinsert = user.id == 0 ? true : false; session.SaveOrUpdate(user); - if (isinsert) EventClient.OnEvent(this, MethodType.刷新机器人); + if (isinsert) + { + try + { + var result = UserRobotUpLoad.CustomerLink_UpLoadRobot(new List() + { + new UserRobotUpLoad.CustomerRobotInput() + { + HeadUrl = string.Empty, + NickName = user.nick, + Remark = user.remark, + RobotType = UserRobotUpLoad.ConvertRobotType(user.type), + UserName = user.name + } + }); + } + catch (Exception e) + { } + EventClient.OnEvent(this, MethodType.刷新机器人); + } } } catch { } @@ -2372,51 +2411,149 @@ namespace FLSystem.Forms isrun = true; try { - var h = DateTime.Now.Hour; if (!(1 <= h && h < 3)) - return; - try { - var robots = ChatClient.WXClient.Values.Where(f => f.Status == WxStatus.在线).ToList(); - foreach (var robot in robots) + var h = DateTime.Now.Hour; if (!(1 <= h && h < 3)) + return; + Console.WriteLine(); + //没赋值的头像赋值 + try { - try + var robots = ChatClient.WXClient.Values.Where(f => f.Status == WxStatus.在线).ToList(); + foreach (var robot in robots) { - var db = ApiClient.GetSession(); - var members = db.Find("select * from fl_member_info where robot_name = @robotname and headurl = @headurl", new { robotname = robot.WeixinHao, headurl = "" }); - - var friends = robot.Friends; - foreach (var member in members) + try { - if (friends != null && friends.ContainsKey(member.username)) + var db = ApiClient.GetSession(); + var members = db.Find("select * from fl_member_info where robot_name = @robotname and headurl = @headurl", new { robotname = robot.WeixinHao, headurl = "" }); + + var friends = robot.Friends; + foreach (var member in members) { - var headurl = friends[member.username].BigHeadImgUrl; - if (!string.IsNullOrWhiteSpace(headurl)) + if (friends != null && friends.ContainsKey(member.username)) { - member.headurl = friends[member.username].BigHeadImgUrl; - db.SaveOrUpdate(member); - } - } - else - { - var f = robot.GetContact(member.username); - if (f != null) - { - if (!string.IsNullOrWhiteSpace(f.BigHeadImgUrl)) + var headurl = friends[member.username].BigHeadImgUrl; + if (!string.IsNullOrWhiteSpace(headurl)) { - member.headurl = f.BigHeadImgUrl; + member.headurl = friends[member.username].BigHeadImgUrl; db.SaveOrUpdate(member); } } + else + { + var f = robot.GetContact(member.username); + if (f != null) + { + if (!string.IsNullOrWhiteSpace(f.BigHeadImgUrl)) + { + member.headurl = f.BigHeadImgUrl; + db.SaveOrUpdate(member); + } + } + } + + } + } + catch (Exception ex) + { } + } + } + catch (Exception exception) + { } + + //上传用户/机器人信息 + try + { + var db = ApiClient.GetSession(); + + var upload = db.FindSingle("select * from fl_upload_record"); + + if (upload == null) + { + upload = new fl_upload_record(); + var userNumber = db.Queryable().Count(); + upload.usernumber = userNumber; + db.Saveable(upload).ExecuteCommand(); + } + + if (!upload.usersuccess) + { + var pageSize = 100; + while (upload.userindex * pageSize < upload.usernumber) + { + var members = db.Queryable().OrderBy(f => f.id).ToPageList(upload.userindex, pageSize); + List list = new List(); + foreach (var item in members) + { + list.Add(new UserRobotUpLoad.CustomerLinkInput() + { + CreateTime = item.crt_time, + HeadUrl = item.headurl, + NickName = item.usernick, + Remark = item.remark, + RobotName = item.robot_name, + RobotType = UserRobotUpLoad.ConvertRobotType(item.robot_type), + UserName = item.username + }); } + if (list.Count > 0) + { + var result = UserRobotUpLoad.CustomerLink_UpLoadLink(list); + if (result.Ok) + { + db.Saveable(upload).ExecuteCommand(); + } + } + upload.userindex++; + Thread.Sleep(1000); + } + + if (upload.userindex * pageSize >= upload.usernumber) + { + upload.usersuccess = true; + db.Saveable(upload).ExecuteCommand(); } } - catch (Exception ex) - { } + + if (!upload.robotsuccess) + { + try + { + var robots = db.Find("select * from fl_robot_info"); + List list = new List(); + foreach (var item in robots) + { + list.Add(new UserRobotUpLoad.CustomerRobotInput() + { + HeadUrl = string.Empty, + NickName = item.nick, + Remark = item.remark, + RobotType = UserRobotUpLoad.ConvertRobotType(item.type), + UserName = item.name + }); + } + + if (list.Count > 0) + { + var result = UserRobotUpLoad.CustomerLink_UpLoadRobot(list); + if (result.Ok) + { + upload.robotsuccess = true; + } + } + } + catch (Exception ex) + { + upload.robotsuccess = false; + } + db.Saveable(upload).ExecuteCommand(); + } + } + catch (Exception ex) + { + } } - catch (Exception exception) - { } } catch (Exception ex) { } diff --git a/类库/Api.Framework/Api.Framework.csproj b/类库/Api.Framework/Api.Framework.csproj index b9000fa..58f156c 100644 --- a/类库/Api.Framework/Api.Framework.csproj +++ b/类库/Api.Framework/Api.Framework.csproj @@ -516,6 +516,7 @@ + @@ -581,6 +582,7 @@ + diff --git a/类库/Api.Framework/ApiClient.cs b/类库/Api.Framework/ApiClient.cs index 4b679af..7119c6f 100644 --- a/类库/Api.Framework/ApiClient.cs +++ b/类库/Api.Framework/ApiClient.cs @@ -964,7 +964,25 @@ namespace Api.Framework token = device, remark = "PCWechat HOOK" }; - s.Insertable(robot).ExecuteCommandIdentityIntoEntity(); + robot = s.Insertable(robot).ExecuteReturnEntity(); + + try + { + var result = UserRobotUpLoad.CustomerLink_UpLoadRobot(new List() + { + new UserRobotUpLoad.CustomerRobotInput() + { + HeadUrl = string.Empty, + NickName = robot.nick, + Remark = robot.remark, + RobotType = UserRobotUpLoad.ConvertRobotType(robot.type), + UserName = robot.name + } + }); + } + catch (Exception e) + { } + s.FindRobots(true); } else @@ -2406,6 +2424,12 @@ namespace Api.Framework session.AddIndex("username", "toolpid"); } + if (!session.TableExist()) + { + strb.AppendLine("fl_upload_record"); + session.CreateTable(); + } + if (!session.TableExist()) { strb.AppendLine("fl_bind_cache"); diff --git a/类库/Api.Framework/Model/ModelExtend.cs b/类库/Api.Framework/Model/ModelExtend.cs index 9a2ea05..d38fa2b 100644 --- a/类库/Api.Framework/Model/ModelExtend.cs +++ b/类库/Api.Framework/Model/ModelExtend.cs @@ -433,13 +433,44 @@ namespace Api.Framework.Model var m = session.FindSingle("select * from fl_member_info where robot_type = @robot_type and username = @username", new { username = e.Username, robot_type = e.ChatType }); if (m == null) { - m = new fl_member_info() { crt_time = DateTime.Now, usernick = e.NickName, realnick = e.RealNick, robot_name = e.RobotName, robot_type = e.ChatType, username = e.Username, upd_time = DateTime.Now, alipay_name = string.Empty, alipay_num = string.Empty, remark = string.Empty }; + m = new fl_member_info() + { + crt_time = DateTime.Now, + usernick = e.NickName, + realnick = e.RealNick, + robot_name = e.RobotName, + robot_type = e.ChatType, + username = e.Username, + upd_time = DateTime.Now, + alipay_name = string.Empty, + alipay_num = string.Empty, + remark = string.Empty + }; var groups = session.FindGroups(); if (groups.Count == 0) throw new Exception("会员组未设置,请先设置会员组!"); if (!string.IsNullOrEmpty(e.RealNick)) m.realnick = e.RealNick; if (!string.IsNullOrEmpty(e.Wechatid)) m.wechatid = e.Wechatid; m.group_id = groups[0].id; - session.Insertable(m).ExecuteReturnEntity(); + m = session.Insertable(m).ExecuteReturnEntity(); + + try + { + var result = UserRobotUpLoad.CustomerLink_UpLoadLink(new List() + { + new UserRobotUpLoad.CustomerLinkInput() + { + CreateTime = m.crt_time, + HeadUrl = m.headurl, + NickName = m.usernick, + Remark = m.remark, + RobotName = m.robot_name, + RobotType = UserRobotUpLoad.ConvertRobotType(m.robot_type), + UserName = m.username + } + }); + } + catch (Exception ex) + { } } else { diff --git a/类库/Api.Framework/Model/fl_upload_record.cs b/类库/Api.Framework/Model/fl_upload_record.cs new file mode 100644 index 0000000..b860e44 --- /dev/null +++ b/类库/Api.Framework/Model/fl_upload_record.cs @@ -0,0 +1,31 @@ +using Api.Framework.Tools; + +namespace Api.Framework.Model +{ + /// + /// 数据是否上报成功 + /// + public class fl_upload_record : base_model + { + /// + /// 用户当前的坐标 + /// + public int userindex { get; set; } + + /// + /// 用户数量 + /// + public int usernumber { get; set; } + + /// + /// 用户是否导入完成 + /// + public bool usersuccess { get; set; } = false; + + /// + /// 机器人是否完成 + /// + public bool robotsuccess { get; set; } = false; + + } +} \ No newline at end of file diff --git a/类库/Api.Framework/Tools/UserRobotUpLoad.cs b/类库/Api.Framework/Tools/UserRobotUpLoad.cs new file mode 100644 index 0000000..9af3bda --- /dev/null +++ b/类库/Api.Framework/Tools/UserRobotUpLoad.cs @@ -0,0 +1,497 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Net; +using System.Security.Cryptography; +using System.Text; +using Api.Framework.SDK; +using CsharpHttpHelper; + +namespace Api.Framework.Tools +{ + /// + /// 用户/机器人上传 + /// + public class UserRobotUpLoad + { + /// + /// host + /// + public static readonly string host = "http://yzinterface.api.52cmg.cn/api/"; + public static readonly int appkey = 334391396; + public static readonly string appsecret = "b924f8b944694cb8891bcfc7834dedb533436a3776de472cbde99577337902b2"; + public static readonly string appAes = "EDC19B73FEB447929E187243777477913977AB2694394E5B9BC56CD05302C46B"; + public static string UserToken { get; set; } + + /// + /// 上传客户信息 + /// + /// + /// + public static ServiceResult CustomerLink_UpLoadLink(List inputs) + { + if (inputs == null || inputs.Count <= 0) + { + return new ServiceResult() + { + Ok = true + }; + } + return HttpAes("CustomerLink/UpLoadLink", "post", inputs); + } + /// + /// 上传客户机器人信息 + /// + /// + /// + public static ServiceResult CustomerLink_UpLoadRobot(List inputs) + { + if (inputs == null || inputs.Count <= 0) + { + return new ServiceResult() + { + Ok = true + }; + } + return HttpAes("CustomerLink/UpLoadRobot", "post", inputs); + } + + /// + /// AES + /// + /// + /// + /// + /// + /// + private static ServiceResult HttpAes(string api, string method, object postdata = null) + { + try + { + var result = HttpResultAes(api, method, postdata); + if (result.StatusCode == HttpStatusCode.OK) + { + return Newtonsoft.Json.JsonConvert.DeserializeObject>(result.Html); + } + return new ServiceResult(default(T)) + { + Ok = false, + Message = result.Html, + }; + } + catch (Exception e) + { + return new ServiceResult(default(T)) + { + Ok = false, + Message = e.ToString(), + }; + } + } + + /// + /// aes + /// + /// + /// + /// + /// + private static ServiceResult HttpAes(string api, string method, object postdata = null) + { + try + { + var result = HttpResultAes(api, method, postdata); + if (result.StatusCode == HttpStatusCode.OK) + { + return Newtonsoft.Json.JsonConvert.DeserializeObject(result.Html); + } + return new ServiceResult() + { + Ok = false, + Data = result.Html, + }; + } + catch (Exception e) + { + return new ServiceResult() + { + Ok = false, + Data = e.ToString(), + }; + } + } + + /// + /// http aes + /// + /// + /// + /// + /// + private static HttpResult HttpResultAes(string api, string method, object postdata = null) + { + var data = Newtonsoft.Json.JsonConvert.SerializeObject(postdata); + var http = new HttpHelper(); + HttpItem item = new HttpItem() + { + URL = host + api, + Method = method, + Timeout = 100000, + ReadWriteTimeout = 30000, + IsToLower = false, + Cookie = "", + UserAgent = "Server", + Accept = "text/html, application/xhtml+xml, */*", + ContentType = "application/json", + Referer = "", + Allowautoredirect = false, + AutoRedirectCookie = false, + Postdata = data, + PostEncoding = Encoding.UTF8, + //WebProxy = new WebProxy("127.0.0.1:8888") + + }; + var timespan = GetTimespan(DateTime.Now);/*DateTimeHelper.DateTimeToTimeStamp(DateTime.Now)*/; + item.Postdata = SecurityHelper.AesEncrypt(item.Postdata, appAes); + var sign = MD5ToString(Encrypt(item.Postdata + appkey + timespan, appsecret, false)); + item.Header.Add("sign", sign); + item.Header.Add("timestamp", timespan + ""); + item.Header.Add("appkey", appkey + ""); + item.Header.Add("UserToken", UserToken); + var result = http.GetHtml(item); + return result; + } + + /// + /// AES加密 + /// + /// 明文 + /// 密钥 + /// 是否转为base64(否的情况将采用16进制字符串) + /// + public static string Encrypt(string encryptStr, string key, bool isBase64 = true, bool is32 = true) + { + byte[] keyArray = Encoding.UTF8.GetBytes(key.Substring(0, is32 ? 32 : 16)); + byte[] toEncryptArray = Encoding.UTF8.GetBytes(encryptStr); + RijndaelManaged rDel = new RijndaelManaged(); + rDel.Key = keyArray; + rDel.Mode = CipherMode.ECB; + rDel.Padding = PaddingMode.PKCS7; + ICryptoTransform cTransform = rDel.CreateEncryptor(); + byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); + return isBase64 + ? Convert.ToBase64String(resultArray, 0, resultArray.Length) + : ByteArrayToHexString(resultArray); + } + + /// + /// 将一个byte数组转换成16进制字符串 + /// + /// + /// + private static string ByteArrayToHexString(byte[] data) + { + StringBuilder sb = new StringBuilder(data.Length * 3); + foreach (byte b in data) + { + sb.Append(Convert.ToString(b, 16).PadLeft(2, '0')); + } + return sb.ToString().ToUpper(); + } + + public static string MD5ToString(string text) + { + var retVal = new MD5CryptoServiceProvider().ComputeHash(Encoding.Default.GetBytes(text)); + return string.Join("", retVal.Select(s => s.ToString("x2"))); + } + + /// + /// 时间戳(秒) + /// + /// + /// + public static Int64 GetTimespan(DateTime dateTime) + { + TimeSpan ts = dateTime - new DateTime(1970, 1, 1, 0, 0, 0, 0); + return Convert.ToInt64(ts.TotalSeconds); + } + + /// + /// 加密解密帮助类 + /// + public class SecurityHelper + { + #region AES加密解密 + /// + /// 128位处理key + /// + /// 原字节 + /// 处理key + /// + private static byte[] GetAesKey(byte[] keyArray, string key) + { + byte[] newArray = new byte[16]; + if (keyArray.Length < 16) + { + for (int i = 0; i < newArray.Length; i++) + { + if (i >= keyArray.Length) + { + newArray[i] = 0; + } + else + { + newArray[i] = keyArray[i]; + } + } + } + return newArray; + } + /// + /// 使用AES加密字符串,按128位处理key + /// + /// 加密内容 + /// 秘钥,需要128位、256位..... + /// 秘钥,需要128位、256位..... + /// Base64字符串结果 + public static string AesEncrypt(string content, string key, bool autoHandle = true) + { + try + { + byte[] keyArray = Encoding.UTF8.GetBytes(key); + if (autoHandle) + { + keyArray = GetAesKey(keyArray, key); + } + byte[] toEncryptArray = Encoding.UTF8.GetBytes(content); + + SymmetricAlgorithm des = Aes.Create(); + des.Key = keyArray; + des.Mode = CipherMode.ECB; + des.Padding = PaddingMode.PKCS7; + ICryptoTransform cTransform = des.CreateEncryptor(); + byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); + return Convert.ToBase64String(resultArray); + } + catch + { + return ""; + } + + } + /// + /// 使用AES解密字符串,按128位处理key + /// + /// 内容 + /// 秘钥,需要128位、256位..... + /// 秘钥,需要128位、256位..... + /// UTF8解密结果 + public static string AesDecrypt(string content, string key, bool autoHandle = true) + { + try + { + byte[] keyArray = Encoding.UTF8.GetBytes(key); + if (autoHandle) + { + keyArray = GetAesKey(keyArray, key); + } + byte[] toEncryptArray = Convert.FromBase64String(content); + + SymmetricAlgorithm des = Aes.Create(); + des.Key = keyArray; + des.Mode = CipherMode.ECB; + des.Padding = PaddingMode.PKCS7; + + ICryptoTransform cTransform = des.CreateDecryptor(); + byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); + + return Encoding.UTF8.GetString(resultArray); + } + catch + { + return ""; + } + } + /// + /// 使用AES解密字符串,按128位处理key + /// + /// 内容 + /// 秘钥,需要128位、256位..... + /// 秘钥,需要128位、256位..... + /// UTF8解密结果 + public static byte[] AesDecryptByte(string content, string key, bool autoHandle = true) + { + try + { + byte[] keyArray = Encoding.UTF8.GetBytes(key); + if (autoHandle) + { + keyArray = GetAesKey(keyArray, key); + } + byte[] toEncryptArray = Convert.FromBase64String(content); + + SymmetricAlgorithm des = Aes.Create(); + des.Key = keyArray; + des.Mode = CipherMode.ECB; + des.Padding = PaddingMode.PKCS7; + + ICryptoTransform cTransform = des.CreateDecryptor(); + byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); + + return resultArray; + } + catch + { + return null; + } + } + #endregion + } + + /// + /// 上传机器人客户信息 + /// + public class CustomerLinkInput + { + /// + /// 用户名 + /// + [Required] + [DisplayName("用户名")] + public string UserName { get; set; } + /// + /// 机器人类型0个人微信 1企业微信 2QQ + /// + [Required] + [DisplayName("机器人类型0个人微信 1企业微信 2QQ")] + public int RobotType { get; set; } + /// + /// 头像地址 + /// + public string HeadUrl { get; set; } + /// + /// 昵称 + /// + public string NickName { get; set; } + /// + /// 备注 + /// + public string Remark { get; set; } + /// + /// 机器人账号 + /// + [Required] + [DisplayName("机器人账号")] + public string RobotName { get; set; } + /// + /// 添加时间 + /// + [Required] + public DateTime CreateTime { get; set; } + } + + /// + /// 转换机器人类型 + /// + /// + /// + public static int ConvertRobotType(ChatType chatType) + { + /* + 未知来源 = 0, + QQ = 1, + 微信 = 2, + 微信公众号 = 3, + 企业微信 = 4 + */ + + switch (chatType) + { + case ChatType.QQ: + return 2; + case ChatType.企业微信: + return 1; + case ChatType.微信: + return 0; + case ChatType.微信公众号: + return -1; + case ChatType.未知来源: + return -1; + } + return -1; + } + + /// + /// 上传机器人信息 + /// + public class CustomerRobotInput + { + /// + /// 用户名 + /// + [Required] + [DisplayName("用户名")] + public string UserName { get; set; } + /// + /// 机器人类型0个人微信 1企业微信 2QQ + /// + [Required] + [DisplayName("机器人类型0个人微信 1企业微信 2QQ")] + public int RobotType { get; set; } + /// + /// 头像地址 + /// + public string HeadUrl { get; set; } + /// + /// 昵称 + /// + public string NickName { get; set; } + /// + /// 备注 + /// + public string Remark { get; set; } + } + + + /// + /// 统一服务返回结果 + /// + public class ServiceResult + { + /// + /// 请求是否成功 + /// + public bool Ok { get; set; } + /// + /// 数据 + /// + public object Data { get; set; } + /// + /// 错误信息 + /// + public string Message { get; set; } + } + /// + /// 统一返回结果 + /// + /// + public class ServiceResult : ServiceResult + { + /// + /// 初始化 + /// + /// + public ServiceResult(T data) + { + this.Data = data; + } + /// + /// 返回数据 + /// + public new T Data { get; set; } + + } + } +} \ No newline at end of file