using CsharpHttpHelper; using HPSocketCS; using Newtonsoft.Json.Linq; using NM_WeChat; using PCRobot.Pack; using PCRobot.Utils; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using static PCRobot.PCWechat.WechatClient; namespace PCRobot.PCWechat { public class Wechat_Dazong : BaseApi { public Wechat_Dazong(WechatUser User) : base(User) { } static TcpPackServer HP_Server; static NMCore nmCore; static NMHelper nmHeler; #region 微信版本基础信息 //private const string Version = "2.7.1.88"; //private const int PcOffSet = 0x138D6C0;//2.7.1.88 //private const string PcMd5 = "ced61f308edd8cf3e2d864df285dc2af";//2.7.1.88 //private const string Version = "3.1.0.41"; //private const int PcOffSet = 0x1885DE0;//3.1.0.41 //private const string PcMd5 = "E9D55BB8A28F02FAC6645480FEC35B8D";//3.1.0.41 private const string Version = "3.2.1.154"; private const int PcOffSet = 0x1AA82E8;//3.2.1.154 private const string PcMd5 = "68B06E378747CD3C58935A70A9DBA431";//3.2.1.154 private const string NanMuCore = "NanMuCore_3.2.1.154.dll"; //private const string Version = "3.2.1.154"; //private const int PcOffSet = 0x1CF9128;//3.3.5.50 ////1D03368 ////1D04228 ////1D29830 ////1D2C550 //private const string PcMd5 = "68B06E378747CD3C58935A70A9DBA431";//3.3.5.50 //private const string NanMuCore = "NanMuCore_3.3.5.50.dll"; #endregion public static void Install() { DllPath = HttpExtend.MapFile(NanMuCore, "Bin"); if (IsKsfInstall) return; HP_Server = new TcpPackServer(); nmHeler = new NMHelper(); HP_Server.OnAccept += new ServerEvent.OnAcceptEventHandler(OnAccept); HP_Server.OnReceive += new ServerEvent.OnReceiveEventHandler(OnReceive); HP_Server.OnClose += new ServerEvent.OnCloseEventHandler(OnClose); HP_Server.MaxPackSize = 0x3FFFFF; HP_Server.IpAddress = "127.0.0.1"; HP_Server.Port = 0; if (HP_Server.Start() == true) { nmCore = new NMCore(HP_Server); string szIPAddress = string.Empty; ushort dwPort = 0; HP_Server.GetListenAddress(ref szIPAddress, ref dwPort); if (dwPort == 0) { MessageBox.Show("通信端口创建失败,请重试!", "错误"); Environment.Exit(0); } nmHeler.Socket_Port = dwPort; try { NMHelper.NM_LinkWeChat(201912121, nmHeler.Socket_Port, 0, 0); } catch (Exception ex) { } IsKsfInstall = true; return; Process[] MyProcesses = Process.GetProcesses(); var path1 = HttpExtend.MapPath("PCWechat"); var path2 = HttpExtend.MapPath("PCWechat\\" + Version); foreach (Process MyProcess in MyProcesses) { try { var name = MyProcess.ProcessName.ToUpper(); if (name == "WECHAT" && MyProcess.MainModule.FileName.StartsWith(path1)) { try { //判断微信版本 //if (MyProcess.MainModule.FileName.StartsWith(path2) || is_inject) if (MyProcess.MainModule.FileName.StartsWith(path2)) { var id = MyProcess.Id; bool flag = Task.Factory.StartNew(delegate { try { //var path = CsharpHttpHelper.HttpExtend.MapPath($"PCWechat\\" + Version); //string szDllPath = System.IO.Directory.GetCurrentDirectory() + "\\Bin\\"+NanMuCore; //NMHelper.NM_CreateWeChatProcess(path, "WeChat.exe", szDllPath, nmHeler.Socket_Port); NMHelper.NM_LinkWeChat(201912121, nmHeler.Socket_Port, 0, 0); } catch (Exception) { } }).Wait(5000); if (!flag) { try { MyProcess.Kill(); } catch (Exception) { } } } else { //终止掉,其他版本 try { MyProcess.Kill(); } catch (Exception) { } } } catch (Exception) { } } } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } } } /// /// 通信事件_登录成功 /// /// /// static void Event_Login(int ConnID, JObject RecvJson) { var wxid = nmHeler.Json_GetString(RecvJson, "Wxid", true); var user = WechatClient.GetUser(wxid, (uint)ConnID, WechatType.Dazong); user.Nickname = nmHeler.Json_GetString(RecvJson, "Nick", true); user.Wxid = wxid; user.HeaderUrl = nmHeler.Json_GetString(RecvJson, "HeadIMG", true); //user.DBFile = data["wx_user_dir"].ToString(); int pid = 0; nmHeler.Json_GetInt(RecvJson, "ProcessId", out pid); user.Pid = pid; user.Phone = nmHeler.Json_GetString(RecvJson, "phone", true); user.Uin = GetUin(user.Pid); WechatClient.OnRefUserEvent(user); if (WechatClient.IsDebug) LogHelper.GetSingleObj().Debug("调试登录", $"{wxid} - {user}"); } /// /// 获取微信的uin的值 /// /// /// public static string GetUin(int pid) { Process[] processes = Process.GetProcesses(); foreach (Process process in processes) { if (process.Id == pid) { foreach (ProcessModule processModule in process.Modules) { if (processModule.ModuleName == "WeChatWin.dll") { //微信基址 var WeChatWinBaseAddress = processModule.BaseAddress; //Console.WriteLine("微信基址:\t" + "0x" + ((int)(processModule.BaseAddress)).ToString("X8") + Environment.NewLine); var WxNameAddress = WeChatWinBaseAddress + PcOffSet; var uinStr = Common.GetString(process.Handle, WxNameAddress, 4); return uinStr; } } break; } } return string.Empty; } /// /// 关闭事件 /// /// /// /// /// /// private static HandleResult OnClose(IServer sender, IntPtr connId, SocketOperation enOperation, int errorCode) { try { var v = WechatClient.Users.FirstOrDefault(f => f.Value.DwClientId == (uint)connId && f.Value.Type == WechatType.Dazong).Value; if (v != null) { LogHelper.GetSingleObj().Info("系统", $"WxCloseCallbackDaZong关闭回调,Uin:{v.Uin},微信:{v.Nickname}({v.Wxid})"); WechatClient.RemoveUser(v); } return HandleResult.Ok; } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } return HandleResult.Error; } private static HandleResult OnReceive(IServer sender, IntPtr connId, byte[] bytes) { try { string s_Recv = Encoding.Default.GetString(bytes); JObject RecvJson = JObject.Parse(s_Recv); Console.WriteLine(RecvJson); int RecvType; var method = new Action(delegate () { if (nmHeler.Json_GetInt(RecvJson, "PackType", out RecvType) == true) { if (RecvType == NMHelper.Recv_QRCode) { Event_QRCode(RecvJson); } else if (RecvType == NMHelper.Recv_Login) { Event_Login((int)connId, RecvJson); } else if (RecvType == NMHelper.Recv_Logout) { Event_Logout((int)connId, RecvJson); } else if (RecvType == NMHelper.Recv_Msg) { Event_RecvMsg((int)connId, RecvJson); } else if (RecvType == NMHelper.Recv_SelectTalker) { Event_SelectTalker((int)connId, RecvJson); } else if (RecvType == NMHelper.NM_GetContactList) { Event_RecvContactList((int)connId, RecvJson); } else if (RecvType == NMHelper.NM_GetGroupMember) { Event_RecvGroupMember((int)connId, RecvJson); } else if (RecvType == NMHelper.NM_GetWxidInfo) { Event_RecvWxidInfo((int)connId, RecvJson); } else if (RecvType == NMHelper.NM_AddFriend) { Event_AddFriend((int)connId, RecvJson);//主动申请加别人 } else if (RecvType == NMHelper.NM_CreateGroup) { Event_CreateGroup((int)connId, RecvJson);//建群 } else if (RecvType == NMHelper.NM_GetFavList) { Event_GetFavList((int)connId, RecvJson);//收藏 } else if (RecvType == NMHelper.NM_GetA8Key) { Event_GetA8Key((int)connId, RecvJson); } else if (RecvType == NMHelper.NM_InvitePull) { Event_GroupInvite((int)connId, RecvJson); } else if (RecvType == NMHelper.NM_QuitGroup) { Event_GroupQuit((int)connId, RecvJson); } } }); method.BeginInvoke(null, null); return HandleResult.Ok; } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } return HandleResult.Error; } private static void Event_QRCode(JObject RecvJson) { try { int dwPid = 0; nmHeler.Json_GetInt(RecvJson, "ProcessId", out dwPid); string B64_QRCode = nmHeler.Json_GetString(RecvJson, "QRCode", false); if (B64_QRCode != string.Empty) { byte[] imageBytes = Convert.FromBase64String(B64_QRCode); MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length); ms.Write(imageBytes, 0, imageBytes.Length); } } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } private static void Event_GroupQuit(int ConnId, JObject RecvJson) { try { string RecvWxid = nmHeler.Json_GetString(RecvJson, "RecvWxid", true); string outLog = "[群员动态-退群]" + RecvWxid; string GroupID = nmHeler.Json_GetString(RecvJson, "GroupID", true); outLog += "群聊ID:" + GroupID; JArray MemberList = RecvJson.Value("List"); if (MemberList != null) { for (int i = 0; i < MemberList.Count; i++) { JToken JtMember = MemberList.ElementAt(i); if (JtMember != null) { string Wxid = nmHeler.Json_GetString((JObject)JtMember, "Wxid", true); string Nick = nmHeler.Json_GetString((JObject)JtMember, "Nick", true); outLog += "[" + (i + 1).ToString() + "]"; outLog += Wxid + (Nick == string.Empty ? string.Empty : "(" + Nick + ")"); } } } } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } private static void Event_GroupInvite(int ConnId, JObject RecvJson) { try { string RecvWxid = nmHeler.Json_GetString(RecvJson, "RecvWxid", true); string outLog = "[群员动态-进群]" + RecvWxid; string GroupID = nmHeler.Json_GetString(RecvJson, "GroupID", true); outLog = "群聊ID:" + GroupID; JArray MemberList = RecvJson.Value("List"); if (MemberList != null) { for (int i = 0; i < MemberList.Count; i++) { JToken JtMember = MemberList.ElementAt(i); if (JtMember != null) { string Wxid = nmHeler.Json_GetString((JObject)JtMember, "Wxid", true); string Nick = nmHeler.Json_GetString((JObject)JtMember, "Nick", true); string InvWxid = nmHeler.Json_GetString((JObject)JtMember, "InvWxid", true); string InvNick = nmHeler.Json_GetString((JObject)JtMember, "InvNick", true); outLog += "[" + (i + 1).ToString() + "]"; outLog += "进群人:" + Wxid + (Nick == string.Empty ? string.Empty : "(" + Nick + ")"); outLog += "邀请人:" + InvWxid + (InvNick == string.Empty ? string.Empty : "(" + InvNick + ")"); } } } } catch (Exception ex) { LogHelper.GetSingleObj().Error(new StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } private static void Event_GetA8Key(int ConnId, JObject RecvJson) { try { string RecvWxid = nmHeler.Json_GetString(RecvJson, "RecvWxid", true); string outLog = "[GetA8Key]" + RecvWxid; string URL = nmHeler.Json_GetString(RecvJson, "URL", true); string LastURL = nmHeler.Json_GetString(RecvJson, "LastURL", true); outLog += "获取链接:" + URL; outLog += "返回链接:" + LastURL; //if (URL.IndexOf("mmsupport-bin/addchatroombyinvite") != -1) //{ // HttpWebRequest Request = (HttpWebRequest)HttpWebRequest.Create(URL); // Request.Method = "POST"; // Request.AllowAutoRedirect = false; // Request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"; // Request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 MicroMessenger/6.5.2.501 NetType/WIFI WindowsWechat QBCore/3.43.556.400 QQBrowser/9.0.2524.400"; // Request.Referer = URL; // Request.Headers.Add("Accept-Language", "zh-CN,zh;q=0.8,en-us;q=0.6,en;q=0.5;q=0.4"); // HttpWebResponse Response = (HttpWebResponse)Request.GetResponse(); // string hLocation = Response.GetResponseHeader("Location").ToString(); // if (hLocation != "") // { // if (hLocation.IndexOf("chatroom") != -1) // { // string GroupID = nmHeler.StringMid(hLocation, "weixin://jump/mainframe/", "@chatroom"); // WriteLog("[接受群聊邀请]" + RecvWxid + "群聊ID:" + GroupID + "@chatroom"); // } // } //} } catch (Exception ex) { LogHelper.GetSingleObj().Error(new StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } private static void Event_GetFavList(int connId, JObject recvJson) { try { //string outLog = "[收藏列表]" + nmHeler.Json_GetString(RecvJson, "RecvWxid", true) ; //JArray FavList = RecvJson.Value("List"); //if (FavList != null) //{ // list_Fav.Items.Clear(); // int dwCount = FavList.Count; // if (dwCount != 0) // { // list_Fav.BeginUpdate(); // for (int i = 0; i < dwCount; i++) // { // JToken JtMember = FavList.ElementAt(i); // if (JtMember != null) // { // int Type = nmHeler.Json_GetIntEx((JObject)JtMember, "Type"); // string SearchKey = nmHeler.Json_GetString((JObject)JtMember, "SearchKey", true); // string TypeName = nmHeler.GetFavType(Type); // ListViewItem FavItem = new ListViewItem(); // FavItem.Text = i.ToString(); // FavItem.SubItems.Add(TypeName); // FavItem.SubItems.Add(SearchKey == string.Empty ? "[" + TypeName + "文件]" : SearchKey); // list_Fav.Items.Add(FavItem); // } // } // list_Fav.EndUpdate(); // outLog += "收藏列表读取成功,共" + dwCount.ToString() + "条记录!"; // } // else // { // outLog += "没有收藏"; // } //} } catch (Exception ex) { LogHelper.GetSingleObj().Error(new StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } private static void Event_CreateGroup(int ConnId, JObject RecvJson) { //try //{ // string outLog = "[创建群聊]" + nmHeler.Json_GetString(RecvJson, "RecvWxid", true); // string Data = nmHeler.Json_GetString(RecvJson, "Data", true); // string GroupID = nmHeler.Json_GetString(RecvJson, "GroupID", true); // outLog += "建群返回:" + Data; // outLog += GroupID == string.Empty ? string.Empty : "群聊ID:" + GroupID; // JArray MemberList = RecvJson.Value("List"); // if (MemberList != null) // { // outLog += "群员列表:"; // for (int i = 0; i < MemberList.Count; i++) // { // JToken JtMember = MemberList.ElementAt(i); // if (JtMember != null) // { // string Wxid = nmHeler.Json_GetString((JObject)JtMember, "Wxid", true); // string Nick = nmHeler.Json_GetString((JObject)JtMember, "Nick", true); // int state = nmHeler.Json_GetIntEx((JObject)JtMember, "State"); // if (Wxid != string.Empty) // { // outLog += "[" + state.ToString() + "]" + (state == 0 ? "[成功]" : "[失败]"); // outLog += Wxid + (Nick == string.Empty ? string.Empty : "(" + Nick + ")"); // } // } // } // } //} //catch (Exception ex) //{ // LogHelper.GetSingleObj().Error(new StackTrace().GetFrame(0).GetMethod().Name, ex.Message); //} } private static void Event_AddFriend(int ConnID, JObject RecvJson) { //try //{ // string outLog = "[添加好友]" + nmHeler.Json_GetString(RecvJson, "RecvWxid", true); // int DataType = nmHeler.Json_GetIntEx(RecvJson, "DataType"); // string Data = nmHeler.Json_GetString(RecvJson, "Data", true); // int Type = nmHeler.Json_GetIntEx(RecvJson, "Type"); // int AddType = nmHeler.Json_GetIntEx(RecvJson, "AddType"); // string Wxid = nmHeler.Json_GetString(RecvJson, "Wxid", true); // string v2 = nmHeler.Json_GetString(RecvJson, "V2", true); // string Message = nmHeler.Json_GetString(RecvJson, "Message", true); // outLog += "添加返回:[" + DataType.ToString() + "]" + (DataType == 0 ? "已发送好友请求或已添加好友。" : Data); // outLog += "添加类型:" + Type.ToString() + " 添加来源:" + AddType.ToString(); // outLog += "Wxid:" + Wxid; // outLog += v2 == string.Empty ? string.Empty : "v2:" + v2; // outLog += Message == string.Empty ? string.Empty : "附加消息:" + Message; // if (Type == 1 && DataType == -44) // { // //nmCore.NM_AddFriend(ConnID, 2, AddType, Wxid, v2, text_Friend_Message.Text); // nmCore.NM_AddFriend(ConnID, 2, AddType, Wxid, v2, string.Empty);//TODO 改成了string.e // } //} //catch (Exception ex) //{ //LogHelper.GetSingleObj().Error(new StackTrace().GetFrame(0).GetMethod().Name, ex.Message); //} } private static void Event_RecvWxidInfo(int connId, JObject RecvJson) { try { //string outLog = "[下载详细信息]" + nmHeler.Json_GetString(RecvJson, "RecvWxid", true) + NewLine; //int dwState = nmHeler.Json_GetIntEx(RecvJson, "State"); //if (dwState == -1) { outLog += "下载详细信息超时(原因:服务器无返回)!"; } //else if (dwState == 0) { outLog += "下载详细信息失败(原因:可能是输入的Wxid不正确)!"; } //else if (dwState == 1) //{ // string szGroupID = nmHeler.Json_GetString(RecvJson, "GroupId", true); // NMHelper.nmWxidInfo MemberInfo = new NMHelper.nmWxidInfo(); // MemberInfo.Wxid = nmHeler.Json_GetString(RecvJson, "Wxid", true); // MemberInfo.WxNo = nmHeler.Json_GetString(RecvJson, "WxNo", true); // MemberInfo.Nick = nmHeler.Json_GetString(RecvJson, "Nick", true); // MemberInfo.V1 = nmHeler.Json_GetString(RecvJson, "v1", true); // MemberInfo.HeadIMG = nmHeler.Json_GetString(RecvJson, "HeadIMG", true); // MemberInfo.Address = nmHeler.Json_GetString(RecvJson, "Address", true); // MemberInfo.Sex = MemberInfo.GetSex(nmHeler.Json_GetIntEx(RecvJson, "Sex")); // outLog += szGroupID == string.Empty ? string.Empty : "群ID:" + szGroupID + NewLine; // outLog += "Wxid:" + MemberInfo.Wxid + NewLine; // outLog += MemberInfo.WxNo == string.Empty ? string.Empty : "微信号:" + MemberInfo.WxNo + NewLine; // outLog += "昵称:" + MemberInfo.Nick + NewLine; // outLog += MemberInfo.V1 == string.Empty ? string.Empty : "v1:" + MemberInfo.V1 + NewLine; // outLog += "性别:" + MemberInfo.Sex + NewLine; // outLog += MemberInfo.Address == string.Empty ? string.Empty : "地区:" + MemberInfo.Address + NewLine; // outLog += MemberInfo.HeadIMG == string.Empty ? string.Empty : "头像:" + MemberInfo.HeadIMG + NewLine; //} //WriteLog(outLog); var wxid = nmHeler.Json_GetString(RecvJson, "Wxid", true); var WxNo = nmHeler.Json_GetString(RecvJson, "WxNo", true); var Nick = nmHeler.Json_GetString(RecvJson, "Nick", true); var V1 = nmHeler.Json_GetString(RecvJson, "v1", true); var HeadIMG = nmHeler.Json_GetString(RecvJson, "HeadIMG", true); var Address = nmHeler.Json_GetString(RecvJson, "Address", true); //var Sex = MemberInfo.GetSex(nmHeler.Json_GetIntEx(RecvJson, "Sex")); if (Common.IsGzh(wxid, WechatClient.IsGzh)) return; var f = new FriendInfo(); f.account = WxNo; f.wxid = wxid; f.nickname = Nick; f.remark = Nick; f.avatar = HeadIMG; f.city = string.Empty; f.country = string.Empty; f.province = string.Empty; f.sex = nmHeler.Json_GetIntEx(RecvJson, "Sex"); var user = WechatClient.GetUser((uint)connId, WechatType.Dazong); if (user == null) return; var friend = user.Friends.FirstOrDefault(z => z.wxid == f.wxid); if (friend != null) if (!user.Friends.TryTake(out friend)) return; user.Friends.Add(f); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } private static void Event_RecvGroupMember(int ConnId, JObject RecvJson) { try { //string outLog = "[群员列表]" + nmHeler.Json_GetString(RecvJson, "RecvWxid", true); int dwState = nmHeler.Json_GetIntEx(RecvJson, "State"); if (dwState == 0)//群员列表读取失败! return; JArray m_List = RecvJson.Value("List"); if (m_List != null) { //var recv_wxid = nmHeler.Json_GetString(RecvJson, "RecvWxid", true);//群主 var user = WechatClient.GetUser((uint)ConnId, WechatType.Dazong); if (user == null) return; var group_wxid = nmHeler.Json_GetString(RecvJson, "GroupID", true); var Count = (int)RecvJson["Count"]; var group = user.Groups.FirstOrDefault(z => z.wxid == group_wxid); if (group == null) { group = new GroupInfo() { wxid = group_wxid, total_member = Count, friends = new List() }; user.Groups.Add(group); } else group.total_member = Count; for (int i = 0; i < m_List.Count; i++) { JToken JtMember = m_List.ElementAt(i); if (JtMember != null) { var Wxid = nmHeler.Json_GetString((JObject)JtMember, "Wxid", true); var Nick = nmHeler.Json_GetString((JObject)JtMember, "Nick", true); var Mark = nmHeler.Json_GetString((JObject)JtMember, "Mark", true); var HeadIMG = nmHeler.Json_GetString((JObject)JtMember, "HeadIMG", true); var f = new FriendInfo(); f.account = Wxid;//item["account"]?.ToString(); f.avatar = HeadIMG;//item["avatar"]?.ToString(); f.city = string.Empty;//item["city"]?.ToString(); f.country = string.Empty;//item["country"]?.ToString(); f.nickname = Nick;//item["nickname"]?.ToString(); f.province = string.Empty;//item["province"]?.ToString(); f.remark = Mark;//item["remark"]?.ToString(); f.sex = -1;//int.Parse(item["sex"]?.ToString()); f.wxid = Wxid;//item["wxid"]?.ToString(); var friend = group.friends.FirstOrDefault(z => z.wxid == f.wxid); if (friend == null) group.friends.Add(f); } } } } catch (Exception ex) { LogHelper.GetSingleObj().Error(new StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } private static void Event_RecvContactList(int ConnId, JObject RecvJson) { try { var user = WechatClient.GetUser((uint)ConnId, WechatType.Dazong); if (user == null) return; int dwState = nmHeler.Json_GetIntEx(RecvJson, "State"); if (dwState == 0)//通讯录列表读取失败! return; JArray m_List = RecvJson.Value("List"); if (m_List != null) { for (int i = 0; i < m_List.Count; i++) { JToken JtMember = m_List.ElementAt(i); if (JtMember != null) { var Type = nmHeler.Json_GetIntEx((JObject)JtMember, "Type"); var List = nmHeler.Json_GetIntEx((JObject)JtMember, "List"); var Wxid = nmHeler.Json_GetString((JObject)JtMember, "Wxid", true); var WxNo = nmHeler.Json_GetString((JObject)JtMember, "WxNo", true); var Nick = nmHeler.Json_GetString((JObject)JtMember, "Nick", true); var Mark = nmHeler.Json_GetString((JObject)JtMember, "Mark", true); var HeadIMG = nmHeler.Json_GetString((JObject)JtMember, "HeadIMG", true); if (Type == 8 || Type == 24 || Type == 29) continue; else if (Wxid.LastIndexOf("@chatroom") != -1) { ////UserItem.Text = MemberInfo.Nick == string.Empty ? "群聊" : MemberInfo.Nick; ////UserItem.SubItems.Add(MemberInfo.Wxid); ////UserItem.SubItems.Add(MemberInfo.WxNo); ////UserItem.SubItems.Add(MemberInfo.List.ToString()); ////UserItem.SubItems.Add(MemberInfo.HeadIMG); ////list_Group.Items.Add(UserItem); var f = new FriendInfo(); f.avatar = HeadIMG; f.wxid = Wxid; f.nickname = Nick; f.remark = Mark; f.manager_wxid = WxNo; f.member_list = string.Empty; var group = user.Groups.FirstOrDefault(z => z.wxid == f.wxid); if (group == null) { //群不存在,去获取群成员信息 nmCore.NM_GetGroupMember(ConnId, f.wxid); group = new GroupInfo() { wxid = f.wxid, nickname = f.nickname, avatar = f.avatar, total_member = f.member_list.Length, friends = new List() }; user.Groups.Add(group); } else group.total_member = f.member_list.Length; var friend = user.Friends.FirstOrDefault(z => z.wxid == f.wxid); if (friend == null) user.Friends.Add(f); } else if (List != 2) { var f = new FriendInfo(); f.wxid = Wxid; //f.account = item["account"]?.ToString(); f.nickname = Nick;//item["nickname"]?.ToString(); f.remark = Mark;//item["remark"]?.ToString(); f.avatar = HeadIMG;//item["avatar"]?.ToString(); //f.sex = int.Parse(item["sex"]?.ToString()); //f.city = item["city"]?.ToString(); var friend = user.Friends.FirstOrDefault(z => z.wxid == f.wxid); if (friend == null) user.Friends.Add(f); } } } } } catch (Exception ex) { LogHelper.GetSingleObj().Error(new StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } private static void Event_SelectTalker(int connId, JObject recvJson) { //throw new NotImplementedException(); } private static void Event_RecvMsg(int _dwClientid, JObject RecvJson) { try { var dwClientid = (uint)_dwClientid; //NMHelper.nmMsgInfo MsgInfo = new NMHelper.nmMsgInfo(); var recv_wxid = nmHeler.Json_GetString(RecvJson, "RecvWxid", true);//机器人账号 var wx_type = nmHeler.Json_GetIntEx(RecvJson, "Type"); var State = nmHeler.Json_GetIntEx(RecvJson, "State"); var Time = nmHeler.Json_GetIntEx(RecvJson, "Time"); var IsSend = nmHeler.Json_GetIntEx(RecvJson, "Sender"); var LocalMsgID = nmHeler.Json_GetIntEx(RecvJson, "LocalID"); var ServerMsgID = nmHeler.Json_GetString(RecvJson, "ServerID", false); var Wxid_1 = nmHeler.Json_GetString(RecvJson, "Wxid_1", true);//发送者的账号 //to_wxid 为群的时候 为群号 var Nick_1 = nmHeler.Json_GetString(RecvJson, "Nick_1", true);//发送者的昵称 var Wxid_2 = nmHeler.Json_GetString(RecvJson, "Wxid_2", true); //群内发送人的账号 var Nick_2 = nmHeler.Json_GetString(RecvJson, "Nick_2", true);//发送者的昵称 var raw_msg = nmHeler.Json_GetString(RecvJson, "Msg", true); var Source = nmHeler.Json_GetString(RecvJson, "Source", true); var socketClient = EasySoc.GetSocket(); if (wx_type == 1) { if (Common.IsGzh(Wxid_1, WechatClient.IsGzh)) return; Assistance ass = null; if (IsSend == 1) { var from_qun = Wxid_1.Contains("@chatroom"); var from_wxid = from_qun ? Wxid_2 : Wxid_1; if (from_qun && string.IsNullOrWhiteSpace(Wxid_2)) return; if (!WechatClient.IsAuxiliaryInput(recv_wxid, from_qun ? Wxid_2 : Wxid_1, raw_msg)) { Console.WriteLine("此消息被过滤,因为是机器人自己发送的:" + raw_msg); return; } ass = WechatClient.IsAssistance(recv_wxid, Wxid_1.Contains("@chatroom") ? Wxid_2 : Wxid_1, dwClientid, WechatType.Dazong); // if (ass.type == WechatClient.AssistanceType.终止) return; } else { ass = WechatClient.IsAssistance(Wxid_1.Contains("@chatroom") ? Wxid_2 : Wxid_1, recv_wxid, dwClientid, WechatType.Dazong); } if (ass.type == WechatClient.AssistanceType.终止) return; WechatReceiveMsg wmsg = new WechatReceiveMsg(); wmsg.Cmd = PCRobotCMD.rcvTxt; wmsg.IsSend = ass.type == WechatClient.AssistanceType.辅助; wmsg.RobotUsername = ass.robotName; wmsg.RobotUsernick = ass.robotNick; wmsg.RobotType = RobotType.客户端微信; wmsg.FromMessageType = WechatMsgType.文本; if (Wxid_1.Contains("@chatroom")) { wmsg.FromGroupid = Wxid_1; wmsg.FromUsername = Wxid_2; wmsg.FromUsernick = Nick_1 == ass.robotName ? ass.robotNick : string.Empty; } else { wmsg.FromUsername = ass.fromName; wmsg.FromUsernick = ass.fromNick; } wmsg.FromMessage = raw_msg; socketClient.Send(wmsg); } if (wx_type == 3 || wx_type == 34 || wx_type == 43 || wx_type == 49)//图片、语音、视频、文件 { var ass = WechatClient.IsAssistance(Wxid_1.Contains("@chatroom") ? Wxid_2 : Wxid_1, recv_wxid, dwClientid, WechatType.Dazong); if (ass.type == WechatClient.AssistanceType.终止) return; WechatReceiveMsg msg = new WechatReceiveMsg(); msg.Cmd = PCRobotCMD.rcvFile; msg.IsSend = false; if (wx_type == 3)//|| wx_type == 43)//图片 { //string FileData = nmHeler.Json_GetString(RecvJson, "File", false); //if (FileData != string.Empty) //{ // byte[] FileBytes = Convert.FromBase64String(FileData); // string FilePath = nmHeler.SaveFile(recv_wxid, Wxid_1, (wx_type == 3 ? "IMAGE" : "VOICE"), ServerMsgID, (wx_type == 3 ? "jpg" : "silk"), FileBytes); // msg.Cmd = PCRobotCMD.rcvImg; // msg.IsSend = ass.type == WechatClient.AssistanceType.辅助; // var path = Common.CacheFilePath(ass.robotName, ass.fromName, "IMAGE", ServerMsgID, "jpg"); // msg.FromMessage = $"[图片={path}]"; // msg.FromUsername = ass.fromName; // msg.FromUsernick = string.Empty;//没有获取昵称 // msg.FromMessageType = WechatMsgType.图片; // msg.FileCDNXML = raw_msg; //} //else return; } else if (wx_type == 34)//语音 { //msg.FromMessage = string.Empty;//$"[语音={FilePath}]";//TODO 语音文件 //msg.FromMessageType = WechatMsgType.语音; return; } else if (wx_type == 43)//视频 { //var video = data["video"].ToString(); //msg.FromMessage = $"[视频={video}]"; //msg.FromMessageType = WechatMsgType.视频; return; } else if (wx_type == 49)//文件/小程序 { //msg.FromMessage = string.Empty;//$"[文件={FilePath}]";//TODO 文件 //msg.FromMessageType = WechatMsgType.文件; //转账自动收款 if (IsSend == 0 && raw_msg.IndexOf("微信转账") != -1 && raw_msg.IndexOf("收到转账") != -1) { string state = Common.StringMid(raw_msg, "", ""); string Transid = Common.StringMid(raw_msg, "transferid>"); int dwTime = 0; int.TryParse(Common.StringMid(raw_msg, ""), out dwTime); if (state == "1" && Transid != string.Empty) { WechatReicevePay reicevePay = new WechatReicevePay(); var user = WechatClient.GetUser(dwClientid, WechatType.Dazong); if (user == null) return; reicevePay.RobotUsername = user.Wxid; reicevePay.RobotUsernick = user.Nickname; reicevePay.RobotType = RobotType.客户端微信; reicevePay.FromUsername = recv_wxid; reicevePay.FromUsernick = string.Empty;//没有获取昵称 reicevePay.Cmd = PCRobotCMD.receivePay; reicevePay.Invalidtime = dwTime.ToString(); reicevePay.Transferid = Transid; var reg = Regex.Match(raw_msg, "收到转账(?<金额>.+)元"); if (reg.Success) reicevePay.Money = double.Parse(reg.Groups["金额"].Value); if (reicevePay.RobotUsernick == null) reicevePay.RobotUsernick = string.Empty; socketClient.Send(reicevePay); return; } } else if (raw_msg.Trim().Contains(" var reg = Regex.Match(raw_msg, @"content=""(?<申请文本>[^""]*?)"""); if (reg.Success) wXApply.Message = reg.Groups["申请文本"].Value; reg = Regex.Match(raw_msg, @"sourceusername=""(?<账号>[^""]*?)"" sourcenickname=""(?<昵称>[^""]*?)"""); if (reg.Success) { wXApply.OldFriendWxid = reg.Groups["账号"].Value; wXApply.OldFriendNick = reg.Groups["昵称"].Value; } reg = Regex.Match(raw_msg, @"fromusername=""(?<账号>[^""]*?)"""); if (reg.Success) { if (!string.IsNullOrWhiteSpace(reg.Groups["账号"].Value)) wXApply.NewFriendWxid = reg.Groups["账号"].Value; else { reg = Regex.Match(raw_msg, @"alias=""(?<账号>[^""]*?)"""); if (reg.Success) wXApply.NewFriendWxid = reg.Groups["账号"].Value; } } reg = Regex.Match(raw_msg, @"fromnickname=""(?<昵称>[^""]*?)"""); if (reg.Success) wXApply.NewFriendNick = reg.Groups["昵称"].Value; wXApply.Token = raw_msg;//这里好像要获取raw_msg 中 v1的值 socketClient.Send(wXApply); } if (wx_type == 10000) { //新人入群 if (!string.IsNullOrWhiteSpace(Wxid_1) && Wxid_1.Contains("@chatroom")) { var reg1 = Regex.Match(raw_msg, @"""(?<邀请人昵称>.*)""邀请""(?<新人昵称>.*)""加入了群聊"); var reg2 = Regex.Match(raw_msg, @"你邀请""(?<新人昵称>.*)""加入了群聊"); var reg3 = Regex.Match(raw_msg, @"""(?<新人昵称>.*)""通过扫描""(?<邀请人昵称>.*)""分享的二维码加入群聊"); var reg4 = Regex.Match(raw_msg, @"""(?<新人昵称>.*)""通过扫描你分享的二维码加入群聊"); if (reg1.Success || reg2.Success || reg3.Success || reg4.Success) { var user = WechatClient.GetUser(dwClientid, WechatType.Dazong); if (user == null) return; WechatNewMemer newMember = new WechatNewMemer(); newMember.Cmd = PCRobotCMD.newMember; newMember.RobotType = RobotType.客户端微信; newMember.RobotUsername = user.Wxid; newMember.RobotUsernick = user.Nickname; if (reg1.Success) { newMember.SourceNick = reg1.Groups["邀请人昵称"].Value; newMember.MemberNick = reg1.Groups["新人昵称"].Value; } else if (reg2.Success) { newMember.SourceNick = newMember.RobotUsernick; newMember.MemberNick = reg2.Groups["新人昵称"].Value; } else if (reg3.Success) { newMember.SourceNick = reg3.Groups["邀请人昵称"].Value; newMember.MemberNick = reg3.Groups["新人昵称"].Value; } else if (reg4.Success) { newMember.SourceNick = newMember.RobotUsernick; newMember.MemberNick = reg4.Groups["新人昵称"].Value; } if (Wxid_1.Contains("@chatroom")) { newMember.GroupId = Wxid_1; newMember.GroupNick = string.Empty; } socketClient.Send(newMember); } } else//新增好友 { #region 添加好友成功 var reg1 = Regex.Match(raw_msg, "^你已添加了(.*?),现在可以开始聊天了。$"); var reg2 = Regex.Match(raw_msg, "^(.*?)刚刚把你添加到通讯录,现在可以开始聊天了。$"); if (reg1.Success || reg2.Success) { var user = WechatClient.GetUser(dwClientid, WechatType.Dazong); if (user == null) return; WechatNewFriend msg = new WechatNewFriend(); msg.Cmd = PCRobotCMD.newfriend; msg.RobotUsername = user.Wxid; msg.RobotUsernick = user.Nickname; msg.RobotType = RobotType.客户端微信; msg.FromUserName = Wxid_1; msg.FromUserNick = reg1.Success ? reg1.Groups[1].Value : reg2.Groups[1].Value; socketClient.Send(msg); } #endregion } } //自动填充消息内容,用于撤回消息 //if (chk_RevokeFill.Checked == true && MsgInfo.IsSend == 1 && ConnID == (int)User.DwClientId) //{ // text_Recvke_Wxid.Text = MsgInfo.Wxid_1; // text_Recvke_Sid.Text = MsgInfo.ServerMsgID; // text_Recvke_Message.Text = MsgInfo.Msg; //} ////转账自动收款 //if (chk_GetMoney.Checked == true && MsgInfo.IsSend == 0 && MsgInfo.Type == 49) //{ // if (MsgInfo.Msg.IndexOf("微信转账") != -1 && MsgInfo.Msg.IndexOf("收到转账") != -1) // { // string State = nmHeler.StringMid(MsgInfo.Msg, "", ""); // string Transid = nmHeler.StringMid(MsgInfo.Msg, "transferid>"); // int dwTime = 0; // int.TryParse(nmHeler.StringMid(MsgInfo.Msg, ""), out dwTime); // if (State == "1" && Transid != string.Empty) // { // nmCore.NM_GetMoney(ConnID, MsgInfo.Wxid_1, Transid, dwTime); // } // } //} ////名片消息自动填充数据 //if (chk_CardFill.Checked == true && MsgInfo.IsSend == 0 && MsgInfo.Type == 42 && ConnID == (int)User.DwClientId) //{ // string v1 = nmHeler.StringMid(MsgInfo.Msg, "username=\"", "\" nickname="); // string v2 = nmHeler.StringMid(MsgInfo.Msg, "antispamticket=\"", "\" /"); // text_Friend_v1.Text = v1; // text_Friend_v2.Text = v2; //} ////自动接受群聊邀请 //if (chk_PassInvite.Checked == true && MsgInfo.IsSend == 0 && MsgInfo.Type == 49) //{ // if (MsgInfo.Msg.IndexOf("邀请你加入群聊") != -1 && MsgInfo.Msg.IndexOf("mmsupport-bin/addchatroombyinvite") != -1) // { // string InviteURL = nmHeler.StringMid(MsgInfo.Msg, ""); // if (InviteURL != string.Empty) // { // nmCore.NM_GetA8Key(ConnID, MsgInfo.Wxid_1, InviteURL); // } // } //} } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } private static void Event_Logout(int ConnID, JObject recvJson) { try { var user = WechatClient.Users.FirstOrDefault(f => f.Value.DwClientId == ConnID).Value; if (user != null) WechatClient.RemoveUser(user); if (WechatClient.IsDebug) { LogHelper.GetSingleObj().Info("系统", $"LogOut_DaZong事件退出,Uin:{user.Uin},微信:{user.Nickname}({user.Wxid})"); LogHelper.GetSingleObj().Debug("调试注销", $"{user.Wxid}"); } } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } private static HandleResult OnAccept(IServer sender, IntPtr connId, IntPtr pClient) { nmCore.NM_Init((int)connId, "C#-864631110"); return HandleResult.Ok; } private static string DllPath; public override string GetVersion() { return Version; } public static uint StartWechat() { try { var path = string.Empty; var WechatWinFile = CsharpHttpHelper.HttpExtend.MapFile("WeChatWin.dll", $"PCWechat\\" + Version); var md5 = Common.GetMD5Hash(WechatWinFile); if (!File.Exists(WechatWinFile) || md5 != PcMd5.ToUpper()) { 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; } //path = CsharpHttpHelper.HttpExtend.MapFile("WeChat.exe", $"PCWechat\\" + Version); path = HttpExtend.MapPath($"PCWechat\\" + Version); string szDllPath = System.IO.Directory.GetCurrentDirectory() + "\\Bin\\" + NanMuCore; var dwPid = NMHelper.NM_CreateWeChatProcess(path, "WeChat.exe", szDllPath, nmHeler.Socket_Port); return (uint)dwPid; } catch (Exception ex) { } return 0; } public override void GetGroupAndFriendInfo(string groupId, string wxid) { try { GroupInfo group = null; if (groupId.Contains("@chatroom")) { var g = User.Groups.FirstOrDefault(f => f.wxid == groupId); if (g != null) { var u = g.friends.FirstOrDefault(f => f.wxid == wxid); if (u != null) group = new GroupInfo() { wxid = groupId, friends = new List() { u }, total_member = g.total_member }; } if (group == null) { nmCore.NM_GetWxidInfo((int)User.DwClientId, groupId, wxid); var _group = Task.Factory.StartNew(delegate () { DateTime end_time = DateTime.Now.AddSeconds(5); do { g = User.Groups.FirstOrDefault(f => f.wxid == groupId); if (g != null) { var u = g.friends.FirstOrDefault(f => f.wxid == wxid); if (u != null) { group = new GroupInfo() { wxid = groupId, friends = new List() { u }, total_member = g.total_member }; return group; } } Thread.Sleep(200); } while (end_time > DateTime.Now); return null; }).Result; } } var socketClient = EasySoc.GetSocket(); var msg = new WechatContact(); msg.RobotUsername = User.Wxid; msg.RobotUsernick = User.Nickname; msg.RobotType = RobotType.客户端微信; msg.MsgId = ServerMsgID; msg.Cmd = PCRobotCMD.rcvContact; msg.Message = group == null ? string.Empty : HttpHelper.ObjectToJson(group); socketClient.Send(msg); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } /// /// 获取朋友圈 /// /// public override void FindCircles(string circleId, string username) { try { var socketClient = EasySoc.GetSocket(); var msg = new CommonResult(); msg.RobotUsername = User.Wxid; msg.RobotUsernick = User.Nickname; msg.RobotType = RobotType.客户端微信; msg.MsgId = ServerMsgID; msg.Cmd = PCRobotCMD.rcvCircleData; msg.Data = string.Empty; socketClient.Send(msg); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } public override void CreateRoom(string wxidData) { try { var socketClient = EasySoc.GetSocket(); var msg = new CreateRoom(); msg.RobotUsername = User.Wxid; msg.RobotUsernick = User.Nickname; msg.RobotType = RobotType.客户端微信; msg.MsgId = ServerMsgID; msg.Cmd = PCRobotCMD.rcvCreateRoom; msg.GroupId = string.Empty; msg.MemberTotal = 0; socketClient.Send(msg); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } /// /// 自动授权登录小程序 /// /// public override void AutoAuthMiniAPPLogin(string appid) { try { var socketClient = EasySoc.GetSocket(); var msg = new CommonResult(); msg.RobotUsername = User.Wxid; msg.RobotUsernick = User.Nickname; msg.RobotType = RobotType.客户端微信; msg.MsgId = ServerMsgID; msg.Cmd = PCRobotCMD.rcvMiniAppCode; msg.Data = string.Empty; socketClient.Send(msg); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } /// /// 发送朋友圈 /// /// public override void SendCircle(string xmlmsg) { try { var socketClient = EasySoc.GetSocket(); var msg = new CommonResult(); msg.RobotUsername = User.Wxid; msg.RobotUsernick = User.Nickname; msg.RobotType = RobotType.客户端微信; msg.MsgId = ServerMsgID; msg.Cmd = PCRobotCMD.rcvCircleReturnId; msg.Data = string.Empty; socketClient.Send(msg); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } finally { User.SendCircleId = string.Empty; } } public override void CircleUpLoadImage(string path) { try { var socketClient = EasySoc.GetSocket(); var msg = new CommonResult(); msg.RobotUsername = User.Wxid; msg.RobotUsernick = User.Nickname; msg.RobotType = RobotType.客户端微信; msg.MsgId = ServerMsgID; msg.Cmd = PCRobotCMD.rcvCircleUploadImageUrl; msg.Data = string.Empty; socketClient.Send(msg); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } public override void GetGroupAndFriendInfo(string groupId, string wxid, bool flush = false) { try { GroupInfo group = null; if (groupId.Contains("@chatroom")) { var g = User.Groups.FirstOrDefault(f => f.wxid == groupId); if (g != null) { if (flush) { g.friends.Clear(); } else { var u = g.friends.FirstOrDefault(f => f.wxid == wxid); if (u != null) group = new GroupInfo() { wxid = groupId, friends = new List() { u }, total_member = g.total_member }; } } if (group == null) { nmCore.NM_GetWxidInfo((int)User.DwClientId, groupId, wxid); var _group = Task.Factory.StartNew(delegate () { DateTime end_time = DateTime.Now.AddSeconds(5); do { g = User.Groups.FirstOrDefault(f => f.wxid == groupId); if (g != null) { var u = g.friends.FirstOrDefault(f => f.wxid == wxid); if (u != null) { group = new GroupInfo() { wxid = groupId, friends = new List() { u }, total_member = g.total_member }; return group; } } Thread.Sleep(200); } while (end_time > DateTime.Now); return null; }).Result; } } var socketClient = EasySoc.GetSocket(); var msg = new WechatContact(); msg.RobotUsername = User.Wxid; msg.RobotUsernick = User.Nickname; msg.RobotType = RobotType.客户端微信; msg.MsgId = ServerMsgID; msg.Cmd = PCRobotCMD.rcvContact; msg.Message = group == null ? string.Empty : HttpHelper.ObjectToJson(group); socketClient.Send(msg); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } public override void AgreeAddMe(string text) { try { nmCore.NM_PassApply((int)User.DwClientId, text); } 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.Dazong).Value; if (v != null) { LogHelper.GetSingleObj().Info("系统", $"CloseWechatDaZong事件退出,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); } } public override void DeleteFriend(string wxid) { nmCore.NM_DelFriend((int)User.DwClientId, wxid); } public override void EditCotacts(string wxid, string remark) { nmCore.NM_SetFriendMark((int)User.DwClientId, wxid, remark); } public override void GetGroupsNotInMember() { GetContact(); var result = Task.Factory.StartNew(delegate () { Thread.Sleep(4000); var groups = User.Friends.Where(f => f.wxid.Contains("@chatroom")).ToList(); return groups == null ? string.Empty : HttpHelper.ObjectToJson(new Dictionary>() { { "data", groups } }); }).Result; if (result == null) result = HttpHelper.ObjectToJson(new Dictionary>() { { "data", User.Friends.Where(f => f.wxid.Contains("@chatroom")).ToList() } }); var socketClient = EasySoc.GetSocket(); var msg = new WechatContact(); msg.RobotUsername = User.Wxid; msg.RobotUsernick = User.Nickname; msg.RobotType = RobotType.客户端微信; msg.MsgId = ServerMsgID; msg.Cmd = PCRobotCMD.rcvContactList; msg.Message = result; socketClient.Send(msg); } public override void PayTransferConfirm(string data) { try { var transferid = string.Empty; var invalidtime = string.Empty; var wxid = string.Empty; var dic = HttpExtend.JsonToDictionary(data); if (dic.ContainsKey("Transferid")) transferid = dic["Transferid"].ToString(); if (dic.ContainsKey("Invalidtime")) invalidtime = dic["Invalidtime"].ToString(); if (dic.ContainsKey("WxId")) wxid = dic["WxId"].ToString(); nmCore.NM_GetMoney((int)User.DwClientId, wxid, transferid, int.Parse(invalidtime)); } 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 { nmCore.NM_SendFileMsg((int)User.DwClientId, NMHelper.NM_SendFile, wxid, file); Common.SetCache(User.Wxid, wxid, file); } 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 { if (card_wxid.Contains("@chatroom")) nmCore.NM_InviteToGroup((int)User.DwClientId, NMHelper.NM_InviteURL, card_wxid, new string[] { to_wxid }); else nmCore.NM_SendCardMsg((int)User.DwClientId, to_wxid, card_wxid); Common.SetCache(User.Wxid, to_wxid, card_wxid); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } public override void SendImage(string wxid, string file) { try { 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, wxid, "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 { } } } nmCore.NM_SendFileMsg((int)User.DwClientId, file.Trim().EndsWith(".gif", StringComparison.CurrentCultureIgnoreCase) ? NMHelper.NM_SendGif : NMHelper.NM_SendPic, wxid, file); Common.SetCache(User.Wxid, wxid, file); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } public override void CheckUrl(string url) { try { var socketClient = EasySoc.GetSocket(); var msg = new CheckUrl(); msg.RobotUsername = User.Wxid; msg.RobotUsernick = User.Nickname; msg.RobotType = RobotType.客户端微信; msg.MsgId = ServerMsgID; msg.Cmd = PCRobotCMD.rcvCheckUrl; msg.Status = 0; socketClient.Send(msg); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } public override void SendMessage(string wxid, string message) { try { var json = string.Empty; message = message.Replace("\r\n", "\n"); if (Common.isXML(message)) { //小程序 if (Regex.IsMatch(message, @"(?[^<]+)") || Regex.IsMatch(message, @"(.+?)")) nmCore.NM_SendWeChatApp((int)User.DwClientId, wxid, message, string.Empty);//TODO 小程序未实现 else nmCore.NM_SendURLMsg((int)User.DwClientId, wxid, message); } else nmCore.NM_SendTextMsg((int)User.DwClientId, wxid, new string[] { }, message); Common.SetCache(User.Wxid, wxid, message); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } public override void SendVideo(string wxid, string path) { try { SendFile(wxid, path); Common.SetCache(User.Wxid, wxid, path); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } public override void StateOpt(string wxid, int status) { try { nmCore.NM_StateOpt((int)User.DwClientId, 2, wxid, status == 1); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } public override void GetWxidInfo(string wxid) { var u = User.Friends.FirstOrDefault(f => f.wxid == wxid); if (u == null) { nmCore.NM_GetWxidInfo((int)User.DwClientId, string.Empty, wxid); var friend = Task.Factory.StartNew(delegate () { DateTime end_time = DateTime.Now.AddSeconds(15); do { u = User.Friends.FirstOrDefault(f => f.wxid == wxid); if (u != null) return u; Thread.Sleep(200); } while (end_time > DateTime.Now); return null; }).Result; } var socketClient = EasySoc.GetSocket(); WechatContact msg = new WechatContact(); msg.RobotUsername = User.Wxid; msg.RobotUsernick = User.Nickname; msg.RobotType = RobotType.客户端微信; msg.MsgId = ServerMsgID; msg.Cmd = PCRobotCMD.rcvContact; msg.Message = u == null ? string.Empty : HttpHelper.ObjectToJson(u); socketClient.Send(msg); } public override void GetFriend(string wxid) { nmCore.NM_GetWxidInfo((int)User.DwClientId, string.Empty, wxid); } public override void GetGroupMemer(string groupId) { try { nmCore.NM_GetGroupMember((int)User.DwClientId, groupId); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } /// /// 卸载安装 /// public static void UnInstall() { try { HP_Server?.Destroy(); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } public override void GetContact() { try { //获取好友列表(数据库读取) nmCore.NM_GetContactList((int)User.DwClientId); } catch (Exception ex) { LogHelper.GetSingleObj().Error(new StackTrace().GetFrame(0).GetMethod().Name, ex.Message); } } } }