using Chat.Framework.PCRobotSDK; using Chat.Framework.PCRobotSDK.WechatEvents; using Chat.Framework.Utils; using Chat.Framework.WXSdk.Events; using Chat.Framework.WXSdk.HOOK; using CsharpHttpHelper; using Newtonsoft.Json; using PCRobot.Pack; 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.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using UI.Framework.Tools; using static Chat.Framework.Utils.Common; namespace Chat.Framework.WXSdk.Implement { /// /// 普通PC机器人 /// public class WXClientImpl_HOOK : WeixinBase { /// /// 上次心跳时间 /// public DateTime HeartBreakTime { get; internal set; } = DateTime.MinValue; public WXClientImpl_HOOK(string weixinhao, string usernick, long uin = -1) { WeixinType = WeixinType.Hook微信; WeixinHao = weixinhao; User = new WeixinBaseUser(WeixinHao, usernick, uin); Friends = new Dictionary(); GroupMembers = new Dictionary(); HeartBreakTime = DateTime.Now; //LogHelper.GetSingleObj().Info("", $"初始化HeartBreakTime = {HeartBreakTime} ,Uin:{uin}, {usernick}({weixinhao})"); RequestContact(); ChangeStatus(WxStatus.在线); } // HeadPack_Hook headPack = null; public void Dispose() { if (this.User != null && this.User.Uin != 0 && this.User.Uin != -1) Grant.Framework.GrantClient.Get().LoginOut(this.User.Uin.ToString(), int.Parse(WXClientTool.auth_info[0])); } /// /// pc普通微信状态改变 /// /// 状态 /// 事件 /// 没用 public override void ChangeStatus(WxStatus status, WXChangeStatus e = null, bool is_next = true) { if (status == WxStatus.已掉线 || status == WxStatus.已退出 || status == WxStatus.未登录 || status == WxStatus.登录失败) { if (this.User != null && this.User.Uin != 0 && this.User.Uin != -1) Grant.Framework.GrantClient.Get().LoginOut(this.User.Uin.ToString(), int.Parse(WXClientTool.auth_info[0])); } if (status == WxStatus.在线) { if (!Grant.Framework.GrantClient.Get().IsExistCustomers(User.Uin.ToString(), int.Parse(WXClientTool.auth_info[0]))) { try { //var ss = ChatClient.WXClient; if (User.Uin.ToString() != "0" && User.Uin.ToString() != "-1") { ChatClient.Events.OnEvent(new WXRefreshUser(this)); var c = Grant.Framework.GrantClient.Get().Login(User.Uin.ToString(), User.Nick, int.Parse(WXClientTool.auth_info[0]), WXClientTool.auth_info[1]); } } catch (Exception ex) { var wx = ChatClient.WXClient.FirstOrDefault(f => f.Key == WeixinHao).Value; if (wx == null) ChatClient.UpdateWXClient(this); ChatClient.Events.OnEvent(new WXWriteLog(this) { Message = $"【{User.Uin}({User.Nick})】授权异常:" + ex.Message }); status = WxStatus.登录失败; Dispose(); ChatClient.LoginOutWeixin(WeixinHao, $"【{User.Uin}({User.Nick})】{ex.Message}"); } } } else { ChatClient.LoginOutWeixin(WeixinHao); LogHelper.GetSingleObj().Debug("", $"微信状态修改:{this.WeixinHao} - {status}"); } base.ChangeStatus(status, e); } public Process Process { get; private set; } public override void ShowLogin() { throw new Exception("请在易转发,客户端执行登陆!"); } /// /// 获得好友或群组信息 /// public override Friend GetContact(string wxid, bool refresh = false) { try { if (refresh || !Friends.ContainsKey(wxid)) { lock (this.Friends) { var msg_id = GetWxidInfo(wxid); if (!string.IsNullOrEmpty(msg_id)) { var rst = ChatClient.PCRobotPool.PackHist.GetResult(msg_id).Result; if (rst != null) { //{"wxid":"17565003780@chatroom","account":null,"nickname":"群名","avatar":"http://wx.qlogo.cn/mmcrhead/jRoggJ2RF3DSGEj42ibiaTuJExRwM/0","sex":0,"country":null,"province":null,"city":null,"manager_wxid":"wxid_vv722","is_manager":0,"member_list":"wxid_vv722,ws2d76,wxid_jgpp6xc522,wxid_eywrcm0w22"} try { var contact = rst as WechatContact; if (!string.IsNullOrWhiteSpace(contact.Message)) { var data = @"{""data"":" + contact.Message + "}"; var _result = CsharpHttpHelper.HttpExtend.JsonToDictionary(data); if (_result != null) { var result = _result["data"] as Dictionary; var _wxid = result["wxid"]?.ToString(); var account = result["account"]?.ToString(); var nickname = result["nickname"]?.ToString(); var remark = result["remark"]?.ToString(); var sex = int.Parse(result["sex"]?.ToString()); var avatar = result["avatar"]?.ToString(); var manager_wxid = result["manager_wxid"]?.ToString(); var is_zombie = result["is_zombie"]?.ToString();//等于-1为没有检测,等于0为正常用户,1,2为拉黑用户 Friends[_wxid] = new Friend() { SmallHeadImgUrl = avatar, BigHeadImgUrl = avatar, City = string.Empty, Sex = sex, NickName = nickname, Remark = remark, UserName = _wxid, Alias = _wxid, ExtInfo = string.Empty, Province = string.Empty, ChatRoomOwner = manager_wxid, ChatroomVersion = string.Empty, Ticket = is_zombie }; } } } catch (Exception ex) { this.WriteLog($"获取Contact异常:" + ex.Message + " - " + ex.StackTrace); } } } } } if (Friends.ContainsKey(wxid)) return Friends[wxid]; else { var f = ChatClient.GetDBWechatFriend(wxid); if (f != null) Friends[wxid] = f; return f == null ? new Friend() { UserName = wxid, Alias = wxid } : f; } } catch (Exception ex) { this.WriteLog($"{ex.Message}"); } return new Friend() { UserName = wxid, Alias = wxid }; } #region xx private readonly object GroupMemberLock = new object(); private readonly object FriendsLock = new object(); Action FriendsAction; private void GetFriends(string friendsJson) { try { lock (FriendsLock) { #region var dic = HttpExtend.JsonToDictionary(friendsJson); if (dic != null && dic.ContainsKey("data")) { var data = dic["data"] as ArrayList; foreach (Dictionary item in data) { var account = item["account"]?.ToString(); var avatar = item["avatar"]?.ToString(); var city = item["city"]?.ToString(); var country = item["country"]?.ToString(); var nickname = item["nickname"]?.ToString(); var province = item["province"]?.ToString(); var remark = item["remark"]?.ToString(); var sex = int.Parse(item["sex"]?.ToString()); var wxid = item["wxid"]?.ToString(); var manager_wxid = item["manager_wxid"]?.ToString(); var is_manager = int.Parse(item["is_manager"].ToString()); var is_zombie = item["is_zombie"]?.ToString();//等于-1为没有检测,等于0为正常用户,1,2为拉黑用户 if (Friends.ContainsKey(wxid)) { Friends[wxid].Ticket = is_zombie; } else { Friends[wxid] = new Friend() { SmallHeadImgUrl = avatar, BigHeadImgUrl = avatar, City = string.Empty, Sex = sex, NickName = nickname, Remark = remark, UserName = wxid, Alias = wxid, ExtInfo = string.Empty, Province = string.Empty, ChatRoomOwner = manager_wxid, ChatroomVersion = string.Empty, Ticket = is_zombie }; } } } #endregion } } catch (Exception ex) { } } //Action GroupMembersAction; //private void GetGroupMembers(string friendsJson) //{ // try // { // lock (GroupMemberLock) // { // #region // var dic = HttpExtend.JsonToDictionary(friendsJson); // if (dic != null && dic.ContainsKey("data")) // { // var data = dic["data"] as Dictionary; // var total_member = int.Parse(data["total_member"].ToString()); // var gId = data["wxid"].ToString(); // var list = data["member_list"] as ArrayList; // List groups = null; // if (GroupMembers.ContainsKey(gId)) // groups = GroupMembers[gId].ToList(); // else // groups = new List(); // foreach (Dictionary item in list) // { // var account = item["account"]?.ToString(); // var avatar = item["avatar"]?.ToString(); // var city = item["city"]?.ToString(); // var country = item["country"]?.ToString(); // var nickname = item["nickname"]?.ToString(); // var province = item["province"]?.ToString(); // var remark = item["remark"]?.ToString(); // var sex = int.Parse(item["sex"]?.ToString()); // var wxid = item["wxid"]?.ToString(); // if (groups.FirstOrDefault(f => f.Username == wxid) == null) // groups.Add(new GroupMember() { SmallHeadImgUrl = avatar, BigHeadImgUrl = avatar, Groupid = gId, Username = wxid, NickName = nickname }); // } // GroupMembers[gId] = groups.ToArray(); // } // #endregion // } // } // catch (Exception ex) // { } //} #endregion /// /// 好友列表 /// public Dictionary Friends { get; private set; } public override List FindFriends() { try { var msg_id = RequestContact(); if (!string.IsNullOrEmpty(msg_id)) { var rst = ChatClient.PCRobotPool.PackHist.GetResult(msg_id).Result; if (rst != null) { try { var commonResult = rst as CommonResult; if (commonResult != null) { var data = commonResult.Data; return JsonConvert.DeserializeObject>(data); } } catch (Exception ex) { this.WriteLog($"获取通讯录用户异常:" + ex.Message + " - " + ex.StackTrace); } } } } catch (Exception ex) { } return null; } /// /// 请求获取联系人 /// /// public string RequestContact() { try { WechatPack pack = new WechatPack(this); return pack.SendServer(PCRobotCMD.getContact); } catch (Exception ex) { } return string.Empty; } /// /// 检测僵尸(最后获取Friends集合,判断里面的Ticket的值不为空为僵尸) /// public void GetZombie() { try { WechatPack send = new WechatPack(this); send.SendServer(PCRobotCMD.getZombie); } catch (Exception) { } } /// /// 获取指定的群和用户 /// public string GetGroupWxidInfo(string groupId, string wxid) { try { WechatPack pack = new WechatPack(this); //类型:图片表示不刷新,文件表示刷新 return pack.SendServer(PCRobotCMD.getGroupWxidInfo, wxid, WechatMsgType.图片, groupId); } catch (Exception ex) { } return string.Empty; } // /// 获取指定的群和用户 /// public string GetGroupWxidInfo(string groupId, string wxid, bool flush) { try { WechatPack pack = new WechatPack(this); //类型:图片表示不刷新,文件表示刷新 return pack.SendServer(PCRobotCMD.getGroupWxidInfo, wxid, flush ? WechatMsgType.文件 : WechatMsgType.图片, groupId); } catch (Exception ex) { } return string.Empty; } /// /// 群-群成员缓存 /// public Dictionary GroupMembers { get; private set; } /// /// 获取群用户信息 /// /// /// /// public override GroupMember GetMember(string groupid, string wxid) { try { if (!GroupMembers.ContainsKey(groupid) || GroupMembers[groupid].FirstOrDefault(f => f.Username == wxid) == null) { var msg_id = GetGroupWxidInfo(groupid, wxid); //GetGroupInfo(groupid); if (!string.IsNullOrEmpty(msg_id)) { var rst = ChatClient.PCRobotPool.PackHist.GetResult(msg_id).Result; if (rst != null) { // try { //{"wxid":"18736590024@chatroom","nickname":null,"avatar":null,"total_member":88,"friends":[{"wxid":"wxid_vv7rev7a4xpj22","account":"MOKA_1314_","nickname":"A 小叮当21 - 不懂回复帮助","remark":"","avatar":"http://wx.qlogo.cn/mmhead/ver_1/UKuQPgzLzEY0UPqTgmqpSibLmx1BMibAlwJxOp4t8QksClGJP8tLHxUiaBDAax1Vf0Eiae6wKBIoT3ibAgOYTuuWiaVDiaiayiaaIZF46LcE5aBvTtSQ/132","sex":2,"country":"CN","province":"Sichuan","city":"Chengdu","manager_wxid":"","is_manager":0,"member_list":""}]} var contact = rst as WechatContact; if (!string.IsNullOrWhiteSpace(contact.Message)) { var data = @"{""data"":" + contact.Message + "}"; var _result = HttpExtend.JsonToDictionary(data); if (_result != null) { var result = _result["data"] as Dictionary; var gwxid = result["wxid"]?.ToString(); var total_member = result["total_member"]?.ToString(); var gnickname = result["nickname"]?.ToString(); var friend = (result["friends"] as ArrayList)[0] as Dictionary; if (friend != null) { var avatar = friend["avatar"]?.ToString(); var nickname = friend["nickname"]?.ToString(); var remark = friend["remark"]?.ToString(); var sex = int.Parse(friend["sex"]?.ToString()); //var user_id = friend["user_id"]?.ToString(); var manager_wxid = friend["manager_wxid"]?.ToString(); if (!GroupMembers.ContainsKey(gwxid)) { GroupMembers.Add(gwxid, new GroupMember[] { }); } var gm = GroupMembers[gwxid].ToList(); if (gm.FirstOrDefault(f => f.Username == wxid) == null) { gm.Add(new GroupMember() { SmallHeadImgUrl = avatar, BigHeadImgUrl = avatar, Groupid = gwxid, Username = wxid, NickName = nickname }); GroupMembers[gwxid] = gm.ToArray(); } } } } } catch (Exception ex) { this.WriteLog($"获取Member异常:" + ex.Message + " - " + ex.StackTrace); } } } } if (!GroupMembers.ContainsKey(groupid)) GroupMembers[groupid] = new GroupMember[] { new GroupMember() { Groupid = groupid, Username = wxid } }; else { var member = GroupMembers[groupid].FirstOrDefault(f => f.Username == wxid); if (member == null) { var gm = GroupMembers[groupid].ToList(); gm.Add(new GroupMember() { Groupid = groupid, Username = wxid }); GroupMembers[groupid] = gm.ToArray(); } } return GroupMembers[groupid].FirstOrDefault(f => f.Username == wxid); } catch (Exception ex) { this.WriteLog($"获取群信息:{ex.Message}"); } return new GroupMember() { Groupid = groupid, Username = wxid }; } /// /// 获取群用户信息 /// /// /// /// public override GroupMember GetMember(string groupid, string wxid, bool flush = false) { try { if (flush || !GroupMembers.ContainsKey(groupid) || GroupMembers[groupid].FirstOrDefault(f => f.Username == wxid) == null) { var msg_id = GetGroupWxidInfo(groupid, wxid, flush); //GetGroupInfo(groupid); if (!string.IsNullOrEmpty(msg_id)) { var rst = ChatClient.PCRobotPool.PackHist.GetResult(msg_id).Result; if (rst != null) { // try { //{"wxid":"18736590024@chatroom","nickname":null,"avatar":null,"total_member":88,"friends":[{"wxid":"wxid_vv7rev7a4xpj22","account":"MOKA_1314_","nickname":"A 小叮当21 - 不懂回复帮助","remark":"","avatar":"http://wx.qlogo.cn/mmhead/ver_1/UKuQPgzLzEY0UPqTgmqpSibLmx1BMibAlwJxOp4t8QksClGJP8tLHxUiaBDAax1Vf0Eiae6wKBIoT3ibAgOYTuuWiaVDiaiayiaaIZF46LcE5aBvTtSQ/132","sex":2,"country":"CN","province":"Sichuan","city":"Chengdu","manager_wxid":"","is_manager":0,"member_list":""}]} var contact = rst as WechatContact; if (string.IsNullOrWhiteSpace(contact.Message)) return null; var data = @"{""data"":" + contact.Message + "}"; var _result = CsharpHttpHelper.HttpExtend.JsonToDictionary(data); if (_result == null) return null; var result = _result["data"] as Dictionary; var gwxid = result["wxid"]?.ToString(); var total_member = result["total_member"]?.ToString(); var gnickname = result["nickname"]?.ToString(); var friend = (result["friends"] as ArrayList)[0] as Dictionary; if (friend != null) { var avatar = friend["avatar"]?.ToString(); var nickname = friend["nickname"]?.ToString(); var remark = friend["remark"]?.ToString(); var sex = int.Parse(friend["sex"]?.ToString()); //var user_id = friend["user_id"]?.ToString(); var manager_wxid = friend["manager_wxid"]?.ToString(); if (!GroupMembers.ContainsKey(gwxid)) { GroupMembers.Add(gwxid, new GroupMember[] { }); } var gm = GroupMembers[gwxid].ToList(); var info = gm.FirstOrDefault(f => f.Username == wxid); if (info != null) { gm.Remove(info); info = null; } if (info == null) { gm.Add(new GroupMember() { SmallHeadImgUrl = avatar, BigHeadImgUrl = avatar, Groupid = gwxid, Username = wxid, NickName = nickname }); GroupMembers[gwxid] = gm.ToArray(); } } } catch (Exception ex) { this.WriteLog($"获取Member异常:" + ex.Message + " - " + ex.StackTrace); } } } } if (!GroupMembers.ContainsKey(groupid)) GroupMembers[groupid] = new GroupMember[] { new GroupMember() { Groupid = groupid, Username = wxid } }; else { var member = GroupMembers[groupid].FirstOrDefault(f => f.Username == wxid); if (member == null) { var gm = GroupMembers[groupid].ToList(); gm.Add(new GroupMember() { Groupid = groupid, Username = wxid }); GroupMembers[groupid] = gm.ToArray(); } } return GroupMembers[groupid].FirstOrDefault(f => f.Username == wxid); } catch (Exception ex) { this.WriteLog($"获取群信息:{ex.Message}"); } return null; } /// /// 创建群 /// /// 用户账号需要3个或者以上 /// public override string CreateChatRoom(string[] wxids) { try { if (wxids == null || wxids.Length == 0) return string.Empty; WechatPack pack = new WechatPack(this); var msg_id = pack.SendServer(PCRobotCMD.createRoom, string.Join(",", wxids)); if (!string.IsNullOrEmpty(msg_id)) { var rst = ChatClient.PCRobotPool.PackHist.GetResult(msg_id).Result; if (rst != null) { try { var createRoom = rst as CreateRoom; if (createRoom != null) return createRoom.GroupId; } catch (Exception ex) { this.WriteLog($"创建新群异常:" + ex.Message + " - " + ex.StackTrace); } } } } catch (Exception ex) { } return string.Empty; } /// /// 创建群 /// /// 用户账号用,分隔 /// public override string CreateChatRoom(string wxids) { try { if (string.IsNullOrWhiteSpace(wxids)) return string.Empty; WechatPack pack = new WechatPack(this); var msg_id = pack.SendServer(PCRobotCMD.createRoom, wxids); if (!string.IsNullOrEmpty(msg_id)) { var rst = ChatClient.PCRobotPool.PackHist.GetResult(msg_id).Result; if (rst != null) { try { var createRoom = rst as CreateRoom; if (createRoom != null) return createRoom.GroupId; } catch (Exception ex) { this.WriteLog($"创建新群异常:" + ex.Message + " - " + ex.StackTrace); } } } } catch (Exception ex) { } return string.Empty; } public override void AddChatRoomMember(string groupid, string members) { try { if (string.IsNullOrWhiteSpace(groupid)) return; WechatPack pack = new WechatPack(this); pack.SendServer(PCRobotCMD.inviteIntoGroup, groupid, WechatMsgType.文本, members); } catch (Exception ex) { } } public override void AddChatRoomMember_40Down(string groupid, string members) { try { if (string.IsNullOrWhiteSpace(groupid)) return; WechatPack pack = new WechatPack(this); pack.SendServer(PCRobotCMD.inviteIntoGroup_40Down, groupid, WechatMsgType.文本, members); } catch (Exception ex) { } } /// /// 获取群基本消息(不包含群成员) /// /// public override List GetGroupsNotInMember() { List friends = new List(); WechatPack pack = new WechatPack(this); var msg_id = pack.SendServer(PCRobotCMD.getGroupsNotInMember); if (!string.IsNullOrEmpty(msg_id)) { var rst = ChatClient.PCRobotPool.PackHist.GetResult(msg_id).Result; if (rst != null) { try { var contact = rst as WechatContact; var dic = HttpExtend.JsonToDictionary(contact.Message); if (dic != null && dic.ContainsKey("data")) { var data = dic["data"] as System.Collections.ArrayList; foreach (Dictionary item in data) { var account = item["account"]?.ToString(); var avatar = item["avatar"]?.ToString(); var city = item["city"]?.ToString(); var country = item["country"]?.ToString(); var nickname = item["nickname"]?.ToString(); var province = item["province"]?.ToString(); var remark = item["remark"]?.ToString(); var sex = int.Parse(item["sex"]?.ToString()); var wxid = item["wxid"]?.ToString(); var manager_wxid = item["manager_wxid"]?.ToString(); var is_manager = int.Parse(item["is_manager"].ToString()); var is_zombie = item["is_zombie"]?.ToString();//等于-1为没有检测,等于0为正常用户,1,2为拉黑用户 friends.Add(new Friend() { SmallHeadImgUrl = avatar, BigHeadImgUrl = avatar, City = string.Empty, Sex = sex, NickName = nickname, Remark = remark, UserName = wxid, Alias = wxid, ExtInfo = string.Empty, Province = string.Empty, ChatRoomOwner = manager_wxid, ChatroomVersion = string.Empty, Ticket = is_zombie }); } } } catch (Exception ex) { this.WriteLog($"获取群列表异常:" + ex.Message + " - " + ex.StackTrace); } } } return friends; } /// /// 检测URL在微信中是否有效 /// /// 要检查的链接 /// 返回true为连接没有屏蔽 public override bool CheckUrl(string url) { WechatPack pack = new WechatPack(this); var msg_id = pack.SendServer(PCRobotCMD.checkUrl, url); if (!string.IsNullOrEmpty(msg_id)) { var rst = ChatClient.PCRobotPool.PackHist.GetResult(msg_id).Result; if (rst != null) { try { var checkUrl = rst as CheckUrl; return (checkUrl != null && (checkUrl.Status == 0 || checkUrl.Status == -1)); } catch (Exception ex) { this.WriteLog($"检测链接是否被封异常:" + ex.Message + " - " + ex.StackTrace); } } } return false; } /// /// /// /// public override void OpenUrl(string url) { WechatPack pack = new WechatPack(this); var msg_id = pack.SendServer(PCRobotCMD.openUrl, url); } /// /// 清理历史聊天记录 /// public override void ClearChatHistoryMsg() { WechatPack pack = new WechatPack(this); pack.SendServer(PCRobotCMD.clearChatHistoryMsg); } /// /// 设置会话已读 /// public override void SetSessionReadedMsg(string wxid) { WechatPack pack = new WechatPack(this); pack.SendServer(PCRobotCMD.setSessionReadedMsg, wxid); } /// /// 修改群聊名称 /// /// 新的群名 /// 群id public override void SetRoomName(string new_name, string groupId) { WechatPack pack = new WechatPack(this); pack.SendServer(PCRobotCMD.setRoomName, new_name, tousername: groupId); } /// /// 修改群公告(可用于@全体) /// /// 新公告 /// 群聊wxid public override void SetRoomNotice(string notice, string groupId) { WechatPack pack = new WechatPack(this); pack.SendServer(PCRobotCMD.setRoomNotice, notice, tousername: groupId); } /// /// 设置自己在群中昵称 /// /// 要设置的昵称 /// 需要设置的群id public override void ModRoomMyName(string nickname, string groupId) { WechatPack pack = new WechatPack(this); pack.SendServer(PCRobotCMD.modRoomMyName, nickname, tousername: groupId); } /// /// 设置是否显示群成员昵称 /// /// true为开启 /// 要显示得到群 public override void SetRoomShowMemeberName(bool status, string groupId) { WechatPack pack = new WechatPack(this); pack.SendServer(PCRobotCMD.setRoomShowMemeberName, status.ToString(), tousername: groupId); } /// /// 修改群聊名称 /// /// 新名称 /// 群号 public override void ModRoomName(string newnick, string groupId) { WechatPack pack = new WechatPack(this); pack.SendServer(PCRobotCMD.modRoomName, newnick, tousername: groupId); } /// /// 是否消息免打扰 /// /// true为开启 /// wxid public override void SetRecvNotify(bool status, string wxid) { WechatPack pack = new WechatPack(this); pack.SendServer(PCRobotCMD.setRecvNotify, status.ToString(), tousername: wxid); } /// /// 关注公众号 /// /// 公众号wxid public override void AddPublicUser(string wxid) { WechatPack pack = new WechatPack(this); pack.SendServer(PCRobotCMD.addPublicUser, tousername: wxid); } /// /// 开启/关闭防撤回功能 /// /// 1是开启防撤回,0是关闭 public override void SetDisableRevoke(bool status) { WechatPack pack = new WechatPack(this); pack.SendServer(PCRobotCMD.setDisableRevoke, status.ToString()); } public override List> FindCircles() { return FindCircle(""); } public override List> FindCircle(string username, string firstPageMd5 = "", long MaxId = 0) { return FindCircle(username, MaxId.ToString()); } private List> FindCircle(string username, string firstPageMd5 = "", string circleId = "0") { WechatPack pack = new WechatPack(this); var msg_id = pack.SendServer(PCRobotCMD.findCircles, circleId, tousername: username); if (!string.IsNullOrEmpty(msg_id)) { var rst = ChatClient.PCRobotPool.PackHist.GetResult(msg_id).Result; if (rst != null) { try { var result = rst as CommonResult; if (result != null && !string.IsNullOrWhiteSpace(result.Data)) { //这里为了兼容性,将这里的数据改成ipad朋友圈返回的数据格式 #region 修正数据格式 var jsonDic = HttpExtend.JsonToDictionary(result.Data); var data = jsonDic["data"] as Dictionary; //var firstPageMd5 = data["firstPageMd5"].ToString(); //var data = new { FirFirstPageMd5 = firstPageMd5, SnsObjectsCount = long.Parse(HttpExtend.GetTimeStamp()), }; if (data.ContainsKey("objectList")) { var objectList = data["objectList"] as ArrayList; if (objectList != null && objectList.Count != 0) { List cirCleInfoList = new List(); for (int i = 0; i < objectList.Count; i++) { var obj = JsonConvert.SerializeObject(objectList[i]); if (obj != null) { var cInfo = JsonConvert.DeserializeObject(obj); if (cInfo != null) { var item = new CirCleInfo() { Id = cInfo.id, Username = cInfo.username, SnsObjectType = 45, Nickname = cInfo.nickname, CreateTime = cInfo.createTime, LikeFlag = cInfo.likeFlag, LikeCount = cInfo.likeCount, LikeUserListCount = cInfo.likeUserListCount, CommentCount = cInfo.commentCount, CommentUserListCount = cInfo.commentUserListCount, WithUserCount = cInfo.withUserCount, WithUserListCount = cInfo.withUserListCount, WithUserList = null, ExtFlag = cInfo.extFlag, NoChange = cInfo.noChange, GroupCount = cInfo.groupCount, GroupList = null, IsNotRichText = cInfo.isNotRichText, ReferUsername = cInfo.referUsername, ReferId = cInfo.referId, BlackListCount = cInfo.blackListCount, BlackList = null, DeleteFlag = cInfo.deleteFlag, GroupUserCount = cInfo.groupUserCount, GroupUser = null, ObjectOperations = null, SnsRedEnvelops = null }; if (cInfo.objectDesc != null) item.ObjectDesc = HttpHelper.Base64ToString(cInfo.objectDesc.buffer, Encoding.UTF8); if (cInfo.likeUserList != null) { List likeUList = new List(); foreach (var tmp in cInfo.likeUserList) { likeUList.Add(new LikeUserList() { CommentFlag = tmp.commentFlag, CommentId = tmp.commentId, CommentId2 = tmp.commentId2, Content = tmp.content, CreateTime = tmp.createTime, DeleteFlag = tmp.deleteFlag, IsNotRichText = tmp.isNotRichText, Nickname = tmp.nickname, ReplyCommentId = tmp.replyCommentId, ReplyCommentId2 = tmp.replyCommentId2, ReplyUsername = tmp.replyUsername, Source = tmp.source, Type = tmp.type, Username = tmp.username }); } item.LikeUserList = likeUList; } if (cInfo.commentUserList != null) { List commentUList = new List(); foreach (var tmp in cInfo.commentUserList) { commentUList.Add(new CommentUserList() { CommentFlag = tmp.commentFlag, CommentId = tmp.commentId, CommentId2 = tmp.commentId2, Content = tmp.content, CreateTime = tmp.createTime, DeleteFlag = tmp.deleteFlag, IsNotRichText = tmp.isNotRichText, Nickname = tmp.nickname, ReplyCommentId = tmp.replyCommentId, ReplyCommentId2 = tmp.replyCommentId2, ReplyUsername = tmp.replyUsername, Source = tmp.source, Type = tmp.type, Username = tmp.username }); } item.CommentUserList = commentUList; } cirCleInfoList.Add(item); } } } cirCleInfoList = cirCleInfoList.OrderByDescending(f => f.CreateTime).ToList(); List> _objs = new List>(); for (int i = 0; i < cirCleInfoList.Count; i++) { var tmp = HttpHelper.ObjectToJson(cirCleInfoList[i]); var dic = HttpExtend.JsonToDictionary(tmp); _objs.Add(dic); } return _objs; } } #endregion } } catch (Exception ex) { this.WriteLog($"获取朋友圈数据解析异常:" + ex.Message + " - " + ex.StackTrace); } } else { } } return new List>(); } /// /// 自动授权登录小程序 /// /// public override string AutoAuthMiniAPPLogin(string appid) { try { WechatPack pack = new WechatPack(this); var msg_id = pack.SendServer(PCRobotCMD.autoAuthMiniAPPLogin, appid); var rst = ChatClient.PCRobotPool.PackHist.GetResult(msg_id).Result; if (rst != null) { var result = rst as CommonResult; if (result != null && !string.IsNullOrWhiteSpace(result.Data)) { return result.Data; } } } catch (Exception ex) { this.WriteLog($"获取自动授权登录小程序解析异常:" + ex.Message + " - " + ex.StackTrace); } return string.Empty; } #region /// /// 点赞 /// private class LikeUserList { /// /// /// public string Username { get; set; } /// /// /// public string Nickname { get; set; } /// /// /// public int Source { get; set; } /// /// /// public int Type { get; set; } /// /// /// public string Content { get; set; } /// /// /// public int CreateTime { get; set; } /// /// /// public int CommentId { get; set; } /// /// /// public int ReplyCommentId { get; set; } /// /// /// public string ReplyUsername { get; set; } /// /// /// public int IsNotRichText { get; set; } /// /// /// public int ReplyCommentId2 { get; set; } /// /// /// public int CommentId2 { get; set; } /// /// /// public int DeleteFlag { get; set; } /// /// /// public int CommentFlag { get; set; } } /// /// 评价 /// private class CommentUserList { /// /// /// public string Username { get; set; } /// /// 先森吳 /// public string Nickname { get; set; } /// /// /// public int Source { get; set; } /// /// /// public int Type { get; set; } /// /// /// public string Content { get; set; } /// /// /// public int CreateTime { get; set; } /// /// /// public int CommentId { get; set; } /// /// /// public int ReplyCommentId { get; set; } /// /// /// public string ReplyUsername { get; set; } /// /// /// public int IsNotRichText { get; set; } /// /// /// public int ReplyCommentId2 { get; set; } /// /// /// public int CommentId2 { get; set; } /// /// /// public int DeleteFlag { get; set; } /// /// /// public int CommentFlag { get; set; } } /// /// 朋友圈信息 /// private class CirCleInfo { /// /// /// public decimal Id { get; set; } /// /// /// public string Username { get; set; } /// /// /// public int SnsObjectType { get; set; } /// /// /// public string Nickname { get; set; } /// /// /// public int CreateTime { get; set; } /// /// 13647904548865061200wxid_tnizkijej5uq221626957005看不懂不应该是常态吗[破涕为笑]0300002 /// public string ObjectDesc { get; set; } /// /// /// public int LikeFlag { get; set; } /// /// /// public int LikeCount { get; set; } /// /// /// public int LikeUserListCount { get; set; } /// /// /// public List LikeUserList { get; set; } /// /// /// public int CommentCount { get; set; } /// /// /// public int CommentUserListCount { get; set; } /// /// /// public List CommentUserList { get; set; } /// /// /// public int WithUserCount { get; set; } /// /// /// public int WithUserListCount { get; set; } /// /// /// public object WithUserList { get; set; } /// /// /// public int ExtFlag { get; set; } /// /// /// public int NoChange { get; set; } /// /// /// public int GroupCount { get; set; } /// /// /// public object GroupList { get; set; } /// /// /// public int IsNotRichText { get; set; } /// /// /// public string ReferUsername { get; set; } /// /// /// public int ReferId { get; set; } /// /// /// public int BlackListCount { get; set; } /// /// /// public object BlackList { get; set; } /// /// /// public int DeleteFlag { get; set; } /// /// /// public int GroupUserCount { get; set; } /// /// /// public object GroupUser { get; set; } /// /// /// public object ObjectOperations { get; set; } /// /// /// public object SnsRedEnvelops { get; set; } } #region pc原始单条朋友圈对象 public class CommentUserListOri { /// /// /// public int commentFlag { get; set; } /// /// /// public int commentId { get; set; } /// /// /// public int commentId2 { get; set; } /// /// /// public string content { get; set; } /// /// /// public int createTime { get; set; } /// /// /// public int deleteFlag { get; set; } /// /// /// public int isNotRichText { get; set; } /// /// 先森吳 /// public string nickname { get; set; } /// /// /// public int replyCommentId { get; set; } /// /// /// public int replyCommentId2 { get; set; } /// /// /// public string replyUsername { get; set; } /// /// /// public int source { get; set; } /// /// /// public int type { get; set; } /// /// /// public string username { get; set; } } public class LikeUserListOri { /// /// /// public int commentFlag { get; set; } /// /// /// public int commentId { get; set; } /// /// /// public int commentId2 { get; set; } /// /// /// public string content { get; set; } /// /// /// public int createTime { get; set; } /// /// /// public int deleteFlag { get; set; } /// /// /// public int isNotRichText { get; set; } /// /// /// public string nickname { get; set; } /// /// /// public int replyCommentId { get; set; } /// /// /// public int replyCommentId2 { get; set; } /// /// /// public string replyUsername { get; set; } /// /// /// public int source { get; set; } /// /// /// public int type { get; set; } /// /// /// public string username { get; set; } } public class ObjectDesc { /// /// /// public string buffer { get; set; } /// /// /// public int iLen { get; set; } } public class ObjectOperations { /// /// /// public string buffer { get; set; } /// /// /// public int iLen { get; set; } } public class PreDownloadInfo { /// /// /// public string noPreDownloadRange { get; set; } /// /// /// public int preDownloadNetType { get; set; } /// /// /// public int preDownloadPercent { get; set; } } public class SnsRedEnvelops { /// /// /// public int reportId { get; set; } /// /// /// public int reportKey { get; set; } /// /// /// public int resourceId { get; set; } /// /// /// public int rewardCount { get; set; } } public class WeAppInfo { /// /// /// public int appId { get; set; } /// /// /// public string mapPoiId { get; set; } /// /// /// public string redirectUrl { get; set; } /// /// /// public int score { get; set; } /// /// /// public int showType { get; set; } /// /// /// public string userName { get; set; } } public class CirCleInfoOri { /// /// /// public int blackListCount { get; set; } /// /// /// public int commentCount { get; set; } /// /// /// public List commentUserList { get; set; } /// /// /// public int commentUserListCount { get; set; } /// /// /// public int createTime { get; set; } /// /// /// public int deleteFlag { get; set; } /// /// /// public int extFlag { get; set; } /// /// /// public int groupCount { get; set; } /// /// /// public int groupUserCount { get; set; } /// /// /// public decimal id { get; set; } /// /// /// public int isNotRichText { get; set; } /// /// /// public int likeCount { get; set; } /// /// /// public int likeFlag { get; set; } /// /// /// public List likeUserList { get; set; } /// /// /// public int likeUserListCount { get; set; } /// /// /// public string nickname { get; set; } /// /// /// public int noChange { get; set; } /// /// /// public ObjectDesc objectDesc { get; set; } /// /// /// public ObjectOperations objectOperations { get; set; } /// /// /// public PreDownloadInfo preDownloadInfo { get; set; } /// /// /// public int referId { get; set; } /// /// /// public string referUsername { get; set; } /// /// /// public SnsRedEnvelops snsRedEnvelops { get; set; } /// /// /// public string username { get; set; } /// /// /// public WeAppInfo weAppInfo { get; set; } /// /// /// public int withUserCount { get; set; } /// /// /// public int withUserListCount { get; set; } } #endregion #endregion /// /// 朋友圈点赞 /// /// 无用 /// 朋友圈id public override void SendCirclePraise(string username, string circleId) { WechatPack pack = new WechatPack(this); pack.SendServer(PCRobotCMD.sendCirclePraise, circleId); } public override void SendCircleComment(string username, string circleId, string content) { if (string.IsNullOrEmpty(content)) return; content = content.Replace("\r\n", "\n").Trim(); var msgs = content.Split(new string[] { "[分段]" }, StringSplitOptions.RemoveEmptyEntries); try { foreach (var msgTmp in msgs) { var msg = msgTmp.RandomMess(); WechatPack pack = new WechatPack(this); pack.SendServer(PCRobotCMD.sendCircleComment, msg, tousername: circleId); Thread.Sleep(2450 + new Random().Next(50, 1000)); } } catch (Exception ex) { WriteLog("SendCircleComment Error:" + ex.Message); } } public override string SendCircle(string msg) { var xml = GetCircleXml(msg); LogHelper.GetSingleObj().Info("发送朋友圈的xml", xml); WechatPack pack = new WechatPack(this); var msg_id = pack.SendServer(PCRobotCMD.sendCircle, xml); if (!string.IsNullOrEmpty(msg_id)) { var rst = ChatClient.PCRobotPool.PackHist.GetResult(msg_id).Result; if (rst != null) { try { var result = rst as CommonResult; if (result != null && !string.IsNullOrWhiteSpace(result.Data)) { return $"{result.Data}"; } } catch (Exception ex) { this.WriteLog($"发送朋友圈异常:" + ex.Message + " - " + ex.StackTrace); } } else { } } return string.Empty; } #region 发送朋友圈相关 /// /// 解析获取xml /// /// /// private string GetCircleXml(string msg) { var xml = string.Empty; try { msg = msg.RandomMess().Trim(); if (msg.StartsWith("", StringComparison.CurrentCultureIgnoreCase) && msg.EndsWith("", StringComparison.CurrentCultureIgnoreCase)) { try { msg = Regex.Replace(msg, @"videomd5=""(.{32})""", @"videomd5=""" + Util.GetMD5Hash(Guid.NewGuid().ToByteArray()) + @"""", RegexOptions.IgnoreCase); msg = Regex.Replace(msg, @"md5=""(.{32})""", @"md5=""" + Util.GetMD5Hash(Guid.NewGuid().ToByteArray()) + @"""", RegexOptions.IgnoreCase); var match = Regex.Matches(msg, @"\[图片\=([^\]]+)\]", RegexOptions.IgnoreCase); if (match.Count > 0) { foreach (Match item in match) { var imageUrl = UplodCircleImage(item.Groups[1].Value); Console.WriteLine("@@@@@@@ url=" + imageUrl); if (!string.IsNullOrWhiteSpace(imageUrl)) msg = msg.Replace($"[图片={item.Groups[1].Value}]", imageUrl); } } } catch (Exception) { } //xml = SendCircle(msg, null, CircleType.图文朋友圈); return msg; } else { if (msg.Contains("[图片")) { //检测图片、如果是本地图片或非微信服务器图片、将自动上传并返回最新地址 List images = null; var match = Regex.Matches(msg, @"\[图片\=([^\]]+)\]", RegexOptions.IgnoreCase); if (match.Count > 0) { images = new List(); foreach (Match item in match) { images.Add(item.Groups[1].Value); } msg = Regex.Replace(msg, "\\[图片=.*?\\]", "").Trim(); } xml = SendCircle(msg, images, CircleType.图文朋友圈); } else if (msg.Contains("[视频")) { //检测图片、如果是本地图片或非微信服务器图片、将自动上传并返回最新地址 List videos = null; var match = Regex.Matches(msg, @"\[视频\=([^\]]+)\]", RegexOptions.IgnoreCase); if (match.Count > 0) { videos = new List(); foreach (Match item in match) { videos.Add(item.Groups[1].Value); } msg = Regex.Replace(msg, "\\[视频=.*?\\]", "").Trim(); } xml = SendCircle(msg, videos, CircleType.视频朋友圈); } else if (msg.Contains("[链接")) { //检测图片、如果是本地图片或非微信服务器图片、将自动上传并返回最新地址 List videos = null; var match = Regex.Matches(msg, @"\[链接\=([^\]]+)\]", RegexOptions.IgnoreCase); if (match.Count > 0) { videos = new List(); foreach (Match item in match) { videos.Add(item.Groups[1].Value); } msg = Regex.Replace(msg, "\\[链接=.*?\\]", "").Trim(); } xml = SendCircle(msg, videos, CircleType.视频朋友圈); } else { xml = SendCircle(msg, null, CircleType.文字朋友圈); } } } catch (Exception ex) { } return xml; } private string SendCircle(string content, List list, CircleType circleType) { StringBuilder sb = new StringBuilder(); try { switch (circleType) { case CircleType.文字朋友圈: { sb.Append("" + Util.GenerateRandomCode(20) + "weixin" + Util.TimeStamp() + "030"); sb.Append("" + content + ""); sb.Append("0002"); } break; case CircleType.视频朋友圈: { { sb.Append("" + Util.GenerateRandomCode(20) + "weixin" + Util.TimeStamp() + "000"); sb.Append("" + content + ""); sb.Append("00015微信小视频Sight"); sb.Append("" + Util.GenerateRandomCode(20) + ""); sb.Append("6"); sb.Append("0"); sb.Append(""); sb.Append("" + content + ""); sb.Append("00"); sb.Append("" + ((list != null && list.Count != 0) ? list[0] : "https://support.weixin.qq.com/cgi-bin/mmsupport-bin/readtemplate?t=page/common_page__upgrade&v=1") + ""); sb.Append("" + ((list != null && list.Count != 0) ? list[0] : "https://support.weixin.qq.com/cgi-bin/mmsupport-bin/readtemplate?t=page/common_page__upgrade&v=1") + "");//这里应该是视频的第一张图片 sb.Append("27.166667"); sb.Append("https://support.weixin.qq.com/cgi-bin/mmsupport-bin/readtemplate?t=page/common_page__upgrade&v=1"); } } break; case CircleType.链接朋友圈: { sb.Append("" + Util.GenerateRandomCode(20) + "weixin" + Util.TimeStamp() + "040000"); sb.Append("3"); sb.Append("" + content + ""); sb.Append("" + content + ""); sb.Append("" + ((list != null && list.Count != 0) ? list[0] : "https://support.weixin.qq.com/cgi-bin/mmsupport-bin/readtemplate?t=page/common_page__upgrade&v=1") + ""); sb.Append(""); sb.Append(""); sb.Append("" + Util.GenerateRandomCode(20) + ""); sb.Append("2"); sb.Append(""); sb.Append(""); sb.Append("0"); sb.Append("0"); sb.Append("https://img.sj33.cn/uploads/allimg/201402/7-140223103130591.png"); sb.Append("https://img.sj33.cn/uploads/allimg/201402/7-140223103130591.png"); sb.Append("https://img.sj33.cn/uploads/allimg/201402/7-140223103130591.png"); sb.Append(""); sb.Append(""); sb.Append(""); } break; case CircleType.图文朋友圈: { sb.Append("" + Util.GenerateRandomCode(20) + "weixin" + Util.TimeStamp() + ""); sb.Append("" + content + ""); sb.Append("0300001"); sb.Append(""); if (list != null) { foreach (string temp in list) { //var url = temp; var url = UplodCircleImage(temp); LogHelper.GetSingleObj().Info("朋友圈图片上传", $"{User.Nick}({User.Username}) => 原图={temp},转后={url}"); if (string.IsNullOrWhiteSpace(url)) continue; sb.Append(""); sb.Append("" + Util.GenerateRandomCode(20) + ""); sb.Append("2"); sb.Append(""); sb.Append("" + content + ""); sb.Append("00"); sb.Append(""); sb.Append("" + url + ""); sb.Append("" + url + ""); sb.Append(""); sb.Append(""); } } sb.Append(""); sb.Append(""); } break; default: break; } } catch (Exception ex) { } return sb.ToString(); } //private string _UplodCirele(string content) //{ // try // { // var match = Regex.Matches(content, @"\[图片\=([^\]]+)\]", RegexOptions.IgnoreCase); // foreach (Match item in match) // { // try // { // var url = item.Groups[1].Value; // url = UplodCircleImage(url); // if (string.IsNullOrWhiteSpace(url)) continue; // content = content.Replace($"[图片={item.Groups[1].Value}]", url); // } // catch (Exception) // { // } // } // var payloadJson = new // { // Content = Encoding.UTF8.GetBytes(content) // }; // WechatPack send = new WechatPack(this); // return Encoding.UTF8.GetString(send.SendAll(WechatCmd.发送朋友圈, true, payloadJson)); // } // catch (Exception ex) // { // WriteLog("发送朋友圈失败:" + ex.Message); // return null; // } //} #region 上传 private Dictionary CircleUrlDic = new Dictionary(); private Queue Queues = new Queue(); private string GetUrlInfo() { try { return Queues.Dequeue(); } catch (Exception) { } return null; } private bool _IsRun = false; private void _ExchangeAction() { if (_IsRun) return; _IsRun = true; Task.Run(() => { try { var data = GetUrlInfo(); while (!string.IsNullOrWhiteSpace(data)) { var md5 = HttpExtend.GetMD5String(data); try { WechatPack pack = new WechatPack(this); var msg_id = pack.SendServer(PCRobotCMD.uploadCiecleImage, data); if (!string.IsNullOrEmpty(msg_id)) { var rst = ChatClient.PCRobotPool.PackHist.GetResult(msg_id).Result; if (rst != null) { try { var result = rst as CommonResult; if (result != null && !string.IsNullOrWhiteSpace(result.Data)) { CircleUrlDic.Add(md5, result.Data); } } catch (Exception ex) { this.WriteLog($"朋友圈上传本地图片异常:" + ex.Message + " - " + ex.StackTrace); } } else { CircleUrlDic.Add(md5, string.Empty); } } //return string.Empty; } catch (Exception ex) { } finally { if (!CircleUrlDic.ContainsKey(md5)) CircleUrlDic.Add(md5, string.Empty); data = GetUrlInfo(); } } } catch (Exception ex) { } finally { _IsRun = false; } }); } #endregion /// /// 开始上传图片 /// public string UplodCircleImage(string url) { try { var urlResult = string.Empty; for (int i = 0; i < 1; i++) { var data = string.Empty; if (url.ToLower().StartsWith("http")) { url = url.Replace("&", ""); if (url.Contains("qpic.cn")) return url; //HttpHelper http = new HttpHelper(); //var item = http.GetItem(url); //item.ResultType = CsharpHttpHelper.Enum.ResultType.Byte; //data = http.GetHtml(item).ResultByte; data = url; } else { //FileInfo aFileInfo = new FileInfo(url); //using (FileStream fsRead = aFileInfo.Open(FileMode.Open)) //{ // int fsLen = (int)fsRead.Length; // data = new byte[fsLen]; // fsRead.Read(data, 0, data.Length); //} if (File.Exists(url)) { try { var image = Image.FromFile(url); //var image = PickBox.ResizeImage(image1, new Size((int)(image1.Width * 0.8), (int)(image1.Height * 0.8))); data = Common.ConvertImageToBase64(image); //var sss = Common.ConvertBase64ToImage(data); } catch (Exception ex) { } } else return string.Empty; } var md5 = HttpExtend.GetMD5String(data); if (CircleUrlDic.ContainsKey(md5) && !string.IsNullOrWhiteSpace(CircleUrlDic[md5])) return CircleUrlDic[md5]; Queues.Enqueue(data); _ExchangeAction(); var dieTime = DateTime.Now.AddMinutes(15); do { Thread.Sleep(500); if (CircleUrlDic.ContainsKey(md5)) { var result = CircleUrlDic[md5]; if (string.IsNullOrWhiteSpace(result)) CircleUrlDic.Remove(md5); return result; } } while (DateTime.Now < dieTime); } return urlResult; } catch { return string.Empty; } } #endregion /// /// 请求获取群信息 /// /// private void GetGroupInfo(string groupid) { try { lock (GroupMembers) { try { WechatPack send = new WechatPack(this); send.SendServer(PCRobotCMD.getGroupMember, groupid); } catch (Exception ex) { this.WriteLog(ex.Message); } } } catch (Exception ex) { this.WriteLog($"请求群信息:{ex.Message}"); } } /// /// 分析hook服务器过来的事件 /// /// public override void Receive(object obj) { //LogHelper.GetSingleObj().Debug("", $"获取到解析后的数据 = {obj.GetType().Name},Uin:{this.User.Uin},{this.User.Nick}({this.WeixinHao})"); var cmd = string.Empty; try { this.HeartBreakTime = DateTime.Now; var events = ChatClient.Events; if (obj.GetType() == typeof(WechatReceiveMsgEvents))//私聊和群聊消息 { var evt = obj as WechatReceiveMsgEvents; cmd = evt.Data.Cmd.ToString(); if (Friends.ContainsKey(evt.Data.FromUsername)) { if (Friends[evt.Data.FromUsername].MsgType == 24 || Friends[evt.Data.FromUsername].MsgType == 8 || Friends[evt.Data.FromUsername].MsgType == 29)//公众号 return; } if (string.IsNullOrWhiteSpace(evt.Data.FromGroupid)) { if (Util.GetNoAnalysisConfig().Count == 0 || Util.GetNoAnalysisConfig().Contains("私消息")) { //bool is_phpone = false; Friend friend = null; friend = this.GetContact(evt.Data.FromUsername); if (!ChatClient.WXSdkConfig.MsgConvertToFriend && evt.Data.IsSend) { return; //if (evt.Data.IsSend == this.WeixinHao) //{ // is_phpone = true; //} //is_phpone = evt.Data.IsSend; } if (friend == null) { this.WriteLog(string.Format("获取用户{0}失败。", evt.Data.FromUsername)); return; } friend.NickName = Util.RemoveEmoji(friend.NickName); var eventobj = new WXReiceveFriendMsg(this, friend, evt.Data.FromMessage); eventobj.IsRobot = evt.Data.IsSend; events.OnEvent(eventobj); } } else { if (Util.GetNoAnalysisConfig().Count == 0 || Util.GetNoAnalysisConfig().Contains("群消息")) { var group = this.GetContact(evt.Data.FromGroupid); if (group == null) { this.WriteLog(string.Format("获取群{0}失败.。", evt.Data.FromGroupid)); return; } GroupMember member = this.GetMember(evt.Data.FromGroupid, evt.Data.FromUsername); if (member == null) { this.WriteLog(string.Format("获取群{0}成员{1}信息失败.。", evt.Data.FromGroupid, evt.Data.FromUsername)); return; } events.OnEvent(new WXReceiveGroupMsg(this, member, group, evt.Data.FromMessage)); return; } } } else if (obj.GetType() == typeof(WechatApplyFriendEvents))//申请添加我为好友,需要审核 { if (Util.GetNoAnalysisConfig().Count == 0 || Util.GetNoAnalysisConfig().Contains("新申请")) { var evt = obj as WechatApplyFriendEvents; cmd = evt.Data.Cmd.ToString(); events.OnEvent(new WXApplyFriend(this, evt.Data.NewFriendWxid, evt.Data.NewFriendNick, evt.Data.Message, evt.Data.OldFriendWxid, evt.Data.OldFriendNick, evt.Data.Token)); #region 这里给通过做准备,把用户信息保存起来 if (!Friends.ContainsKey(evt.Data.NewFriendWxid)) { var reg = Regex.Match(evt.Data.Token, @"smallheadimgurl==""(?<头像>[^""]*?)"""); var headIMG = string.Empty; if (reg.Success) headIMG = reg.Groups["头像"].Value; Friends[evt.Data.NewFriendWxid] = new Friend() { SmallHeadImgUrl = headIMG, BigHeadImgUrl = headIMG, City = string.Empty, Sex = 0, MsgType = 0, NickName = evt.Data.NewFriendNick, Remark = evt.Data.NewFriendNick, UserName = evt.Data.NewFriendWxid, Alias = evt.Data.NewFriendWxid, ExtInfo = string.Empty, Province = string.Empty, ChatRoomOwner = string.Empty, ChatroomVersion = string.Empty }; } #endregion } } else if (obj.GetType() == typeof(WechatNewFriendEvents)) { if (Util.GetNoAnalysisConfig().Count == 0 || Util.GetNoAnalysisConfig().Contains("新好友")) { var evt = obj as WechatNewFriendEvents; cmd = evt.Data.Cmd.ToString(); Friend friend = null; friend = this.GetContact(evt.Data.FromUserName);//这里很大概率获取不到用户的昵称,新用户 if (friend == null) { this.WriteLog(string.Format("获取用户{0}失败。", evt.Data.FromUserName)); return; } friend.NickName = Util.RemoveEmoji(friend.NickName); events.OnEvent(new WXNewFriend(this, friend)); } } else if (obj.GetType() == typeof(WechatReicevePayEvents))//收到支付 { if (Util.GetNoAnalysisConfig().Count == 0 || Util.GetNoAnalysisConfig().Contains("转账")) { var evt = obj as WechatReicevePayEvents; cmd = evt.Data.Cmd.ToString(); var friend = GetContact(evt.Data.FromUsername); if (friend != null) { friend.NickName = Util.RemoveEmoji(friend.NickName); var e = new WXReicevePay(this, friend, evt.Data.Invalidtime, evt.Data.Transferid, evt.Data.Money); events.OnEvent(e); } } } else if (obj.GetType() == typeof(WechatNewMemerEvents))//新人入群 { if (Util.GetNoAnalysisConfig().Count == 0 || Util.GetNoAnalysisConfig().Contains("新群友")) { var evt = obj as WechatNewMemerEvents; cmd = evt.Data.Cmd.ToString(); var group = GetContact(evt.Data.GroupId); if (group == null) return; if (!string.IsNullOrWhiteSpace(evt.Data.SourceName)) { var inviteFriend = GetContact(evt.Data.SourceName); if (inviteFriend != null) evt.Data.SourceNick = inviteFriend.NickName; } events.OnEvent(new WXNewMemer(this) { Group = group, GroupId = evt.Data.GroupId, MemberNicks = evt.Data.MemberNick, MemberName = evt.Data.MemberName, SourceNick = Util.RemoveEmoji(evt.Data.SourceNick), SourceName = evt.Data.SourceName, TotalMember = evt.Data.TotalMember }); } } else if (obj.GetType() == typeof(WechatContactListEvents))//获得通讯录列表 { var evt = obj as WechatContactListEvents; cmd = evt.Data.Cmd.ToString(); FriendsAction = GetFriends; FriendsAction(evt.Data.Message); } else if (obj.GetType() == typeof(WechatGroupMemberEvents))//获得群成员 { //var evt = obj as WechatGroupMemberEvents; //cmd = evt.Data.Cmd.ToString(); //GroupMembersAction = GetGroupMembers; //GroupMembersAction(evt.Data.Message); } else if (obj.GetType() == typeof(WechatStatusEvents))//微信状态改变 { this.HeartBreakTime = DateTime.Now; //LogHelper.GetSingleObj().Info("", $"刷新HeartBreakTime = {HeartBreakTime},Uin:{this.User.Uin},{this.User.Nick}({this.WeixinHao})"); var evt = obj as WechatStatusEvents; cmd = evt.Cmd.ToString(); ChangeStatus(evt.Status == PCRobot.Pack.Status.在线 ? WxStatus.在线 : WxStatus.已退出); } } catch (Exception ex) { LogHelper.GetSingleObj().Error("", $"PC服务器消息处理异常:【{cmd}】- {ex.Message},{ex.StackTrace}"); } } /// /// 获取指定的用户 /// public string GetWxidInfo(string wxid) { try { WechatPack pack = new WechatPack(this); return pack.SendServer(PCRobotCMD.getWxidInfo, wxid); } catch (Exception ex) { } return string.Empty; } /// /// 退出消息 /// /// public override void LoginOut(string message) { //发送指令 强制退出易转发那边的微信 WechatPack pack = new WechatPack(this); pack.SendServer(PCRobotCMD.closeWechat, message); try { LogHelper.GetSingleObj().Debug("", $"LoginOut带提示:{this.WeixinHao}"); } catch (Exception) { } } /// /// 退出登录 /// public override void LoginOut() { //发送指令 强制退出易转发那边的微信 WechatPack pack = new WechatPack(this); pack.SendServer(PCRobotCMD.closeWechat); try { LogHelper.GetSingleObj().Debug("", $"LoginOut不带提示:{this.WeixinHao}"); } catch (Exception) { } } /// /// 领取转账 /// /// /// /// /// public override int TenPayTransferConfirm(string Invalidtime, string Transferid, string FromUsername) { WechatPack pack = new WechatPack(this); pack.SendServer(PCRobotCMD.getPay, HttpHelper.ObjectToJson(new Dictionary() { { "Invalidtime", Invalidtime }, { "Transferid", Transferid }, { "WxId", FromUsername } }), WechatMsgType.文本, FromUsername); return 0; } /// /// 发送卡片 /// /// /// public override void SendCard(string username, string friendwxid) { WechatPack pack = new WechatPack(this); pack.SendServer(PCRobotCMD.sendCard, friendwxid, WechatMsgType.文本, username); } /// /// 发送XML卡片 /// /// /// public override void SendCardXml(string username, string xml) { WechatPack pack = new WechatPack(this); pack.SendServer(PCRobotCMD.sendCardXml, xml, WechatMsgType.文本, username); } /// /// 邀请入群 /// /// /// /// public override string InviteIntoGroup(string username, string groupId) { WechatPack pack = new WechatPack(this); pack.SendServer(PCRobotCMD.sendInviteGroup, groupId, WechatMsgType.文本, username); return string.Empty; } /// /// 删除群用户 /// /// /// /// public override string DeleteGroupMember(string username, string groupId) { WechatPack pack = new WechatPack(this); pack.SendServer(PCRobotCMD.deleteGroupMember, username, WechatMsgType.文本, groupId); return string.Empty; } /// /// 发送图片 /// /// /// public override void SendImage(string username, string address) { try { WechatPack pack = new WechatPack(this); pack.SendServer(PCRobotCMD.sendImg, address, WechatMsgType.图片, username); } catch (Exception ex) { this.WriteLog($"发送图片失败:{ex.Message} - {ex.StackTrace}"); } } /// /// 发送消息 /// /// /// /// /// public override Task SendMessage(string _username, string _message, string _atUsername = "") { string username = _username; string content = _message; string atUsername = _atUsername; return Task.Run(() => { if (string.IsNullOrEmpty(content)) return true; content = content.Replace("\r\n", "\n").Trim().Replace("[时间]", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")).Replace("[机器人微信]", this.User.Username); var msgs = content.Split(new string[] { "[分段]" }, StringSplitOptions.RemoveEmptyEntries); try { foreach (var msg in msgs) { var m = msg.Replace("\r\n", "\n").Trim(); if (string.IsNullOrEmpty(m)) continue; var message = m.RandomMess(); message = message.Contains("[随机表情]") ? message.Replace("[随机表情]", WXClientImpl_IPAD.FindRandomExpression()) : message; //if (message.StartsWith("[延迟=")) //{ // var reg = Regex.Match(message, @"\[延迟=(\d+)\]"); // if (reg.Success) // { // message = Regex.Replace(message, @"\[延迟=(\d+)\]", "").Trim(); // // this.WriteLog($"需要延迟{reg.Groups[1].Value}秒,再发送:{message}"); // Thread.Sleep(int.Parse(reg.Groups[1].Value) * 1000); // } //} message = DelayMess(message); ChatClient.Events.OnEvent(new WXSendMessage(this, message, username)); WechatPack pack = new WechatPack(this); //发送XML消息 if (message.Trim().ToLower().StartsWith("")) { message = $@"{WeixinHao}0{msg.Replace("&", "&")}1Window wechat"; pack.SendServer(PCRobotCMD.sendTxt, message, WechatMsgType.文本, username); //LogHelper.GetSingleObj().Debug("XCX发送小程序", $"机器人:{this.User.Nick}({this.WeixinHao}),{message}"); continue; } //发送图片消息 var matchs = Regex.Matches(message, @"\[图片\=([^\]]+)\]", RegexOptions.IgnoreCase); foreach (Match match in matchs) { var imageBase = string.Empty; var image = match.Groups[1].Value; if (!image.ToLower().Trim().StartsWith("http")) { if (File.Exists(image)) { double size = new FileInfo(image).Length; if (size > 1024 * 512) { try { var img = Util.ReadImageFile(image); var bitmap = Util.PercentImage(img, img.Width); var _image = image + Path.GetExtension(image);//压缩图片的地址 if (Util.YaSuo(bitmap, _image)) { imageBase = Util.FileToBase64(_image); } } catch (Exception ex) { LogHelper.GetSingleObj().Error("", $"Common图片压缩异常:{ex.Message} - {ex.StackTrace}"); imageBase = Util.FileToBase64(image); } } else imageBase = Util.FileToBase64(image); } } else imageBase = image; SendImage(username, imageBase); } message = Regex.Replace(message, @"\[图片\=([^\]]+)\]", ""); message = DelayMess(message); //发送语音消息 //matchs = Regex.Matches(message, @"\[语音\=([^\]]+)\]", RegexOptions.IgnoreCase); //foreach (Match item in matchs) //{ //SendVoice(username, item.Groups[1].Value);//PC不能发送语音 //} message = Regex.Replace(message, @"\[语音\=([^\]]+)\]", ""); message = DelayMess(message); matchs = Regex.Matches(message, @"\[视频\=([^\]]+)\]", RegexOptions.IgnoreCase); foreach (Match item in matchs) { //var video = Util.StrToHex(item.Groups[1].Value); //if (video != null) //{ // var video_json = Encoding.UTF8.GetString(video); // var video_data = CsharpHttpHelper.HttpExtend.JsonToDictionary(video_json); // if (video_data != null) // { // SendCDNInfo(username, video_data["cdnurl"].ToString(), video_data["aeskey"].ToString(), CDNType.发送视频); // } //} var filePath = item.Groups[1].Value; if (!Regex.IsMatch(filePath, @"^[c-zC-Z]:\\")) continue; //if (File.Exists(filePath)) //{ // //var base64 = Util.FileToBase64(filePath); //} pack.SendServer(PCRobotCMD.sendVideo, filePath, WechatMsgType.视频, username); } message = Regex.Replace(message, @"\[视频\=([^\]]+)\]", ""); message = DelayMess(message); matchs = Regex.Matches(message, @"\[卡片\=([^\]]+)\]", RegexOptions.IgnoreCase); foreach (Match item in matchs) { var recommendedUser = item.Groups[1].Value; if (recommendedUser.ToLower().Contains(" /// 需要发送的消息队列 /// private ConcurrentQueue SendMessageQueue { get; set; } = new ConcurrentQueue(); private object lock_sendmessage = new object(); private bool lock_sendmessage_ing = false; //Thread SendMessageThread; private int fragmentCount = 0; private DateTime fragmentTime = DateTime.MinValue; private void RunSendMessageQueue(WechatPack sendPack) { SendMessageQueue.Enqueue(sendPack); if (lock_sendmessage_ing) return; lock (lock_sendmessage) { if (lock_sendmessage_ing) return; lock_sendmessage_ing = true; ThreadPool.QueueUserWorkItem(x => { try { WechatPack pack = null; while (SendMessageQueue.TryDequeue(out pack)) { if (this.Status == WxStatus.在线) { pack.SendNextData(); #region 消息防止频繁,休眠操作 if (ChatClient.MessFrequentSleepTime != 0) { fragmentCount++; var totalSeconds = (DateTime.Now - fragmentTime).TotalSeconds;//上次休眠的时间差 bool rest = totalSeconds > 10; if (fragmentCount >= 10 && totalSeconds <= 10) { rest = true; Thread.Sleep(ChatClient.MessFrequentSleepTime * 1000); } if (rest) { fragmentCount = 1; fragmentTime = DateTime.Now; } } #endregion } } } catch (Exception) { } finally { lock_sendmessage_ing = false; } }); } } #endregion /// /// 同意添加我为好友 /// /// /// public override string AgreeAddMe(string token) { Console.WriteLine(token); WechatPack pack = new WechatPack(this); pack.SendServer(PCRobotCMD.agreeFriend, token, WechatMsgType.文本, string.Empty); return string.Empty; } /// /// 删除好友 /// /// /// public override string DeleteFriend(string username) { WechatPack pack = new WechatPack(this); pack.SendServer(PCRobotCMD.deleteFriend, username, WechatMsgType.文本, string.Empty); return string.Empty; } /// /// 修改用户信息 /// /// /// /// public override void EditContacts(string username, EditContactsType type, string remark = "") { if (type == EditContactsType.备注) { WechatPack pack = new WechatPack(this); pack.SendServer(PCRobotCMD.editContacts, remark, WechatMsgType.文本, username); } else if (type == EditContactsType.置顶 || type == EditContactsType.取消置顶) { WechatPack pack = new WechatPack(this); pack.SendServer(PCRobotCMD.stateOpt, type == EditContactsType.置顶 ? "1" : "0", WechatMsgType.文本, username); } else throw new Exception("本协议不支持该操作"); } /// /// 消息延迟 /// /// public string DelayMess(string message) { try { message = message.Trim(); if (message.StartsWith("[延迟=")) { var reg = Regex.Match(message, @"\[延迟=(\d+)\]"); if (reg.Success) { message = Regex.Replace(message, @"\[延迟=(\d+)\]", "").Trim(); // this.WriteLog($"需要延迟{reg.Groups[1].Value}秒,再发送:{message}"); Thread.Sleep(int.Parse(reg.Groups[1].Value) * 1000); } } } catch (Exception ex) { } return message; } } }