using CsharpHttpHelper; using Newtonsoft.Json; using NM_WeChat; using PCRobot.Entitys; using PCRobot.Pack; using PCRobot.Properties; using PCRobot.Utils; using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using System.Web; using System.Web.Caching; using System.Windows.Forms; namespace PCRobot.PCWechat { /* 接口文档:https://www.showdoc.cc/WxWorkNewHook?page_id=3846144660177490 /////密码:784615627. */ public class Wechat_Xiaoxie_QY : BaseApi { #region 注入等操作 public delegate void AcceptCallbackFunc(uint dwClientId); public delegate void RecvCallbackFunc(uint dwClientId, IntPtr intPtr, uint dwSize); public delegate void CloseCallbackFunc(uint dwClientId); private static AcceptCallbackFunc m_AcceptCallbackFunc; private static RecvCallbackFunc m_RecvCallbackFunc; private static CloseCallbackFunc m_CloseCallbackFunc; // 引入DLL导出函数 //[DllImport("Bin\\WeChatServer_QY.dll")] [DllImport("Bin\\WxWorkLoader.dll")] public static extern bool InitWxWorkSocket(AcceptCallbackFunc acceptCallback, RecvCallbackFunc recvCallback, CloseCallbackFunc closeCallback); [DllImport("Bin\\WxWorkLoader.dll")] public static extern uint InjectWxWork(byte[] strDllPath, byte[] strWxWorkExePath); [DllImport("Bin\\WxWorkLoader.dll")] public static extern uint InjectWxWorkMultiOpen(byte[] strDllPath, byte[] strWxWorkExePath); [DllImport("Bin\\WxWorkLoader.dll")] public static extern bool SendWxWorkData(uint dwClienId, byte[] strJsonData); [DllImport("Bin\\WxWorkLoader.dll")] public static extern bool DestroyWxWork(); [DllImport("Bin\\WxWorkLoader.dll")] public static extern uint InjectWxWorkPid(int dwPid, byte[] strDllPath); [DllImport("Bin\\WxWorkLoader.dll")] public static extern bool UseUtf8(); [DllImport("Bin\\WxWorkLoader.dll")] public static extern bool GetUserWxWorkVersion(StringBuilder v); [DllImport("Bin\\WxWorkLoader.dll", EntryPoint = "SendWxWorkData")] public static extern bool _SendWxWorkData(uint dwClienId, byte[] strJsonData); public bool SendWxWorkData(uint dwClienId, string strJsonData) { var ss = User.DwClientId; if (WechatClient.IsDebug) LogHelper.GetSingleObj().Debug("_调试发送_", $"{dwClienId} -> {strJsonData} - {User != null} - 微信id:{User?.Wxid}"); if (User != null && !string.IsNullOrEmpty(User.Wxid)) { var json = HttpExtend.JsonToDictionary(strJsonData); var type = json["type"].ToString(); MsgType msgType; if (!Enum.TryParse(type, out msgType)) { if (WechatClient.IsDebug) LogHelper.GetSingleObj().Debug("调试发送@转换失败", $"{dwClienId} -> type:{type}"); return false; } switch (msgType) { //截取发送消息 - 为是否是辅助输入提供判断 case MsgType.MT_SEND_TEXT_MSG:// 发送文本消息 case MsgType.MT_SEND_IMAGE_MSG:// 发送图片消息 case MsgType.MT_SEND_FILE_MSG:// 发送文件消息 case MsgType.MT_SEND_FOLDER_MSG:// 发送目录消息 case MsgType.MT_SEND_LINK_MSG:// 发送链接消息 //case MsgType.MT_SEND_PERSON_CARD_MSG:// 发送个人名片 case MsgType.MT_SEND_VIDEO_MSG:// 发送视频 { json = json["data"] as Dictionary; string conversation_id = json["conversation_id"].ToString(); var to_wxid = conversation_id; if (conversation_id.StartsWith("S:"))//私人消息处理一下,群消息不用管 { to_wxid = conversation_id.Replace($"S:{User.Wxid}_", ""); } string message = string.Empty; if (json.ContainsKey("content")) message = json["content"].ToString(); else if (json.ContainsKey("card_wxid")) message = json["card_wxid"].ToString(); else if (json.ContainsKey("file")) message = json["file"].ToString(); //else if (json.ContainsKey("user_id")) message = json["user_id"].ToString(); if (!string.IsNullOrEmpty(message)) { Common.SetCache(User.Wxid, to_wxid, message); } } break; } } return _SendWxWorkData(dwClienId, Encoding.UTF8.GetBytes(strJsonData)); } static string DllPath = HttpExtend.MapFile($"WxWorkHelper_{Version}.dll", "Bin"); //private const string Version = "3.0.27.2701"; //private const string PcMd5 = "DE820FFBA84BC8E4C89A9C4857420BB7";//3.0.27.2701 //private const string Version = "3.1.1.3001"; //private const string PcMd5 = "7EBF31BC0617397614E72907260B2A15";//3.1.1.3001 private const string Version = "3.1.10.3010"; private const string PcMd5 = "5E7DF89ECC5FC04F1ECB96C1EE72F17E";//3.1.10.3010 public override string GetVersion() { return Version; } public Wechat_Xiaoxie_QY(WechatUser User) : base(User) { } public static void Install() { if (IsQYInstall) return; try { m_AcceptCallbackFunc = WxAcceptCallback; m_RecvCallbackFunc = WxRecvCallback; m_CloseCallbackFunc = WxCloseCallback; UseUtf8(); // 初始化Callback InitWxWorkSocket(m_AcceptCallbackFunc, m_RecvCallbackFunc, m_CloseCallbackFunc); StringBuilder sb = new StringBuilder(); var path1 = HttpExtend.MapPath("WXWork"); var path2 = HttpExtend.MapPath("WXWork\\" + Version); InitPc(); } catch (Exception) { } finally { IsQYInstall = true; } } /// /// 是否替换 /// private static bool IsReplace = false; /// /// pj文件需要杀死进程,并替换文件 /// public static void PJFileReplace() { if (IsReplace) return; IsReplace = true; try { KillPc(); var path2 = HttpExtend.MapPath("WXWork\\" + Version); var fixName = HttpExtend.MapFile("Fix2.dll", path2); var msimgName = HttpExtend.MapFile("msimg32.dll", path2); //if (!Environment.Is64BitOperatingSystem) //{ // #region 32位系统 // //Util.WriteResource(fixName, Resources.Fix2_QY_32); // //Util.WriteResource(msimgName, Resources.msimg32_QY_32); // #endregion //} //else //{ // #region 64位系统 // Util.WriteResource(fixName, Resources.Fix2_QY); // Util.WriteResource(msimgName, Resources.msimg32_QY); // #endregion //} //Util.WriteResource(fixName, Resources.Fix2_QY); //Util.WriteResource(msimgName, Resources.msimg32_QY); } catch (Exception ex) { throw ex; } } /// /// 杀死注入 pc /// /// private static void KillPc(bool isInject = false) { Process[] MyProcesses = Process.GetProcesses(); var path1 = HttpExtend.MapPath("WXWork"); var path2 = HttpExtend.MapPath("WXWork\\" + Version); foreach (Process MyProcess in MyProcesses) { try { var name = MyProcess.ProcessName.ToUpper(); if (name == "WXWORK" && MyProcess.MainModule.FileName.StartsWith(path1)) { try { //判断微信版本 if (MyProcess.MainModule.FileName.StartsWith(path2)) { var id = MyProcess.Id; if (isInject) { var result = Task.Factory.StartNew(delegate { try { var WechatWinFile = CsharpHttpHelper.HttpExtend.MapFile("WXWork.exe", $"WXWork\\{Version}"); var md5 = Common.GetMD5Hash(WechatWinFile).ToUpper(); if (!File.Exists(WechatWinFile) || md5 != PcMd5.ToUpper()) { return false; } else { LogHelper.GetSingleObj().Info("系统", $"开始企业注入进程:{id}..."); var uin = InjectWxWorkPid(id, Encoding.UTF8.GetBytes(DllPath)); LogHelper.GetSingleObj().Info("系统", $"注入企业成功:{id},句柄ID:{uin}"); return true; } } catch (Exception) { } return false; }).Wait(20000); if (!result) { try { LogHelper.GetSingleObj().Info("系统cc", "杀死企业进程:" + MyProcess.Id); MyProcess.Kill(); } catch (Exception) { } } } else { try { LogHelper.GetSingleObj().Info("主动dd", "杀死进程:" + MyProcess.Id); MyProcess.Kill(); } catch (Exception) { } } } } catch (Exception) { } } } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } } private static void InitPc() { if (Util.IsLinshi()) PJFileReplace(); else { IsReplace = false; var isZanYong = DeletePJFile(); KillPc(!isZanYong); if (isZanYong) { isZanYong = DeletePJFile(); if (isZanYong) throw new Exception("文件处理异常,,"); } } } /// /// 破解文件是否暂用 /// /// private static bool DeletePJFile() { var isZanYong = false; var path2 = HttpExtend.MapPath("WXWork\\" + Version); var fixName = HttpExtend.MapFile("Fix2.dll", path2); var msimgName = HttpExtend.MapFile("msimg32.dll", path2); try { if (File.Exists(fixName)) File.Delete(fixName); if (File.Exists(msimgName)) File.Delete(msimgName); } catch (Exception ex) { isZanYong = true; } return isZanYong; } private static string RemoteCache = "get_login_code_cache_workwechat"; /// /// 等待登录结果 /// public static Dictionary WaitLoginResult = new Dictionary(); /// /// 远程登录微信 /// public static List RemoteLoginCodes = new List(); /// /// pc微信登录二维码 /// /// public static void LoginQrcode(string ServerMsgID) { try { RemoteLoginCode result = null; try { string downloadsPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); var wxConfig = HttpExtend.MapFile(@"Config.cfg", downloadsPath + @"\WXWork\Global"); if (File.Exists(wxConfig)) { try { File.Delete(wxConfig); } catch (Exception) { } StartWechat(true); } } catch (Exception ex) { result = new RemoteLoginCode() { pid = -1, rType = RobotType.客户端企业微信, b64Md5 = ex.Message }; } if (result == null) { result = Task.Factory.StartNew(delegate () { var awaitTime = DateTime.Now.AddSeconds(10); do { Thread.Sleep(200); Cache cache = HttpRuntime.Cache; object item = cache[RemoteCache]; if (item != null) { cache.Remove(RemoteCache); var r = item as RemoteLoginCode; return r; } } while (awaitTime >= DateTime.Now); return null; }).Result; } var socketClient = EasySoc.GetSocket(); var msg = new CommonResult(); msg.RobotUsername = string.Empty; msg.RobotUsernick = string.Empty; msg.RobotType = RobotType.客户端企业微信; msg.MsgId = ServerMsgID; msg.Cmd = PCRobotCMD.rcvLoginCode_workWeChat; msg.Data = result == null ? string.Empty : JsonConvert.SerializeObject(result); socketClient.Send(msg); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } /// /// 卸载安装 /// public static void UnInstall() { try { //DestroyWxWork(); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new StackTrace().GetFrame(0).GetMethod().Name, ex.Message + ".."); } } #endregion private static Dictionary MT_APP_READY_MSG_BIND = new Dictionary(); private static readonly object Friend_Lock = new object(); // 接收消息回调 private static void WxRecvCallback(uint _dwClient, IntPtr intPtr, uint dwSize) { try { byte[] body = new byte[dwSize]; Marshal.Copy(intPtr, body, 0, body.Length); var recvData = Encoding.UTF8.GetString(body).Replace("\0", "").Trim();//再转成UTF8 var dwClientid = _dwClient; if (WechatClient.IsDebug) LogHelper.GetSingleObj().Debug("调试企业收到文本消息", $"{dwClientid} -> {recvData}\r\n"); //var method = new Action(delegate () Task.Factory.StartNew(delegate () { try { Console.WriteLine("企业收到消息:" + recvData); var json = CsharpHttpHelper.HttpExtend.JsonToDictionary(recvData); var type = json["type"].ToString(); var data = json.ContainsKey("data") ? json["data"] as Dictionary : null; MsgType msgType; if (!Enum.TryParse(type, out msgType)) return; Console.WriteLine($"dwClientid = {dwClientid}"); switch (msgType) { case MsgType.MT_APP_READY_MSG: MT_APP_READY_MSG_BIND[dwClientid] = int.Parse(data["pid"].ToString()); break; case MsgType.MT_PARAMS_ERROR_MSG: { } break; case MsgType.MT_USER_LOGIN://登陆消息 { var wxid = data["user_id"].ToString(); var user = WechatClient.GetUser(wxid, dwClientid, WechatType.Xiaoxie_QY); user.Nickname = data["username"].ToString(); user.HeaderUrl = data["avatar"].ToString(); //user.DBFile = data["wx_user_dir"].ToString(); user.Pid = MT_APP_READY_MSG_BIND.ContainsKey(dwClientid) ? MT_APP_READY_MSG_BIND[dwClientid] : 0; //uint.Parse(data["pid"].ToString()); user.Phone = data["mobile"].ToString(); user.Uin = wxid; WechatClient.OnRefUserEvent(user, WaitLoginResult); } break; case MsgType.MT_USER_LOGOUT: { var wxid = data["user_id"].ToString(); var user = WechatClient.Users.FirstOrDefault(f => f.Key == wxid).Value; if (user != null) { LogHelper.GetSingleObj().Info("系统", $"LogOut_QY事件退出,Uin:{user.Uin},微信:{user.Nickname}({wxid})"); WechatClient.RemoveUser(user); } } break; case MsgType.MT_LOGIN_QRCODE_MSG: { //{"data":{"file":"C:\\Users\\秒单客006\\Documents\\WXWork\\Global\\Image\\089d9de9-cc40-458a-af4a-b39a04e2f95f.jpg"},"type":11028} if (!data.ContainsKey("file")) return; if (MT_APP_READY_MSG_BIND.ContainsKey(dwClientid)) { var file = data["file"].ToString(); if (File.Exists(file)) { var cfBase64 = Common.ConvertImageToBase64(Image.FromFile(file)); var codeInfo = new RemoteLoginCode() { pid = MT_APP_READY_MSG_BIND[dwClientid], cImgB64 = cfBase64, b64Md5 = HttpHelper.ToMD5(cfBase64), rType = RobotType.客户端企业微信, t = HttpExtend.GetTimeStamp(DateTime.Now) }; Cache cache = HttpRuntime.Cache; //查找 md5 的缓存,不存在则返回null object item = cache[RemoteCache]; cache.Insert(RemoteCache, codeInfo, null, DateTime.Now.AddSeconds(3), Cache.NoSlidingExpiration); RemoteLoginCodes.Add(codeInfo); } } } break; case MsgType.MT_RECV_MINIAPP_MSG://收到小程序 { //个人微信/企业微信 //{"data":{"content_type":78,"conversation_id":"R:10696053211018728","enterpoint":"pages/tab/home/index.html?_um_ssrc=oucfI5QRI-8SbyOTKSGYt5-ia0dk&_um_sts=1610033684099","ghid":"gh_a0d7a7672cf7@app","headimg":"http://wx.qlogo.cn/mmhead/Q3auHgzwzM43LsxpXHKd7ua7kwMZQ8WHmZlkYTzr3Tdm8sMOJ7Ypog/96","image_key1":"306b020102046430620201000204bafc490e02030f4df9020473e6607102045ff72a530436333133373039353935305f313734393433343231315f3262393764653133616335373232353633383831336564376334396563616164020100020300ab1004000201010201000400","image_key2":"61747072666A766977766D69726D6168","image_key3":"2b97de13ac57225638813ed7c49ecaad","image_size":43791,"is_pc":0,"local_id":"155","name":"啄木鸟家庭维修","receiver":"1688853956558440","send_time":"1610033747","sender":"7881302484994318","sender_name":"、","server_id":"1042188","title":"直营一口价,维修无猫腻","wxid":"wx3d6b1af0cb07fa5a"},"type":11066} if (data == null) return; var socketClient = EasySoc.GetSocket(); //var content_type = data["content_type"]?.ToString();//内容类型 78 //var conversation_id = data["conversation_id"]?.ToString();//接收者的的会话ID //var enterpoint = data["enterpoint"]?.ToString();//入口点 - 链接(小程序里面的链接) //var receiver = data["receiver"]?.ToString();// 接收者的user_id //var sender = data["sender"]?.ToString();// 发送者的user_id //var sender_name = data["sender_name"]?.ToString();//发送者昵称 //var server_id = data["server_id"]?.ToString();//消息的服务器ID var content_type = data["content_type"]?.ToString();//内容类型 78 var conversation_id = data["conversation_id"]?.ToString();//接收者的的会话ID var enterpoint = data["enterpoint"]?.ToString();//入口点 - 链接(小程序里面的链接) var headimg = data["headimg"]?.ToString();//小程序的头像 var name = data["name"]?.ToString();//小程序的名称 var receiver = data["receiver"]?.ToString();// 接收者的user_id var sender = data["sender"]?.ToString();// 发送者的user_id var sender_name = data["sender_name"]?.ToString();//发送者昵称 var title = data["title"]?.ToString();//小程序标题 var wxid = data["wxid"]?.ToString(); var server_id = data["server_id"]?.ToString();//消息的服务器ID var isSend = false; var RobotUsername = string.Empty; var RobotUsernick = string.Empty; var FromUsername = string.Empty; var FromUsernick = string.Empty; //if (content_type != "78")//0自己发送的消息 //{ // if (!WechatClient.IsAuxiliaryInput(sender, receiver, enterpoint)) // { // Console.WriteLine("此消息被过滤,因为是机器人自己发送的:" + enterpoint); // return; // } // var ass = WechatClient.IsAssistance(sender, receiver, dwClientid, WechatType.Xiaoxie_QY); // if (ass.type == WechatClient.AssistanceType.终止) return; // isSend = ass.type == WechatClient.AssistanceType.辅助; // RobotUsername = ass.robotName; // RobotUsernick = ass.robotNick; // FromUsername = ass.fromName; // FromUsernick = ass.fromNick; //} //else //{ var user = WechatClient.GetUser(dwClientid, WechatType.Xiaoxie_QY); if (user == null) return; RobotUsername = user.Wxid; RobotUsernick = user.Nickname; FromUsername = sender; FromUsernick = sender_name; //} var wmsg = new WorkWechatReceiveMsg(); wmsg.Cmd = PCRobotCMD.rcvTxt_workWeChat; wmsg.IsSend = isSend; wmsg.RobotUsername = RobotUsername; wmsg.RobotUsernick = RobotUsernick; wmsg.RobotType = RobotType.客户端企业微信; wmsg.FromMessageType = WechatMsgType.文本; if (conversation_id.Contains("R:")) { wmsg.FromGroupid = conversation_id; wmsg.FromUsername = sender; wmsg.FromUsernick = sender_name; } else { wmsg.FromUsername = FromUsername; wmsg.FromUsernick = FromUsernick; } wmsg.FromMessage = enterpoint.Replace("pages/index/index.html?goods_id=", "https://mobile.yangkeduo.com/goods.html?goods_id=").Replace("pages/item/detail/detail.html?sku=", @"https://item.jd.com/"); socketClient.Send(wmsg); } break; case MsgType.MT_RECV_TEXT_MSG://收到文本 { if (data == null) return; var socketClient = EasySoc.GetSocket(); var content_type = data["content_type"]?.ToString(); //企业微信消息类型 #region 文本消息 #region 消息样式 //{"data":{"content":"我17","content_type":2,"conversation_id":"S:1688853956558440_7881301610989604","local_id":"19","receiver":"1688853956558440","send_time":"1584013142","sender":"7881301610989604","sender_name":"17","server_id":"1000481"},"type":11041} - 通过好友返回的数据 //{"data":{"content":"哦哦哦","content_type":2,"conversation_id":"S:1688853956558440_7881301610989604","local_id":"33","receiver":"1688853956558440","send_time":"1584014191","sender":"7881301610989604","sender_name":"17","server_id":"1000520"},"type":11041} - 别人给我发了条消息 //{"data":{"content":"图婆","content_type":2,"conversation_id":"S:1688853956558440_7881301610989604","local_id":"36","receiver":"1688853956558440","send_time":"1584014736","sender":"7881301610989604","sender_name":"17","server_id":"1000542"},"type":11041} //{"data":{"content":"哦哦哦","content_type":0,"conversation_id":"S:1688853956450720_1688853956558440","local_id":"22","receiver":"1688853956450720","send_time":"1584013962","sender":"1688853956558440","sender_name":"华","server_id":"1000498"},"type":11041} - 收到自己发的消息 //{"data":{"content":"给我发条消息","content_type":0,"conversation_id":"S:1688853956450720_1688853956558440","local_id":"23","receiver":"1688853956450720","send_time":"1584014066","sender":"1688853956558440","sender_name":"华","server_id":"1000500"},"type":11041} //{"data":{"content":"饿的","content_type":0,"conversation_id":"R:10696053211008104","local_id":"42","receiver":"R:10696053211008104","send_time":"1584015069","sender":"1688853956558440","sender_name":"吴嘉华","server_id":"1000574"},"type":11041} - 收到自己发送的群消息 #endregion //{"data":{"at_list":[],"content":"我是机器学习","content_type":2,"conversation_id":"S:1688853764215634_7881300713013122","local_id":"27946","receiver":"1688853764215634","send_time":"1589009390","sender":"7881300713013122","sender_name":"机器学习","server_id":"1088720"},"type":11041} //0、2 - 发送的文字 (0) if (content_type == "0" || content_type == "2") { var content = data["content"]?.ToString(); //文本消息内容 var conversation_id = data["conversation_id"]?.ToString(); //会话ID var local_id = data["local_id"]?.ToString(); //消息的本地ID var receiver = data["receiver"]?.ToString(); //接收者的user_id var send_time = data["send_time"]?.ToString(); //消息时间戳 var sender = data["sender"]?.ToString(); //发送者的user_id var sender_name = data["sender_name"]?.ToString(); //发送者昵称 var server_id = data["server_id"]?.ToString(); //消息的服务器ID var isSend = false; var RobotUsername = string.Empty; var RobotUsernick = string.Empty; var FromUsername = string.Empty; var FromUsernick = string.Empty; if (content_type == "0")//0自己发送的消息 { if (!WechatClient.IsAuxiliaryInput(sender, receiver, content)) { Console.WriteLine("此消息被过滤,因为是机器人自己发送的:" + content); return; } var ass = WechatClient.IsAssistance(sender, receiver, dwClientid, WechatType.Xiaoxie_QY); if (ass.type == WechatClient.AssistanceType.终止) return; isSend = ass.type == WechatClient.AssistanceType.辅助; RobotUsername = ass.robotName; RobotUsernick = ass.robotNick; FromUsername = ass.fromName; FromUsernick = ass.fromNick; } else { var user = WechatClient.GetUser(dwClientid, WechatType.Xiaoxie_QY); if (user == null) return; RobotUsername = user.Wxid; RobotUsernick = user.Nickname; FromUsername = sender; FromUsernick = sender_name; } var wmsg = new WorkWechatReceiveMsg(); wmsg.Cmd = PCRobotCMD.rcvTxt_workWeChat; wmsg.IsSend = isSend; wmsg.RobotUsername = RobotUsername; wmsg.RobotUsernick = RobotUsernick; wmsg.RobotType = RobotType.客户端企业微信; wmsg.FromMessageType = WechatMsgType.文本; if (conversation_id.Contains("R:")) { wmsg.FromGroupid = conversation_id; wmsg.FromUsername = sender; wmsg.FromUsernick = sender_name; } else { wmsg.FromUsername = FromUsername; wmsg.FromUsernick = FromUsernick; } wmsg.FromMessage = content; socketClient.Send(wmsg); } #endregion } break; case MsgType.MT_RECV_IMG_MSG://收到图片 { #region 图片消息 #region 消息样式 //{"data":{"content_type":101,"conversation_id":"R:10696053211008104","file_name":"7305d3cd-e94f-47db-a604-ce079e6c9ac5.jpg","file_path":"C:\\Users\\先森吳\\Documents\\WXWork\\1688853956558440\\Cache\\Image\\2020-03\\7305d3cd-e94f-47db-a604-ce079e6c9ac5.jpg","file_size":19457,"local_id":"73","receiver":"1688853956558440","send_time":"1584028981","sender":"7881301364988874","sender_name":"18","server_id":"1000677"},"type":11042} - 别人在群发的图片 //{"data":{"content_type":101,"conversation_id":"S:1688853956558440_7881301364988874","file_name":"29c9c19d-e8d7-4cb0-95b5-e1a7d385003a.jpg","file_path":"C:\\Users\\先森吳\\Documents\\WXWork\\1688853956558440\\Cache\\Image\\2020-03\\29c9c19d-e8d7-4cb0-95b5-e1a7d385003a.jpg","file_size":19457,"local_id":"74","receiver":"1688853956558440","send_time":"1584029032","sender":"7881301364988874","sender_name":"18","server_id":"1000680"},"type":11042} - 别人私聊发的图片 //{"data":{"content_type":14,"conversation_id":"R:10696053211008104","file_name":"0f7890b8ea01f7205a76d1195dab66b0.png","file_path":"C:\\Users\\先森吳\\Documents\\WXWork\\1688853956558440\\Cache\\Image\\2020-03\\0f7890b8ea01f7205a76d1195dab66b0.png","file_size":1627,"local_id":"75","receiver":"R:10696053211008104","send_time":"1584029085","sender":"1688853956558440","sender_name":"吴嘉华","server_id":"1000685"},"type":11042} - 自己群里发的图片 //{"data":{"content_type":14,"conversation_id":"S:1688853956558440_7881301364988874","file_name":"9c6d1a59d8f122fc85c3435ea2aa46fc.jpg","file_path":"C:\\Users\\先森吳\\Documents\\WXWork\\1688853956558440\\Cache\\Image\\2020-03\\9c6d1a59d8f122fc85c3435ea2aa46fc.jpg","file_size":178092,"local_id":"76","receiver":"7881301364988874","send_time":"1584029534","sender":"1688853956558440","sender_name":"吴嘉华","server_id":"1000689"},"type":11042} - 自己私聊发的图片 #endregion //14、101 (14) if (data == null) return; var content_type = data["content_type"]?.ToString(); //企业微信消息类型 if (content_type == "14") return; var socketClient = EasySoc.GetSocket(); var user = WechatClient.GetUser(dwClientid, WechatType.Xiaoxie_QY); if (user == null) return; var conversation_id = data["conversation_id"]?.ToString(); //会话ID var local_id = data["local_id"]?.ToString(); //消息的本地ID var receiver = data["receiver"]?.ToString(); //接收者的user_id var send_time = data["send_time"]?.ToString(); //消息时间戳 var sender = data["sender"]?.ToString(); //发送者的user_id var sender_name = data["sender_name"]?.ToString(); //发送者昵称 var server_id = data["server_id"]?.ToString(); //消息的服务器ID var file_path = data["file_path"]?.ToString(); //图片路径 var wmsg = new WorkWechatReceiveMsg(); wmsg.Cmd = PCRobotCMD.rcvImg_workWeChat; wmsg.RobotType = RobotType.客户端企业微信; wmsg.IsSend = false; wmsg.RobotUsername = user.Wxid; wmsg.RobotUsernick = user.Nickname; wmsg.FromMessage = $"[图片={file_path}]"; wmsg.FromMessageType = WechatMsgType.图片; if (conversation_id.Contains("R:")) { wmsg.FromGroupid = conversation_id; wmsg.FromUsername = sender; wmsg.FromUsernick = sender_name; } else { wmsg.FromUsername = sender; wmsg.FromUsernick = sender_name; } wmsg.FromMessage = string.Empty; socketClient.Send(wmsg); #endregion } break; case MsgType.MT_RECV_VIDEO_MSG://收到视频 { #region 收到视频 #region 消息样式 //{"data":{"content_type":103,"conversation_id":"S:1688853956558440_7881301364988874","duration":1,"file_name":"video.MP4","file_path":"C:\\Users\\先森吳\\Documents\\WXWork\\1688853956558440\\Cache\\Video\\2020-03\\video.MP4","file_size":198490,"height":960,"local_id":"77","receiver":"1688853956558440","send_time":"1584031142","sender":"7881301364988874","sender_name":"18","server_id":"1000691","width":544},"type":11043} - 别人发 //{"data":{"content_type":23,"conversation_id":"S:1688853956558440_7881301364988874","duration":1,"file_name":"video.MP4","file_path":"C:\\Users\\先森吳\\Documents\\WXWork\\1688853956558440\\Cache\\Video\\2020-03\\video.MP4","file_size":198490,"height":960,"local_id":"78","receiver":"7881301364988874","send_time":"1584031203","sender":"1688853956558440","sender_name":"吴嘉华","server_id":"1000696","width":544},"type":11043} - 自己发 #endregion //23、103 (23) if (data == null) return; var content_type = data["content_type"]?.ToString(); //企业微信消息类型 if (content_type == "23") return; var socketClient = EasySoc.GetSocket(); var user = WechatClient.GetUser(dwClientid, WechatType.Xiaoxie_QY); if (user == null) return; var conversation_id = data["conversation_id"]?.ToString(); //会话ID var local_id = data["local_id"]?.ToString(); //消息的本地ID var receiver = data["receiver"]?.ToString(); //接收者的user_id var send_time = data["send_time"]?.ToString(); //消息时间戳 var sender = data["sender"]?.ToString(); //发送者的user_id var sender_name = data["sender_name"]?.ToString(); //发送者昵称 var server_id = data["server_id"]?.ToString(); //消息的服务器ID var file_path = data["file_path"]?.ToString(); //图片路径 var wmsg = new WorkWechatReceiveMsg(); wmsg.Cmd = PCRobotCMD.rcvFile_workWeChat; wmsg.RobotType = RobotType.客户端企业微信; wmsg.IsSend = false; wmsg.RobotUsername = user.Wxid; wmsg.RobotUsernick = user.Nickname; wmsg.FromMessage = $"[视频={file_path}]"; wmsg.FromMessageType = WechatMsgType.视频; if (conversation_id.Contains("R:")) { wmsg.FromGroupid = conversation_id; wmsg.FromUsername = sender; wmsg.FromUsernick = sender_name; } else { wmsg.FromUsername = sender; wmsg.FromUsernick = sender_name; } wmsg.FromMessage = string.Empty; socketClient.Send(wmsg); #endregion } break; case MsgType.MT_RECV_VOICE_MSG://收到语音 break; case MsgType.MT_RECV_FILE_MSG://收到文件 break; case MsgType.MT_RECV_LOCATION_MSG://收到位置 break; case MsgType.MT_RECV_LINK_CARD_MSG://收到链接 { #region 链接消息 #region 消息样式 //{"data":{"content_type":13,"conversation_id":"S:1688853956558440_7881301364988874","desc":"【正品险·全国联保】听音乐、语音遥控家电的人工智能音箱","image_url":"","local_id":"82","receiver":"1688853956558440","send_time":"1584033150","sender":"7881301364988874","sender_name":"18","server_id":"1000715","title":"78元 小米(MI)小爱音箱 Play全新小爱同学升级版智能人工蓝牙WiFi音响 拼多多","url":"https://mobile.yangkeduo.com/goods1.html?goods_id=19287381820&page_from=35&share_uin=H3Z5B2UR6DQLWBIKN24YVO5XPQ_GEXDA&refer_share_id=e0d9d244358640aa853a8dcd1ff84216&refer_share_uid=4918926726&refer_share_channel=message&refer_share_form=card"},"type":11047} - 别人发送的私聊链接 //{"data":{"content_type":13,"conversation_id":"R:10696053211008104","desc":"【正品险·全国联保】听音乐、语音遥控家电的人工智能音箱","image_url":"","local_id":"85","receiver":"1688853956558440","send_time":"1584034341","sender":"7881301364988874","sender_name":"18","server_id":"1000724","title":"78元 小米(MI)小爱音箱 Play全新小爱同学升级版智能人工蓝牙WiFi音响 拼多多","url":"https://mobile.yangkeduo.com/goods1.html?goods_id=19287381820&page_from=35&share_uin=H3Z5B2UR6DQLWBIKN24YVO5XPQ_GEXDA&refer_share_id=e0d9d244358640aa853a8dcd1ff84216&refer_share_uid=4918926726&refer_share_channel=message&refer_share_form=card"},"type":11047} - 别人发送的群聊链接 //{"data":{"content_type":13,"conversation_id":"S:1688853956558440_7881301364988874","desc":"【正品险·全国联保】听音乐、语音遥控家电的人工智能音箱","image_url":"https://wework.qpic.cn/wwpic/51458_1ermIpIgTJu-_11_1584034011/0","local_id":"83","receiver":"7881301364988874","send_time":"1584034011","sender":"1688853956558440","sender_name":"吴","server_id":"1000720","title":"78元 小米(MI)小爱音箱 Play全新小爱同学升级版智能人工蓝牙WiFi音响 拼多多","url":"https://mobile.yangkeduo.com/goods1.html?goods_id=19287381820&page_from=35&share_uin=H3Z5B2UR6DQLWBIKN24YVO5XPQ_GEXDA&refer_share_id=e0d9d244358640aa853a8dcd1ff84216&refer_share_uid=4918926726&refer_share_channel=message&refer_share_form=card"},"type":11047} - 自己发送的私聊 //{"data":{"content_type":13,"conversation_id":"R:10696053211008104","desc":"【正品险·全国联保】听音乐、语音遥控家电的人工智能音箱","image_url":"https://wework.qpic.cn/wwpic/51458_1ermIpIgTJu-_11_1584034011/0","local_id":"84","receiver":"R:10696053211008104","send_time":"1584034246","sender":"1688853956558440","sender_name":"吴","server_id":"1000722","title":"78元 小米(MI)小爱音箱 Play全新小爱同学升级版智能人工蓝牙WiFi音响 拼多多","url":"https://mobile.yangkeduo.com/goods1.html?goods_id=19287381820&page_from=35&share_uin=H3Z5B2UR6DQLWBIKN24YVO5XPQ_GEXDA&refer_share_id=e0d9d244358640aa853a8dcd1ff84216&refer_share_uid=4918926726&refer_share_channel=message&refer_share_form=card"},"type":11047} - 自己发送的群聊 #endregion var content_type = data["content_type"]?.ToString(); //if (content_type != "13") return; var socketClient = EasySoc.GetSocket(); var conversation_id = data["conversation_id"]?.ToString(); //会话ID var desc = data["desc"]?.ToString(); //链接描述 var image_url = data["image_url"]?.ToString(); //链接缩略图url var local_id = data["local_id"]?.ToString(); //消息的本地ID var receiver = data["receiver"]?.ToString(); //接收者的user_id var send_time = data["send_time"]?.ToString(); //消息时间戳 var sender = data["sender"]?.ToString(); //发送者的user_id var sender_name = data["sender_name"]?.ToString(); //发送者昵称 var server_id = data["server_id"]?.ToString(); //消息的服务器ID var title = data["title"]?.ToString(); //链接标题 var url = data["url"]?.ToString(); //链接url var isSend = false; var RobotUsername = string.Empty; var RobotUsernick = string.Empty; var FromUsername = string.Empty; var FromUsernick = string.Empty; var user = WechatClient.GetUser(dwClientid, WechatType.Xiaoxie_QY); if (user == null) return; if (user.Wxid == sender) //0自己发送的消息 { if (!WechatClient.IsAuxiliaryInput(sender, receiver, url)) { Console.WriteLine("此消息被过滤,因为是机器人自己发送的:" + url); return; } var ass = WechatClient.IsAssistance(sender, receiver, dwClientid, WechatType.Xiaoxie_QY); if (ass.type == WechatClient.AssistanceType.终止) return; isSend = ass.type == WechatClient.AssistanceType.辅助; RobotUsername = ass.robotName; RobotUsernick = ass.robotNick; FromUsername = ass.fromName; FromUsernick = ass.fromNick; } else { RobotUsername = user.Wxid; RobotUsernick = user.Nickname; FromUsername = sender; FromUsernick = sender_name; } var wmsg = new WorkWechatReceiveMsg(); wmsg.Cmd = PCRobotCMD.rcvTxt_workWeChat; wmsg.IsSend = isSend; wmsg.RobotUsername = RobotUsername; wmsg.RobotUsernick = RobotUsernick; wmsg.RobotType = RobotType.客户端企业微信; wmsg.FromMessageType = WechatMsgType.文本; if (conversation_id.Contains("R:")) { wmsg.FromGroupid = conversation_id; wmsg.FromUsername = sender; wmsg.FromUsernick = sender_name; } else { wmsg.FromUsername = FromUsername; wmsg.FromUsernick = FromUsernick; } wmsg.FromMessage = url; socketClient.Send(wmsg); #endregion } break; case MsgType.MT_RECV_EMOTION_MSG://收到表情 break; case MsgType.MT_RECV_RED_PACKET_MSG://收到红包 { } break; case MsgType.MT_RECV_PERSON_CARD_MSG://收到个人名片 { //{"data":{"content":"推荐噢噢噢哦哦","content_type":2,"conversation_id":"S:1688853956558440_7881301364988874","local_id":"81","receiver":"1688853956558440","send_time":"1584031525","sender":"7881301364988874","sender_name":"18","server_id":"1000703"},"type":11041} /* {"data":{"avatar":"http://wx.qlogo.cn/mmhead/PiajxSqBRaELtKaBvIBMGI7xTZdLA9mZglMaZQxPeBASJT1lCXCJnKg/0","content_type":41,"conversation_id":"S:1688853956558440_7881301364988874","local_id":"80","nickname":"??欧尼桑","receiver":"1688853956558440","send_time":"1584031525","sender":"7881301364988874","sender_name":"18","server_id":"1000700","source":"微信","user_id":"7881301516989639"},"type":11050} 收到消息:{"data":{"content":"推荐噢噢噢哦哦","content_type":2,"conversation_id":"S:1688853956558440_7881301364988874","local_id":"81","receiver":"1688853956558440","send_time":"1584031525","sender":"7881301364988874","sender_name":"18","server_id":"1000703"},"type":11041} */ //var content = data["content"]?.ToString(); //var content_type = data["content_type"]?.ToString(); //var conversation_id = data["conversation_id"]?.ToString(); //var local_id = data["local_id"]?.ToString(); //var receiver = data["receiver"]?.ToString(); //var send_time = data["send_time"]?.ToString(); //var sender = data["sender"]?.ToString(); //var sender_name = data["sender_name"]?.ToString(); //var server_id = data["server_id"]?.ToString(); } break; case MsgType.MT_RECV_OTHER_MSG: break; case MsgType.MT_SEARCH_USER_MSG://查询联系人 break; case MsgType.MT_ADD_SEARCH_USER_MSG://添加查询的联系人 break; case MsgType.MT_MODIFY_USER_REMARK_MSG://修改用户备注 break; case MsgType.MT_MODIFY_USER_DESC_MSG: break; case MsgType.MT_MODIFY_EXTERNAl_USER_PHONES_MSG: break; case MsgType.MT_MODIFY_EXTERNAl_USER_COMPANY_MSG: break; case MsgType.MT_CREATE_ROOM_MSG: { } break; case MsgType.MT_MODIFY_ROOM_NAME_MSG: break; case MsgType.MT_ROOM_ADD_MEMBERS_MSG: { } break; case MsgType.MT_ROOM_DEL_MEMBERS_MSG://删除群成员 break; case MsgType.MT_RECV_FRIEND_REQUEST://接收好友请求 { //{"data":{"avatar":"http://wx.qlogo.cn/mmhead/0T8yO33zeeg33jJCQibIWobapj6GX4xFBbOECtmG9VdkYpnzyiaUr5iag/0","corp_id":"1970325134026788","nickname":"17","sex":2,"user_id":"7881301610989604","verify":"我17"},"type":11063} //{"data":{"avatar":"http://wx.qlogo.cn/mmhead/PiajxSqBRaEI8qvnXF9KjgTpvaSAzfhbE2kGoIspb7ibbEHGZEQxRibAQ/0","corp_id":"1970325134026788","nickname":"助将","sex":0,"user_id":"7881303410988876","verify":"欧珀new"},"type":11063} //{"data":{"avatar":"http://wx.qlogo.cn/mmhead/zroWGtm5tmsxaCHfI2ibibuBxtzsZc6brAIDCicIianoDYI/0","corp_id":"1970325134026788","nickname":"Boom","sex":1,"user_id":"7881303336175964","verify":"我是Boom"},"type":11063} if (data == null) return; var socketClient = EasySoc.GetSocket(); var avatar = data["avatar"]?.ToString();//头像 var corp_id = data["corp_id"]?.ToString();//公司id var nickname = data["nickname"]?.ToString();//申请人昵称 var sex = data["sex"]?.ToString();//性别 var user_id = data["user_id"]?.ToString();//用户id var verify = data["verify"]?.ToString();//申请摘要 var user = WechatClient.GetUser(dwClientid, WechatType.Xiaoxie_QY); if (user == null) return; var wXApply = new WorkWechatApplyFriend(); wXApply.Cmd = PCRobotCMD.applyFriend_workWeChat; wXApply.RobotUsername = user.Wxid; wXApply.RobotUsernick = user.Nickname; wXApply.RobotType = RobotType.客户端企业微信; wXApply.Message = verify; wXApply.NewFriendWxid = user_id; wXApply.NewFriendNick = nickname; wXApply.OldFriendWxid = string.Empty; wXApply.OldFriendNick = string.Empty; wXApply.Token = CsharpHttpHelper.HttpHelper.ObjectToJson(new { user_id = user_id, corp_id = corp_id }); //记录申请人,用于记录 if (!FriendRequestRecord.ContainsKey(user_id)) FriendRequestRecord.TryAdd(user_id, new FriendInfo() { account = user_id, avatar = avatar, nickname = nickname, sex = int.Parse(sex), wxid = user_id }); socketClient.Send(wXApply); } break; case MsgType.MT_ACCEPT_FRIEND_REQUEST://接受加好友请求 break; case MsgType.MT_GET_OWNER_INFO_MSG:// 获取自己信息 { } break; case MsgType.MT_GET_INNER_USERS_MSG:// 获取内部联系人列表 { } break; case MsgType.MT_GET_EXTERNAL_USERS_MSG:// 获取外部联系列表 { #region 外部联系列表 #region 消息样式 //{"data":[{"avatar":"http://wx.qlogo.cn/mmhead/GPyw0pGicibl4KQicb5bXGu2SibrykeGOH5IicK2d8LTfbA11zNB2A2SoKg/0","conversation_id":"S:1688853956558440_7881301364988874","corp_id":"1970325134026788","desc":"","external_job":"","nickname":"","position":"","realname":"","remark":"","sex":2,"user_id":"7881301364988874","username":"18"},{"avatar":"http://wx.qlogo.cn/mmhead/0T8yO33zeeg33jJCQibIWobapj6GX4xFBbOECtmG9VdkYpnzyiaUr5iag/0","conversation_id":"S:1688853956558440_7881301610989604","corp_id":"1970325134026788","desc":"","external_job":"","nickname":"","position":"","realname":"","remark":"","sex":0,"user_id":"7881301610989604","username":"17"},{"avatar":"http://wx.qlogo.cn/mmhead/Q3auHgzwzM6CiaVp63VVTIRySkxia2KSGQ6hrYAvAkkjoMpl4wFjyhIA/0","conversation_id":"S:1688853956558440_7881302509911391","corp_id":"1970325134026788","desc":"","external_job":"","nickname":"","position":"","realname":"","remark":"千年老妖","sex":1,"user_id":"7881302509911391","username":"千年老妖"}],"type":11037} #endregion var user = WechatClient.GetUser(dwClientid, WechatType.Xiaoxie_QY); if (user == null) return; var client = WechatClient.GetApi(user) as Wechat_Xiaoxie_QY; if (!user.IsGetFriend) return; try { if (data == null) { lock (Friend_Lock) { var _data = json.ContainsKey("data") ? json["data"] as ArrayList : null; if (_data == null) return; for (int i = 0; i < _data.Count; i++) { var item = _data[i] as Dictionary; var f = new WorkFriendInfo(); f.avatar = item["avatar"]?.ToString(); f.conversation_id = item["conversation_id"]?.ToString(); //f.desc = item["desc"]?.ToString(); f.nickname = item["nickname"]?.ToString(); f.position = item["position"]?.ToString(); f.realname = item["realname"]?.ToString(); f.remark = item["remark"]?.ToString(); f.sex = int.Parse(item["sex"]?.ToString()); f.user_id = item["user_id"]?.ToString(); f.username = item["username"]?.ToString(); //var user = WechatClient.GetUser(dwClientid, WechatType.Xiaoxie_QY); //if (user == null) // return; var friend = user.WorkFriends.FirstOrDefault(z => z.user_id == f.user_id); if (friend == null) user.WorkFriends.Add(f); } } #region xx //var nmss = new List>(); //var mis = new List(); //var count = 40; //var rem = _data.Count % count; //var num = _data.Count / count; //for (int i = 0; i < _data.Count; i++) //{ // var item = _data[i] as Dictionary; // var f = new WorkFriendInfo(); // f.avatar = item["avatar"]?.ToString(); // f.conversation_id = item["conversation_id"]?.ToString(); // f.corp_id = item["corp_id"]?.ToString(); // f.desc = item["desc"]?.ToString(); // f.external_job = item["external_job"]?.ToString(); // f.nickname = item["nickname"]?.ToString(); // f.position = item["position"]?.ToString(); // f.realname = item["realname"]?.ToString(); // f.remark = item["remark"]?.ToString(); // f.sex = int.Parse(item["sex"]?.ToString()); // f.nickname = item["username"]?.ToString(); // f.user_id = item["user_id"]?.ToString(); // //f.manager_wxid = item["manager_wxid"]?.ToString(); // //f.is_manager = int.Parse(item["is_manager"].ToString()); // mis.Add(f); // if (mis.Count >= count) // { // nmss.Add(mis); // mis = new List(); // } // else if (nmss.Count == num && mis.Count == rem) // { // nmss.Add(mis); // } //} //var user = WechatClient.GetUser(dwClientid, WechatType.Xiaoxie_QY); //if (user == null) return; //var socketClient = EasySoc.GetSocket(); //foreach (var item in nmss) //{ // var msg = new WorkWechatContactList(); // msg.RobotUsername = user.Wxid; // msg.RobotUsernick = user.Nickname; // msg.RobotType = RobotType.客户端企业微信; // msg.Cmd = PCRobotCMD.rcvContactList_workWeChat; // msg.Message = HttpHelper.ObjectToJson(new Dictionary>() { { "data", item } }); // socketClient.Send(msg); // Thread.Sleep(5); //} #endregion } } catch { } finally { user.IsGetFriend = false; } #endregion } break; case MsgType.MT_GET_ROOMS_MSG:// 获取群聊列表 { //{"data":[{"conversation_id":"R:1970325073072411","create_user_id":"1688853956450720","is_manager":0,"nickname":"成都秒单客网络科技有限公司","total":5},{"conversation_id":"R:10696053211008104","create_user_id":"1688853956558440","is_manager":1,"nickname":"吴嘉华、18、17","total":3}],"type":11038} if (data == null) { lock (Friend_Lock) { var _data = json.ContainsKey("data") ? json["data"] as ArrayList : null; if (_data == null) return; var user = WechatClient.GetUser(dwClientid, WechatType.Xiaoxie_QY); if (user == null) return; for (int i = 0; i < _data.Count; i++) { var item = _data[i] as Dictionary; var f = new WorkFriendInfo(); f.avatar = string.Empty; f.user_id = item["conversation_id"]?.ToString(); f.manager_wxid = item["create_user_id"]?.ToString(); f.is_manager = int.Parse(item["is_manager"]?.ToString()); f.nickname = item["nickname"]?.ToString(); f.username = item["nickname"]?.ToString(); f.remark = item["nickname"]?.ToString(); f.manager_wxid = item["create_user_id"]?.ToString(); f.is_manager = int.Parse(item["is_manager"]?.ToString()); var friend = user.WorkFriends.FirstOrDefault(z => z.user_id == f.user_id); if (friend == null) user.WorkFriends.Add(f); } } } } break; case MsgType.MT_GET_USER_DETAIL_MSG:// 获取用户详细信息 { //{"data":{"avatar":"http://wx.qlogo.cn/mmhead/GPyw0pGicibl4KQicb5bXGu2SibrykeGOH5IicK2d8LTfbA11zNB2A2SoKg/0","conversation_id":"S:1688853956558440_7881301364988874","desc":"","nickname":"","position":"","realname":"","remark":"","sex":2,"user_id":"7881301364988874","username":"18"},"type":11039} 获取到用户数据 //{"data":{"user_id":"7881302447012216"},"type":11039} 获取的用户不存在 if (!data.ContainsKey("conversation_id")) return; lock (Friend_Lock) { var f = new WorkFriendInfo(); f.avatar = data["avatar"]?.ToString(); f.conversation_id = data["conversation_id"]?.ToString(); if (data.ContainsKey("desc")) f.desc = data["desc"]?.ToString(); else f.desc = string.Empty; f.nickname = data["nickname"]?.ToString(); f.position = data["position"]?.ToString(); f.realname = data["realname"]?.ToString(); f.remark = data["remark"]?.ToString(); f.sex = int.Parse(data["sex"]?.ToString()); f.user_id = data["user_id"]?.ToString(); f.username = data["username"]?.ToString(); var user = WechatClient.GetUser(dwClientid, WechatType.Xiaoxie_QY); if (user == null) return; var friend = user.WorkFriends.FirstOrDefault(z => z.user_id == f.user_id); if (friend != null) if (!user.WorkFriends.TryTake(out friend)) return; user.WorkFriends.Add(f); } } break; case MsgType.MT_GET_ROOM_MEMBERS_MSG:// 获取群成员列表 { try { #region 数据样式 /* {"data":{"conversation_id":"R:10696053211008104","member_list":[{"avatar":"https://wework.qpic.cn/bizmail/FxrNrXCeEh8Kwv4ia3iahWCbkR7Y0VqoBnGSHAyhDIefRGkL7tT76SsA/0","conversation_id":"S:1688853956558440_1688853956558440","desc":"","nickname":"","position":"","realname":"吴嘉华","remark":"","sex":1,"user_id":"1688853956558440","username":"吴嘉华"},{"avatar":"http://wx.qlogo.cn/mmhead/GPyw0pGicibl4KQicb5bXGu2SibrykeGOH5IicK2d8LTfbA11zNB2A2SoKg/0","conversation_id":"S:1688853956558440_7881301364988874","desc":"","nickname":"","position":"","realname":"","remark":"","sex":2,"user_id":"7881301364988874","username":"18"},{"avatar":"http://wx.qlogo.cn/mmhead/0T8yO33zeeg33jJCQibIWobapj6GX4xFBbOECtmG9VdkYpnzyiaUr5iag/0","conversation_id":"S:1688853956558440_7881301610989604","desc":"","nickname":"","position":"","realname":"","remark":"","sex":0,"user_id":"7881301610989604","username":"17"}]},"type":11040} {"data":{"conversation_id":"R:1970325073072411","member_list":[{"avatar":"http://wework.qpic.cn/bizmail/UBH52fian6zLyTQm2YeWIEonTIT0snwXSojzt7AjPbWk0CBqbRBtshA/0","conversation_id":"S:1688853956558440_1688853956450720","desc":"","nickname":"","position":"","realname":"聂红利","remark":"","sex":1,"user_id":"1688853956450720","username":"千年老妖"},{"avatar":"https://wework.qpic.cn/bizmail/FxrNrXCeEh8Kwv4ia3iahWCbkR7Y0VqoBnGSHAyhDIefRGkL7tT76SsA/0","conversation_id":"S:1688853956558440_1688853956558440","desc":"","nickname":"","position":"","realname":"吴嘉华","remark":"","sex":1,"user_id":"1688853956558440","username":"吴嘉华"},{"avatar":"http://wework.qpic.cn/bizmail/AU8vqVRBac5HFiaTI2qxv3RNr8Kib0wFyicBQZkvs06ayzBhlHE7dCAmA/0","conversation_id":"S:1688853956558440_1688853956589484","desc":"","nickname":"","position":"","realname":"","remark":"","sex":2,"user_id":"1688853956589484","username":"白龙马"},{"avatar":"http://p.qpic.cn/wwhead/duc2TvpEgSTPk74IwG7Bs8GzMNxjerMmg94LwYswvGEoKMZcpTicE7vkLsDwGdh8BcVJLibuGFXbc/0","conversation_id":"S:1688853956558440_10977528187716586","desc":"","nickname":"","position":"","realname":"","remark":"","sex":1,"user_id":"10977528187716586","username":"嘿嘿"},{"avatar":"http://p.qpic.cn/wwhead/duc2TvpEgSTPk74IwG7Bs8GzMNxjerMmg94LwYswvGEoKMZcpTicE7vkLsDwGdh8BcVJLibuGFXbc/0","conversation_id":"S:1688853956558440_10977528187716587","desc":"","nickname":"","position":"","realname":"","remark":"","sex":1,"user_id":"10977528187716587","username":"测试机器人"}]},"type":11040} */ #endregion lock (Friend_Lock) { //{"data":{"conversation_id":"R:10696053211018728","member_list":[{"acctid":"WuJiaHua","avatar":"http://wework.qpic.cn/bizmail/FxrNrXCeEh8Kwv4ia3iahWCbkR7Y0VqoBniaJ5hrlKggVaibBXIxmOBb8A/0","corp_id":"1970325073072411","invite_user_id":"1688853956558440","nickname":"洪荒老道","position":"","realname":"吴嘉华","remark":"","sex":1,"user_id":"1688853956558440","username":"洪荒老道"},{"acctid":"","avatar":"http://wx.qlogo.cn/mmhead/FrdAUicrPIibe0Dd7mWcTkmSz8GHQp6YWcVzd4g62zicVnTPGI3G9S5vA/0","corp_id":"1970325134026788","invite_user_id":"1688853956558440","nickname":"","position":"","realname":"","remark":"ID3110-。/V1/T1/i1","sex":0,"user_id":"7881301536005932","username":"摸鱼樊"},{"acctid":"","avatar":"http://wx.qlogo.cn/mmhead/0T8yO33zeeg33jJCQibIWobapj6GX4xFBbOECtmG9VdkYpnzyiaUr5iag/0","corp_id":"1970325134026788","invite_user_id":"1688853956558440","nickname":"","position":"","realname":"","remark":"","sex":2,"user_id":"7881301610989604","username":"17"},{"acctid":"","avatar":"http://wx.qlogo.cn/mmhead/Q3auHgzwzM5qa6vY8BQAoN1ViclaTAFFuknicOeMHNluZcXyTQLUrKKg/0","corp_id":"1970325134026788","invite_user_id":"1688853956558440","nickname":"","position":"","realname":"","remark":"21","sex":2,"user_id":"7881302484994318","username":"、"},{"acctid":"","avatar":"http://wx.qlogo.cn/mmhead/ibhzWy4ibIEpCGTLwEuhBf4rqKAvx4bXHicib6uWPaZrtGtRPtv8UrUgSQ/0","corp_id":"1970325134026788","invite_user_id":"1688853956558440","nickname":"","position":"","realname":"","remark":"E-b-Coco-▲-Υ-","sex":0,"user_id":"7881303377020975","username":"Coco"}]},"type":11040} var conversation_id = data["conversation_id"].ToString(); //var username = data["username"].ToString(); var member_list = data["member_list"] as ArrayList; if (member_list == null) return; var user = WechatClient.GetUser(dwClientid, WechatType.Xiaoxie_QY); if (user == null) return; var group = user.WorkGroups.FirstOrDefault(z => z.conversation_id == conversation_id); if (group == null) { group = new WorkGroupInfo() { conversation_id = conversation_id, total = member_list.Count, friends = new List() }; user.WorkGroups.Add(group); } else group.total = member_list.Count; for (int i = 0; i < member_list.Count; i++) { //{"account":"","avatar":"http://wx.qlogo.cn/mmhead/ver_1/klibauQfLYtmfniaYAzsV9l6V4cSHmdDhniaTmJ6aGo0z035JTkB5QWrOUbAPnJnP4YXTMuKKmwNBMNv2Fbj5ia9icNicYeXGXbbsRiagGFKryASro/132","city":"","country":"","nickname":"陈建","province":"","remark":"","sex":0,"wxid":"wxid_e1j30jf2k5zdk022"} //{"avatar":"http://wework.qpic.cn/bizmail/UBH52fian6zLyTQm2YeWIEonTIT0snwXSojzt7AjPbWk0CBqbRBtshA/0","conversation_id":"S:1688853956558440_1688853956450720","desc":"","nickname":"","position":"","realname":"利","remark":"","sex":1,"user_id":"1688853956450720","username":"千妖"} var item = member_list[i] as Dictionary; var f = new WorkFriendInfo(); f.avatar = item["avatar"]?.ToString(); f.conversation_id = conversation_id; //f.corp_id = item["corp_id"]?.ToString(); //f.desc = item["desc"]?.ToString(); //f.external_job = item["external_job"]?.ToString(); f.nickname = item["nickname"]?.ToString(); f.position = item["position"]?.ToString(); f.realname = item["realname"]?.ToString(); f.remark = item["remark"]?.ToString(); f.sex = int.Parse(item["sex"]?.ToString()); f.nickname = item["username"]?.ToString(); f.user_id = item["user_id"]?.ToString(); var friend = group.friends.FirstOrDefault(z => z.user_id == f.user_id); if (friend == null) group.friends.Add(f); } } #region xx //var nmss = new List>(); //var mis = new List(); //var count = 20; //var rem = member_list.Count % count; //var num = member_list.Count / count; //for (int i = 0; i < member_list.Count; i++) //{ // //{"account":"","avatar":"http://wx.qlogo.cn/mmhead/ver_1/klibauQfLYtmfniaYAzsV9l6V4cSHmdDhniaTmJ6aGo0z035JTkB5QWrOUbAPnJnP4YXTMuKKmwNBMNv2Fbj5ia9icNicYeXGXbbsRiagGFKryASro/132","city":"","country":"","nickname":"陈建","province":"","remark":"","sex":0,"wxid":"wxid_e1j30jf2k5zdk022"} // //{"avatar":"http://wework.qpic.cn/bizmail/UBH52fian6zLyTQm2YeWIEonTIT0snwXSojzt7AjPbWk0CBqbRBtshA/0","conversation_id":"S:1688853956558440_1688853956450720","desc":"","nickname":"","position":"","realname":"聂红利","remark":"","sex":1,"user_id":"1688853956450720","username":"千年老妖"} // var item = member_list[i] as Dictionary; // var f = new WorkFriendInfo(); // f.avatar = item["avatar"]?.ToString(); // f.conversation_id = item["conversation_id"]?.ToString(); // //f.corp_id = item["corp_id"]?.ToString(); // f.desc = item["desc"]?.ToString(); // //f.external_job = item["external_job"]?.ToString(); // f.nickname = item["nickname"]?.ToString(); // f.position = item["position"]?.ToString(); // f.realname = item["realname"]?.ToString(); // f.remark = item["remark"]?.ToString(); // f.sex = int.Parse(item["sex"]?.ToString()); // f.nickname = item["username"]?.ToString(); // f.user_id = item["user_id"]?.ToString(); // mis.Add(f); // if (mis.Count >= count) // { // nmss.Add(mis); // mis = new List(); // } // else if (nmss.Count == num && mis.Count == rem) // { // nmss.Add(mis); // } //} //var socketClient = EasySoc.GetSocket(); //var user = WechatClient.GetUser(dwClientid, WechatType.Xiaoxie_QY); //if (user == null) return; //foreach (var item in nmss) //{ // var msg = new WorkWechatGroupMember(); // msg.RobotUsername = user.Wxid; // msg.RobotUsernick = user.Nickname; // msg.RobotType = RobotType.客户端微信; // msg.Cmd = PCRobotCMD.rcvGroupMember_workWeChat; // var g = new WorkGroupInfo(); // g.conversation_id = conversation_id; // g.member_list = item; // msg.Message = HttpHelper.ObjectToJson(new Dictionary() { { "data", g } }); // socketClient.Send(msg); // Thread.Sleep(5); //} #endregion } catch (Exception ex) { } } break; case MsgType.MT_ROOM_ADD_MEMBER_NOTIFY_MSG://群成员新增通知 { if (data == null) return; var memberList = data["member_list"] as ArrayList; if (memberList == null || memberList.Count == 0) return; var user = WechatClient.GetUser(dwClientid, WechatType.Xiaoxie); if (user == null) return; var client = WechatClient.GetApi(user) as Wechat_Xiaoxie_QY; var socketClient = EasySoc.GetSocket(); //var avatar = data["avatar"].ToString();//头像 //var is_manager = data["is_manager"].ToString();// //var manager_wxid = data["manager_wxid"].ToString();//管理账号 //var room_nick = data["nickname"].ToString();//群昵称 //var room_wxid = data["room_wxid"].ToString();//群账号 //var total_member = int.Parse(data["total_member"].ToString());//群人数 //var member_list = data["member_list"] as ArrayList; //if (member_list != null && member_list.Count != 0) //{ // var member = member_list[0] as Dictionary; // var avatar_user = member["avatar"].ToString();//头像 // var invite_by = member["invite_by"].ToString();//邀请者wxid // var nickname = member["nickname"].ToString();//新用户昵称 // var wxid = member["wxid"].ToString();//新用户账号 // WechatNewMemer newMember = new WechatNewMemer(); // newMember.Cmd = PCRobotCMD.newMember; // newMember.RobotType = RobotType.客户端微信; // newMember.RobotUsername = user.Wxid; // newMember.RobotUsernick = user.Nickname; // newMember.SourceNick = string.Empty; // newMember.SourceName = (string.IsNullOrWhiteSpace(invite_by) || invite_by == user.Wxid) ? string.Empty : invite_by; // newMember.MemberNick = nickname; // newMember.MemberName = wxid; // newMember.GroupId = room_wxid; // newMember.GroupNick = room_nick; // newMember.TotalMember = total_member; // socketClient.Send(newMember); //} //op_user_id 邀请用户的昵称 //op_user_name 邀请用户的账号 var room_conversation_id = data["room_conversation_id"]?.ToString(); var room_name = data["room_name"]?.ToString(); var op_user_name = data["op_user_name"]?.ToString(); var op_user_id = data["op_user_id"]?.ToString(); for (int i = 0; i < memberList.Count; i++) { var item = memberList[i] as Dictionary; WechatNewMemer newMember = new WechatNewMemer(); newMember.Cmd = PCRobotCMD.newMember_workWeChat; newMember.RobotType = RobotType.客户端企业微信; newMember.RobotUsername = user.Wxid; newMember.RobotUsernick = user.Nickname; newMember.SourceNick = op_user_name; newMember.SourceName = op_user_id; newMember.MemberNick = item["name"]?.ToString(); ; newMember.MemberName = item["user_id"]?.ToString(); ; newMember.GroupId = room_conversation_id; newMember.GroupNick = room_name; newMember.TotalMember = 0; socketClient.Send(newMember); Thread.Sleep(50); } break; } default: break; } } catch (Exception ex) { //Console.WriteLine("解析消息异常:" + ex.Message + "," + recvData); LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + ".._" + recvData); } }); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "_."); } } private static ConcurrentDictionary FriendRequestRecord = new ConcurrentDictionary(); private static void WxCloseCallback(uint dwClientId) { try { var v = WechatClient.Users.FirstOrDefault(f => f.Value.DwClientId == dwClientId && f.Value.Type == WechatType.Xiaoxie_QY).Value; if (v != null) { LogHelper.GetSingleObj().Info("系统", $"WxCloseCallbackQY关闭回调,Uin:{v.Uin},微信:{v.Nickname}({v.Wxid})"); WechatClient.RemoveUser(v); } } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "_.-"); } } public override void AgreeAddMe(string text) { try { if (string.IsNullOrWhiteSpace(text)) return; var reg = Regex.Match(text, @"{""user_id"":""(?[^""]+?)"",""corp_id"":""(?[^""]+?)""}"); if (reg.Success) { var user_id = reg.Groups["user_id"].Value; var corp_id = reg.Groups["corp_id"].Value; var __json = CsharpHttpHelper.HttpHelper.ObjectToJson(new { type = MsgType.MT_ACCEPT_FRIEND_REQUEST, data = new { user_id = user_id, corp_id = corp_id } }); SendWxWorkData(User.DwClientId, __json); } } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "-._"); } } public override void DeleteFriend(string wxid) { try { } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "._"); } } public override void EditCotacts(string wxid, string remark) { try { var json = CsharpHttpHelper.HttpHelper.ObjectToJson(new { type = MsgType.MT_MODIFY_USER_REMARK_MSG, data = new { user_id = wxid, remark = remark } }); SendWxWorkData(User.DwClientId, json); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "*_"); } } /// /// 创建群 /// /// public override void CreateRoom(string wxidData) { try { if (string.IsNullOrWhiteSpace(wxidData)) return; var wxids = wxidData.Trim().Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); if (wxids != null && wxids.Length != 0) { var json = HttpHelper.ObjectToJson(new { type = MsgType.MT_CREATE_ROOM_MSG, data = wxids }); SendWxWorkData(User.DwClientId, json); } } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } /// /// 邀请用户进群 /// /// /// public override void InviteMemberToRoom_40Up(string conversation_id, string wxidData) { try { if (conversation_id.Trim().StartsWith("R:")) { var wxids = wxidData.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); var json = HttpHelper.ObjectToJson(new { type = MsgType.MT_ROOM_ADD_MEMBERS_MSG, data = new { conversation_id = conversation_id, user_list = wxids } }); SendWxWorkData(User.DwClientId, json); } } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + ".._."); } } public override void InviteMemberToRoom_40Down(string groupid, string wxidData) { InviteMemberToRoom_40Up(groupid, wxidData); } public override void DeleteRoomMember(string wxid, string room) { try { if (room.Trim().StartsWith("R:")) { var json = HttpHelper.ObjectToJson(new { type = MsgType.MT_ROOM_DEL_MEMBERS_MSG, data = new { conversation_id = room, user_list = new string[] { wxid } } }); SendWxWorkData(User.DwClientId, json); } } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } public override void GetContact() { try { var json = CsharpHttpHelper.HttpHelper.ObjectToJson(new { type = MsgType.MT_GET_EXTERNAL_USERS_MSG, data = new { } }); SendWxWorkData(User.DwClientId, json); Thread.Sleep(1000); json = CsharpHttpHelper.HttpHelper.ObjectToJson(new { type = MsgType.MT_GET_ROOMS_MSG, data = new { } }); SendWxWorkData(User.DwClientId, json); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "_*"); } } public override void GetContact(bool isUpdate) { try { var result = GetFriendInfos(true); var socketClient = EasySoc.GetSocket(); CommonResult msg = new CommonResult(); msg.RobotUsername = User.Wxid; msg.RobotUsernick = User.Nickname; msg.RobotType = RobotType.客户端微信; msg.MsgId = ServerMsgID; msg.Cmd = PCRobotCMD.rcvFriendList_workWeChat; msg.Data = result == null ? string.Empty : HttpHelper.ObjectToJson(result); socketClient.Send(msg); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } /// /// 获取好友列表 /// /// 刷新缓存数据 /// //public override List GetFriendInfos(bool flushGroupsCache = false) public override string GetFriendInfos(bool flushGroupsCache = false) { List friends = null; try { #region 获取缓存数据 friends = User.WorkFriends.Where(f => !f.user_id.Contains("R:")).ToList(); if (!flushGroupsCache && friends.Count != 0) return JsonConvert.SerializeObject(friends); #endregion if (!User.IsGetFriend) { //获取好友列表(数据库读取) var json = HttpHelper.ObjectToJson(new { type = MsgType.MT_GET_EXTERNAL_USERS_MSG, data = new { } }); SendWxWorkData(User.DwClientId, json); User.IsGetFriend = true; } var result_ = Task.Factory.StartNew>(delegate () { DateTime end_time = DateTime.Now.AddSeconds(20); do { if (!User.IsGetFriend) { friends = User.WorkFriends.Where(f => !f.user_id.Contains("R:")).ToList(); return friends; } Thread.Sleep(200); } while (end_time > DateTime.Now); return null; }).Result; //return friends; return JsonConvert.SerializeObject(friends); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "#__#"); } return string.Empty; } //public override void GetFriend(string wxid) //{ // try // { // var json = CsharpHttpHelper.HttpHelper.ObjectToJson(new { type = MsgType.MT_GET_USER_DETAIL_MSG, data = new { user_id = wxid } }); // SendWxWorkData(User.DwClientId, json); // } // catch (Exception ex) // { // LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message); // } //} //public override void GetGroupMemer(string groupId) //{ // try // { // var json = CsharpHttpHelper.HttpHelper.ObjectToJson(new { type = MsgType.MT_GET_ROOM_MEMBERS_MSG, data = new { conversation_id = groupId } }); // SendWxWorkData(User.DwClientId, json); // } // catch (Exception ex) // { // LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message); // } //} public override void GetGroupAndFriendInfo(string groupId, string wxid) { try { var json = string.Empty; WorkGroupInfo group = null; if (groupId.Contains("R:")) { json = HttpHelper.ObjectToJson(new { type = MsgType.MT_GET_ROOM_MEMBERS_MSG, data = new { conversation_id = groupId } }); var g = User.WorkGroups.FirstOrDefault(f => f.conversation_id == groupId); //User.WorkGroups.Clear(); if (g != null) { var u = g.friends.FirstOrDefault(f => f.user_id == wxid); if (u != null) group = new WorkGroupInfo() { conversation_id = groupId, friends = new List() { u }, total = g.total }; } if (group == null) { SendWxWorkData(User.DwClientId, json); var _group = Task.Factory.StartNew(delegate () { DateTime end_time = DateTime.Now.AddSeconds(15); do { g = User.WorkGroups.FirstOrDefault(f => f.conversation_id == groupId); if (g != null) { var u = g.friends.FirstOrDefault(f => f.user_id == wxid); if (u != null) { group = new WorkGroupInfo() { conversation_id = groupId, friends = new List() { u }, total = g.total }; return group; } } Thread.Sleep(200); } while (end_time > DateTime.Now); return null; }).Result; } } var socketClient = EasySoc.GetSocket(); var msg = new WorkWechatContact(); msg.RobotUsername = User.Wxid; msg.RobotUsernick = User.Nickname; msg.RobotType = RobotType.客户端企业微信;//客户端微信; msg.MsgId = ServerMsgID; msg.Cmd = PCRobotCMD.rcvContact_workWeChat; msg.Message = group == null ? string.Empty : HttpHelper.ObjectToJson(group); socketClient.Send(msg); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "/_"); } } public override void GetGroupAndFriendInfo(string groupId, string wxid, bool flush = false) { try { var json = string.Empty; WorkGroupInfo group = null; if (groupId.Contains("R:")) { json = HttpHelper.ObjectToJson(new { type = MsgType.MT_GET_ROOM_MEMBERS_MSG, data = new { conversation_id = groupId } }); var g = User.WorkGroups.FirstOrDefault(f => f.conversation_id == groupId); //User.WorkGroups.Clear(); if (g != null) { if (flush) { g.friends.Clear(); } else { var u = g.friends.FirstOrDefault(f => f.user_id == wxid); if (u != null) group = new WorkGroupInfo() { conversation_id = groupId, friends = new List() { u }, total = g.total }; } } if (group == null) { SendWxWorkData(User.DwClientId, json); var _group = Task.Factory.StartNew(delegate () { DateTime end_time = DateTime.Now.AddSeconds(15); do { g = User.WorkGroups.FirstOrDefault(f => f.conversation_id == groupId); if (g != null) { var u = g.friends.FirstOrDefault(f => f.user_id == wxid); if (u != null) { group = new WorkGroupInfo() { conversation_id = groupId, friends = new List() { u }, total = g.total }; return group; } } Thread.Sleep(200); } while (end_time > DateTime.Now); return null; }).Result; } } var socketClient = EasySoc.GetSocket(); var msg = new WorkWechatContact(); msg.RobotUsername = User.Wxid; msg.RobotUsernick = User.Nickname; msg.RobotType = RobotType.客户端企业微信;//客户端微信; msg.MsgId = ServerMsgID; msg.Cmd = PCRobotCMD.rcvContact_workWeChat; msg.Message = group == null ? string.Empty : HttpHelper.ObjectToJson(group); socketClient.Send(msg); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "/_"); } } public override void GetWxidInfo(string wxid) { try { var json = string.Empty; var u = User.WorkFriends.FirstOrDefault(f => f.user_id == wxid); if (u == null) { if (wxid.Contains("R:")) { json = HttpHelper.ObjectToJson(new { type = MsgType.MT_GET_ROOMS_MSG, data = new { } }); } else json = HttpHelper.ObjectToJson(new { type = MsgType.MT_GET_USER_DETAIL_MSG, data = new { user_id = wxid } }); SendWxWorkData(User.DwClientId, json); var friend = Task.Factory.StartNew(delegate () { DateTime end_time = DateTime.Now.AddSeconds(15); do { u = User.WorkFriends.FirstOrDefault(f => f.user_id == wxid); if (u != null) return u; Thread.Sleep(200); } while (end_time > DateTime.Now); return null; }).Result; } var socketClient = EasySoc.GetSocket(); var msg = new WorkWechatContact(); msg.RobotUsername = User.Wxid; msg.RobotUsernick = User.Nickname; msg.RobotType = RobotType.客户端企业微信;//客户端微信; msg.MsgId = ServerMsgID; msg.Cmd = PCRobotCMD.rcvContact_workWeChat; msg.Message = u == null ? string.Empty : HttpHelper.ObjectToJson(u); socketClient.Send(msg); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "_/"); } } public override void SendImage(string wxid, string file) { //try //{ // var conversation_id = wxid; // if (!wxid.StartsWith("R:")) // { // conversation_id = $"S:{User.Wxid}_{wxid}"; // } // var json = HttpHelper.ObjectToJson(new { type = MsgType.MT_SEND_IMAGE_MSG, data = new { conversation_id = conversation_id, file = file } }); // SendWxWorkData(User.DwClientId, json); //} //catch (Exception ex) //{ // LogHelper.GetSingleObj().Error(new StackTrace().GetFrame(0).GetMethod().Name, ex.Message + ".-"); //} try { var conversation_id = wxid; if (!wxid.StartsWith("R:")) conversation_id = $"S:{User.Wxid}_{wxid}"; if (file.StartsWith("http", StringComparison.InvariantCultureIgnoreCase)) { byte[] ImangByte = null; string extension = Path.GetExtension(file); extension = string.IsNullOrWhiteSpace(extension) ? ".jpg" : extension; ImangByte = new System.Net.WebClient().DownloadData(file); byte[] imageHash = new MD5CryptoServiceProvider().ComputeHash(ImangByte); var path = Common.CacheFilePath(User.Wxid, conversation_id, "IMAGE", Guid.NewGuid().ToString("N"), extension); if (!File.Exists(path)) { File.WriteAllBytes(path, ImangByte); } if (File.Exists(path)) file = path; } else { if (!File.Exists(file)) { if (Common.IsBase64(file)) { var path = Common.CacheFilePath(User.Wxid, wxid, "IMAGE", Guid.NewGuid().ToString("N"), "jpg"); if (Common.Base64ToFileAndSave(file, path) && File.Exists(path)) { file = path; } } else { } } } var json = string.Empty; if (File.Exists(file)) { if (file.Trim().EndsWith(".gif", StringComparison.CurrentCultureIgnoreCase)) json = HttpHelper.ObjectToJson(new { type = MsgType.MT_SEND_GIF_MSG, data = new { conversation_id = conversation_id, file = file } }); else json = HttpHelper.ObjectToJson(new { type = MsgType.MT_SEND_IMAGE_MSG, data = new { conversation_id = conversation_id, file = file } }); } else json = HttpHelper.ObjectToJson(new { type = MsgType.MT_SEND_IMAGE_MSG, data = new { conversation_id = conversation_id, file = file } }); SendWxWorkData(User.DwClientId, json); } catch (Exception ex) { LogHelper.GetSingleObj().Debug("发送图片异常", ex.Message + ".-" + ex.StackTrace); } } public override void SendMessage(string wxid, string message) { try { //S:1688853956558440_7881301364988874 //{"data":{"content":"我们","content_type":2,"conversation_id":"S:1688853956558440_7881301364988874","local_id":"61","receiver":"1688853956558440","send_time":"1584028171","sender":"7881301364988874","sender_name":"18","server_id":"1000653"},"type":11041} var conversation_id = wxid; if (!wxid.StartsWith("R:")) { conversation_id = $"S:{User.Wxid}_{wxid}"; } else { } var json = string.Empty; message = message.Replace("\r\n", "\n"); if (Common.isXML(message)) { message = message.Replace("&", "&"); var title = string.Empty; var desc = string.Empty; var url = string.Empty; var image_url = string.Empty; var reg = Regex.Match(message, @"(?<标题>[\w\W]+?)"); if (reg.Success) title = reg.Groups["标题"].Value; reg = Regex.Match(message, @"(?<介绍>[\w\W]+?)"); if (reg.Success) desc = reg.Groups["介绍"].Value.Replace("(?<链接>[\w\W]+?)"); if (!reg.Success) reg = Regex.Match(message, @"(?<链接>[\w\W]+?)"); if (reg.Success) url = reg.Groups["链接"].Value; reg = Regex.Match(message, @"(?<图片链接>[\w\W]+?)"); if (reg.Success) image_url = reg.Groups["图片链接"].Value; if (message.Contains("")) { var image_key1 = string.Empty; var image_key2 = string.Empty; var image_key3 = string.Empty; var image_size = 0; var ghid = string.Empty; var pagepath = string.Empty; var regKey = Regex.Match(message, @"(?[\w\W]+?)", RegexOptions.IgnoreCase); if (regKey.Success) image_key1 = regKey.Groups["image_key1"].Value; regKey = Regex.Match(message, @"(?[\w\W]+?)", RegexOptions.IgnoreCase); if (regKey.Success) image_key2 = regKey.Groups["image_key2"].Value; regKey = Regex.Match(message, @"(?[\w\W]+?)", RegexOptions.IgnoreCase); if (regKey.Success) image_key3 = regKey.Groups["image_key3"].Value; regKey = Regex.Match(message, @"(?[\w\W]+?)", RegexOptions.IgnoreCase); if (regKey.Success) image_size = int.Parse(regKey.Groups["image_size"].Value.XMLReplace(false)); regKey = Regex.Match(message, @"(?[\w\W]+?)", RegexOptions.IgnoreCase); if (regKey.Success) ghid = regKey.Groups["username"].Value; regKey = Regex.Match(message, @"(?[\w\W]+?)", RegexOptions.IgnoreCase); if (regKey.Success) pagepath = regKey.Groups["pagepath"].Value; var weapppagethumbrawurl = string.Empty; regKey = Regex.Match(message, @"(?[\w\W]+?)", RegexOptions.IgnoreCase); if (regKey.Success) weapppagethumbrawurl = regKey.Groups["weapppagethumbrawurl"].Value; var _json = HttpHelper.ObjectToJson(new { type = MsgType.MT_SEND_MINI_PROGRAM_MSG, data = new { conversation_id = conversation_id, ghid = ghid.XMLReplace(false), wxid = conversation_id, name = title, title = desc, enterpoint = pagepath.XMLReplace(false), headimg = weapppagethumbrawurl.XMLReplace(false), image_key1 = image_key1.XMLReplace(false), image_key2 = image_key2.XMLReplace(false), image_key3 = image_key3.XMLReplace(false), image_size = image_size } }); SendWxWorkData(User.DwClientId, _json); return; } else { image_url = json = CsharpHttpHelper.HttpHelper.ObjectToJson(new { type = MsgType.MT_SEND_LINK_MSG, data = new { conversation_id = conversation_id, title = $"{title.XMLReplace(false)}", desc = $"{desc.XMLReplace(false)}", url = url.XMLReplace(false), image_url = image_url.XMLReplace(false) } }); } } else { var atUsername = new List(); var regs = Regex.Matches(message, @"\[@([^\]]+?)\]"); if (regs.Count != 0 && wxid.StartsWith("R:")) { foreach (Match item in regs) { atUsername.Add(item.Groups[1].Value.Trim()); } message = Regex.Replace(message, @"(\[@[^\]]+?\])", "{$@}"); json = CsharpHttpHelper.HttpHelper.ObjectToJson(new { type = MsgType.MT_SEND_ROOM_AT_MSG, data = new { conversation_id = conversation_id, content = message, at_list = atUsername.ToArray() } }); } else json = CsharpHttpHelper.HttpHelper.ObjectToJson(new { type = MsgType.MT_SEND_TEXT_MSG, data = new { conversation_id = conversation_id, content = message } }); } SendWxWorkData(User.DwClientId, json); //LogHelper.GetSingleObj().Debug("发送状态", ($"发送:{conversation_id} - {flag}, 内容:{message}")); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "-."); } } /// /// 发送小程序 /// /// 发送给谁 /// 发送的内容json打包 public override void SendProgramMessage(string wxid, string dataJson) { try { /* "conversation_id": "S:16888xxxx_7881xxxxx", "ghid": "gh_52b46203a658@app", "wxid": "wx35f2a3937c9df889", "name": "博鸟绘本", "title": "博鸟绘本,最新最全的儿童绘本租赁平台~", "enterpoint": "pages/shouye/shouye.html", "headimg": "http://wx.qlogo.cn/mmhead/xxxx/96", "image_key1": "306b020102046430620201000xxxxx", "image_key2": "61706264616C7A77666875xxxx", "image_key3": "b302e94d9c6f95xxxxxx", "image_size": 56448 */ //个人微信/企业微信 //{"data":{"content_type":78,"conversation_id":"R:10696053211018728","enterpoint":"pages/tab/home/index.html?_um_ssrc=oucfI5QRI-8SbyOTKSGYt5-ia0dk&_um_sts=1610033684099","ghid":"gh_a0d7a7672cf7@app","headimg":"http://wx.qlogo.cn/mmhead/Q3auHgzwzM43LsxpXHKd7ua7kwMZQ8WHmZlkYTzr3Tdm8sMOJ7Ypog/96","image_key1":"306b020102046430620201000204bafc490e02030f4df9020473e6607102045ff72a530436333133373039353935305f313734393433343231315f3262393764653133616335373232353633383831336564376334396563616164020100020300ab1004000201010201000400","image_key2":"61747072666A766977766D69726D6168","image_key3":"2b97de13ac57225638813ed7c49ecaad","image_size":43791,"is_pc":0,"local_id":"155","name":"啄木鸟家庭维修","receiver":"1688853956558440","send_time":"1610033747","sender":"7881302484994318","sender_name":"、","server_id":"1042188","title":"直营一口价,维修无猫腻","wxid":"wx3d6b1af0cb07fa5a"},"type":11066} var conversation_id = wxid; if (!wxid.StartsWith("R:")) conversation_id = $"S:{User.Wxid}_{wxid}"; var json = CsharpHttpHelper.HttpExtend.JsonToDictionary(dataJson); var data = json.ContainsKey("data") ? json["data"] as Dictionary : null; if (data == null) return; //var content_type = data["content_type"]?.ToString();//内容类型 78 //var conversation_id = data["conversation_id"]?.ToString();//接收者的的会话ID //var receiver = data["receiver"]?.ToString();//接收者的user_id //var sender = data["sender"]?.ToString();//发送者的user_id //var sender_name = data["sender_name"]?.ToString();//发送者昵称 //var server_id = data["server_id"]?.ToString();//消息的服务器ID var enterpoint = data["enterpoint"]?.ToString();//入口点 - 链接(小程序里面的链接) var headimg = data["headimg"]?.ToString();//小程序的头像 var name = data["name"]?.ToString();//小程序的名称 var title = data["title"]?.ToString();//小程序标题 var _wxid = data["wxid"]?.ToString(); var image_size = int.Parse(data["image_size"].ToString()); var image_key1 = data["image_key1"]?.ToString(); var image_key2 = data["image_key2"]?.ToString(); var image_key3 = data["image_key3"]?.ToString(); var ghid = data["ghid"]?.ToString(); var _json = HttpHelper.ObjectToJson(new { type = MsgType.MT_SEND_MINI_PROGRAM_MSG, data = new { conversation_id = conversation_id, ghid = ghid, wxid = _wxid, name = name, title = title, enterpoint = enterpoint, headimg = headimg, image_key1 = image_key1, image_key2 = image_key2, image_key3 = image_key3, image_size = image_size } }); SendWxWorkData(User.DwClientId, _json); } catch (Exception ex) { LogHelper.GetSingleObj().Error("发送小程序异常", ex.Message + ex.StackTrace); } } public override void SendVideo(string wxid, string file) { try { var conversation_id = wxid; if (!wxid.StartsWith("R:")) { conversation_id = $"S:{User.Wxid}_{wxid}"; } var json = CsharpHttpHelper.HttpHelper.ObjectToJson(new { type = MsgType.MT_SEND_VIDEO_MSG, data = new { conversation_id = conversation_id, file = file } }); SendWxWorkData(User.DwClientId, json); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "-_"); } } public override void SendFile(string wxid, string file) { try { var conversation_id = wxid; if (!wxid.StartsWith("R:")) { conversation_id = $"S:{User.Wxid}_{wxid}"; } var json = CsharpHttpHelper.HttpHelper.ObjectToJson(new { type = MsgType.MT_SEND_FILE_MSG, data = new { conversation_id = conversation_id, file = file } }); SendWxWorkData(User.DwClientId, json); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "_-"); } } public override void SendCard(string to_wxid, string card_wxid) { try { var conversation_id = to_wxid; if (!to_wxid.StartsWith("R:")) { conversation_id = $"S:{User.Wxid}_{to_wxid}"; } if (card_wxid.StartsWith("R:")) { InviteMemberToRoom_40Up(card_wxid, to_wxid); return; } var json = CsharpHttpHelper.HttpHelper.ObjectToJson(new { type = MsgType.MT_SEND_PERSON_CARD_MSG, data = new { conversation_id = conversation_id, user_id = card_wxid } }); SendWxWorkData(User.DwClientId, json); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "--"); } } public override void CloseWechat(string message) { try { var v = WechatClient.Users.FirstOrDefault(f => f.Value.DwClientId == User.DwClientId && f.Value.Type == WechatType.Xiaoxie_QY).Value; if (v != null) { LogHelper.GetSingleObj().Info("系统", $"CloseWechatQY事件退出,Uin:{v.Uin},微信:{v.Nickname}({v.Wxid})"); WechatClient.RemoveUser(v, true); if (!string.IsNullOrWhiteSpace(message)) PCRobotForm.ErrorMessAction?.Invoke(message); } } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message + "//"); } } private static void WxAcceptCallback(uint dwClientId) { Console.WriteLine("注入成功:" + dwClientId); } /// /// 启动微信 /// /// /// public static uint StartWechat(bool isError = false) { InitPc(); var WechatWinFile = HttpExtend.MapFile("WXWork.exe", $"WXWork\\{Version}"); var md5 = Common.GetMD5Hash(WechatWinFile).ToUpper(); if (!File.Exists(WechatWinFile) || md5 != PcMd5.ToUpper()) { if (isError) throw new Exception("易转发客户端企业微信版本不支持,请登录易转发端手动处理"); var _rst = MessageBox.Show("您的企业微信版本暂时不支持,立即重新安装吗?", "版本不兼容", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (_rst == DialogResult.Yes) { var f = new WechatUpdate(Version); f.ShowDialog(); if (!f.IsOk) return 0; } else return 0; } // 注入并多开 //return InjectWxWork(Encoding.UTF8.GetBytes(DllPath), Encoding.UTF8.GetBytes("")); var path = HttpExtend.MapFile("WXWork.exe", $"WXWork\\{Version}"); LogHelper.GetSingleObj().Debug("注入前", $"DPath = {DllPath},Path = {path}"); return InjectWxWorkMultiOpen(Encoding.UTF8.GetBytes(DllPath), Encoding.UTF8.GetBytes(path)); } #region 内部类 public enum MsgType : ushort { /// /// 接口准备完毕 /// MT_APP_READY_MSG = 11024, /// /// 参数错误提示 /// MT_PARAMS_ERROR_MSG = 11025, /// /// 登录消息 /// MT_USER_LOGIN = 11026, /// /// 注销消息 /// MT_USER_LOGOUT = 11027, /// /// 登录二维码 /// MT_LOGIN_QRCODE_MSG = 11028, /// /// 发送文本消息 /// MT_SEND_TEXT_MSG = 11029, /// /// 发送图片消息 /// MT_SEND_IMAGE_MSG = 11030, /// /// 发送文件消息 /// MT_SEND_FILE_MSG = 11031, /// /// 发送目录消息 /// MT_SEND_FOLDER_MSG = 11032, /// /// 发送链接消息 /// MT_SEND_LINK_MSG = 11033, /// /// 发送个人名片 /// MT_SEND_PERSON_CARD_MSG = 11034, /// /// 获取自己信息 /// MT_GET_OWNER_INFO_MSG = 11035, /// /// 获取内部联系人列表 /// MT_GET_INNER_USERS_MSG = 11036, /// /// 获取外部联系列表 /// MT_GET_EXTERNAL_USERS_MSG = 11037, /// /// 获取群聊列表 /// MT_GET_ROOMS_MSG = 11038, /// /// 获取用户详细信息 /// MT_GET_USER_DETAIL_MSG = 11039, /// /// 获取群成员列表 /// MT_GET_ROOM_MEMBERS_MSG = 11040, /// /// 接收文本消息 /// MT_RECV_TEXT_MSG = 11041, /// /// 接收图片消息 /// MT_RECV_IMG_MSG = 11042, /// /// 接收视频消息 /// MT_RECV_VIDEO_MSG = 11043, /// /// 接收语音消息 /// MT_RECV_VOICE_MSG = 11044, /// /// 接收文件消息 /// MT_RECV_FILE_MSG = 11045, /// /// 接收位置消息 /// MT_RECV_LOCATION_MSG = 11046, /// /// 接收链接消息 /// MT_RECV_LINK_CARD_MSG = 11047, /// /// 接收表情消息 /// MT_RECV_EMOTION_MSG = 11048, /// /// 接收红包消息 /// MT_RECV_RED_PACKET_MSG = 11049, /// /// 接收个人名片消息 /// MT_RECV_PERSON_CARD_MSG = 11050, /// /// 接收其他未解析消息 /// MT_RECV_OTHER_MSG = 11051, /// /// 查询联系人 /// MT_SEARCH_USER_MSG = 11052, /// /// 添加查询的联系人 /// MT_ADD_SEARCH_USER_MSG = 11053, /// /// 修改用户备注 /// MT_MODIFY_USER_REMARK_MSG = 11054, /// /// 修改用户描述 /// MT_MODIFY_USER_DESC_MSG = 11055, /// /// 修改外部联系人手机号 /// MT_MODIFY_EXTERNAl_USER_PHONES_MSG = 11056, /// /// 修改外部联系人公司 /// MT_MODIFY_EXTERNAl_USER_COMPANY_MSG = 11057, /// /// 创建群聊 /// MT_CREATE_ROOM_MSG = 11058, /// /// 修改群名 /// MT_MODIFY_ROOM_NAME_MSG = 11059, /// /// 添加群成员 /// MT_ROOM_ADD_MEMBERS_MSG = 11060, /// /// 删除群成员 /// MT_ROOM_DEL_MEMBERS_MSG = 11061, /// /// 接收好友请求 /// MT_RECV_FRIEND_REQUEST = 11063, /// /// 接受加好友请求 /// MT_ACCEPT_FRIEND_REQUEST = 11064, /// /// 发送小程序 /// MT_SEND_MINI_PROGRAM_MSG = 11065, /// /// 接收到小程序 /// MT_RECV_MINIAPP_MSG = 11066, /// /// 发送视频 /// MT_SEND_VIDEO_MSG = 11067, /// /// 接收图文消息 /// MT_RECV_IMAGE_TEXT_MSG = 11068, /// /// 发送群@消息 /// MT_SEND_ROOM_AT_MSG = 11069, /// /// 发送动图(gif)消息 /// MT_SEND_GIF_MSG = 11070, /// /// 添加群成员为联系人 /// MT_ADD_ROOM_USER_MSG = 11071, /// /// 群成员新增通知 /// MT_ROOM_ADD_MEMBER_NOTIFY_MSG = 11072, /// /// 剔除群成员通知 /// MT_ROOM_DEL_MEMBER_NOTIFY_MSG = 11073, /// /// 新群通知 /// MT_ROOM_CREATE_NOTIFY_MSG = 11074, /// /// 群成员主动退出通知 /// MT_ROOM_MEMBER_QUIT_NOTIFY_MSG = 11075, /// /// 好友新增通知 /// MT_CONTACT_ADD_NOITFY_MSG = 11076, } #endregion } }