using Api.Framework.Events; using Api.Framework.Model; using Api.Framework.Tools; using Chat.Framework.QQSdk.QPlus; using Chat.Framework.Utils; using Chat.Framework.WXSdk; using Chat.Framework.WXSdk.Implement; using Robot.Framework; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; namespace Api.Framework.SDK { /// /// 平台类型 /// public enum ChatType : int { 未知来源 = 0, QQ = 1, 微信 = 2, 微信公众号 = 3, 企业微信 = 4 } /// /// 通用消息事件 /// public class ReciveIMEvent : BaseEvents { /// /// 事件来源(机器人),强转即可 (注:机器人基类为:WeixinBase) /// public object Sender { get; private set; } /// /// 事件原形 /// public object Event { get; private set; } /// /// 消息 /// public string Message { get; private set; } /// /// 发送者昵称 /// public string NickName { get; private set; } /// /// 发送者原始昵称 /// public string RealNick { get; set; } /// /// 微信号 /// public string Wechatid { get; set; } /// /// 发送者账号 /// public string Username { get; private set; } /// /// 用户头像地址 /// public string HeadUrl { get; private set; } /// /// 群号,私聊为空 /// public string Groupid { get; private set; } /// /// 机器人类型 /// public ChatType ChatType { get; private set; } /// /// 机器人账号 /// public string RobotName { get; private set; } /// /// 机器人账号 /// public string RobotNick { get; private set; } private fl_robot_info _robotinfo; /// /// 机器人对象 /// public fl_robot_info RobotInfo { get { if (_robotinfo == null) { var session = ApiClient.GetSession(); _robotinfo = session.FindRobotInfo(RobotName, ChatType); } return _robotinfo; } } private fl_member_info fl_member_info; /// /// 获取用户对象方法 /// /// 刷新 /// public fl_member_info GetMemberinfo(bool refresh = false) { bool is_first = fl_member_info == null ? true : false; if (refresh || fl_member_info == null || string.IsNullOrWhiteSpace(fl_member_info.headurl)) { var session = ApiClient.GetSession(); this.fl_member_info = session.FindMemberinfo(this); if (this.fl_member_info != null) { if (is_first || string.IsNullOrWhiteSpace(fl_member_info.headurl)) { if (is_first) this.fl_member_info.chat_count++; if (string.IsNullOrWhiteSpace(fl_member_info.headurl)) fl_member_info.headurl = HeadUrl; session.SaveOrUpdate(this.fl_member_info); } } } return this.fl_member_info; } /// /// 事件Type /// public Type EventType { get; private set; } /// /// 通用解析 /// /// /// public ReciveIMEvent(object Sender, object Event) { if (Sender.GetType() == typeof(Chat.Framework.WXSdk.Implement.WXClientImpl_IPAD)) { var client = Sender as Chat.Framework.WXSdk.Implement.WXClientImpl_IPAD; this.RobotName = client.WeixinHao; this.RobotNick = client.User.Nick; this.ChatType = ChatType.微信; } else if (Sender.GetType() == typeof(QQClientImpl_QQPlus)) { var client = Sender as QQClientImpl_QQPlus; this.RobotName = client.QQClient.User.QQ.ToString(); this.RobotNick = Util.RemoveEmoji(client.QQClient.User.NickName); this.ChatType = ChatType.QQ; } else if (Sender.GetType() == typeof(Chat.Framework.WXSdk.Implement.WXClientImpl_HOOK)) { var client = Sender as Chat.Framework.WXSdk.Implement.WXClientImpl_HOOK; this.RobotName = client.WeixinHao; this.RobotNick = Util.RemoveEmoji(client.User.Nick); this.ChatType = ChatType.微信; } else if (Sender.GetType() == typeof(Chat.Framework.WXSdk.Implement.WXClientImpl_QYHOOK)) { var client = Sender as Chat.Framework.WXSdk.Implement.WXClientImpl_QYHOOK; this.RobotName = client.WeixinHao; this.RobotNick = Util.RemoveEmoji(client.User.Nick); this.ChatType = ChatType.企业微信; } this.Groupid = string.Empty; this.Sender = Sender; this.Event = Event; //Console.WriteLine(Event.GetType().ToString()); this.EventType = Event.GetType(); if (EventType == typeof(Chat.Framework.QQSdk.Events.QQReceiveFriendMsgEvents)) { this.ChatType = ChatType.QQ; var e = Event as Chat.Framework.QQSdk.Events.QQReceiveFriendMsgEvents; this.NickName = Util.RemoveEmoji(e.Nickname); this.Message = e.Message; this.RealNick = Util.RemoveEmoji(e.Nickname); this.Username = e.QQ.ToString(); this.Wechatid = string.Empty; this.HeadUrl = this.HeadUrl = $"http://q1.qlogo.cn/g?b=qq&nk={e.QQ}&s=640"; } //else if (EventType == typeof(Chat.Framework.PCRobotSDK.WechatEvents.WechatReceiveMsgEvents)) //{ // ChatType = ChatType.微信; // var evt = Event as Chat.Framework.PCRobotSDK.WechatEvents.WechatReceiveMsgEvents; // this.RobotName = evt.Data.RobotUsername; // this.RobotNick = Util.RemoveEmoji(evt.Data.RobotUsernick); // this.NickName = Util.RemoveEmoji(evt.Data.FromUsernick == null ? string.Empty : evt.Data.FromUsernick); //evt.Data.FromUsernick; // this.Username = evt.Data.FromUsername; // this.Message = evt.Data.FromMessage; // this.Groupid = evt.Data.FromGroupid; //} else if (EventType == typeof(Chat.Framework.QQSdk.Events.QQReceiveGroupMsgEvents)) { this.ChatType = ChatType.QQ; var e = Event as Chat.Framework.QQSdk.Events.QQReceiveGroupMsgEvents; this.NickName = Util.RemoveEmoji(e.Nickname == null ? string.Empty : e.Nickname); this.Message = e.Message; this.RealNick = Util.RemoveEmoji(e.Nickname == null ? string.Empty : e.Nickname); this.Groupid = e.GroupId.ToString(); this.Username = e.QQ.ToString(); this.Wechatid = string.Empty; this.HeadUrl = $"http://q1.qlogo.cn/g?b=qq&nk={e.QQ}&s=640"; } else if (EventType == typeof(Chat.Framework.WXSdk.Events.WXReceiveGroupMsg)) { var e = Event as Chat.Framework.WXSdk.Events.WXReceiveGroupMsg; this.RobotName = e.Client.WeixinHao; this.Message = e.Message; var realNick = e.Member.NickName; var nick = e.Member.GetName(); if (string.IsNullOrWhiteSpace(Util.RemoveEmoji(nick))) { Friend friend = null; if (Sender.GetType() == typeof(WXClientImpl_HOOK)) { var wx = Sender as WXClientImpl_HOOK; friend = wx.Friends.FirstOrDefault(f => f.Key == e.Member.Username).Value; } else if (Sender.GetType() == typeof(WXClientImpl_QYHOOK)) { var wx = Sender as WXClientImpl_QYHOOK; friend = wx.Friends.FirstOrDefault(f => f.Key == e.Member.Username).Value; } else if (Sender.GetType() == typeof(WXClientImpl_IPAD)) { var wx = Sender as WXClientImpl_IPAD; friend = wx.Friends.FirstOrDefault(f => f.Key == e.Member.Username).Value; } if (friend != null) { nick = friend.GetName(); realNick = friend.NickName; } } this.RealNick = Util.RemoveEmoji(realNick); this.NickName = Util.RemoveEmoji(nick); this.Username = e.Member.Username; this.Groupid = e.Group.UserName; this.HeadUrl = e.Member.BigHeadImgUrl; } else if (EventType == typeof(Chat.Framework.WXSdk.Events.WXReiceveFriendMsg)) { //this.ChatType = ChatType.微信; var e = Event as Chat.Framework.WXSdk.Events.WXReiceveFriendMsg; this.RobotName = e.Client.WeixinHao; this.Message = e.Message; var realNick = e.Friend.NickName; var nick = e.Friend.GetName(); if (string.IsNullOrWhiteSpace(Util.RemoveEmoji(nick))) { Friend friend = null; if (Sender.GetType() == typeof(WXClientImpl_HOOK)) { var wx = Sender as WXClientImpl_HOOK; friend = wx.Friends.FirstOrDefault(f => f.Key == e.Friend.UserName).Value; } else if (Sender.GetType() == typeof(WXClientImpl_QYHOOK)) { var wx = Sender as WXClientImpl_QYHOOK; friend = wx.Friends.FirstOrDefault(f => f.Key == e.Friend.UserName).Value; } else if (Sender.GetType() == typeof(WXClientImpl_IPAD)) { var wx = Sender as WXClientImpl_IPAD; friend = wx.Friends.FirstOrDefault(f => f.Key == e.Friend.UserName).Value; } if (friend != null) { nick = friend.GetName(); realNick = friend.NickName; } } this.RealNick = Util.RemoveEmoji(realNick); this.NickName = Util.RemoveEmoji(nick); this.Username = e.Friend.UserName; this.Wechatid = e.Friend.Alias; this.HeadUrl = e.Friend.BigHeadImgUrl; } else if (EventType == typeof(DebugEvent)) { this.RobotName = "系统调试"; this.RobotNick = "系统调试"; var e = Event as DebugEvent; this.ChatType = e.chatType; this.Message = e.content; this.RealNick = "系统调试"; this.NickName = e.usernick; this.Username = e.username; } else { } } /// /// 发送消息 /// /// 发送的消息 /// 是否取消传递消息给后续插件 public void SendMessage(string Message, bool SetCancel = true) { if (string.IsNullOrWhiteSpace(Message)) return; if (Message.Contains("[会员等级]")) { var session = ApiClient.GetSession(); var member = session.FindMemberinfo(this); var group = session.FindGroup(member); Message = Message.Replace("[会员等级]", group.name); } if (Message.Contains("[编号]")) { var session = ApiClient.GetSession(); var member = session.FindMemberinfo(this); Message = Message.Replace("[编号]", member.id.ToString()); } var msgTmp = Message .Replace("[账号]", Username) .Replace("[积分名称]", ApiClient.Setting.SystemConfig.PointName) .Replace("[昵称]", string.IsNullOrWhiteSpace(Groupid) ? (string.IsNullOrEmpty(RealNick) ? NickName : RealNick) : (string.IsNullOrEmpty(RealNick) ? NickName : RealNick)) .Replace("[机器人账号]", RobotName) .Replace("[机器人昵称]", RobotNick) .Trim(); msgTmp = new VariateReplace().ReplaceUserVariate(msgTmp); var msgs = msgTmp.Split(new string[] { "[分段]" }, StringSplitOptions.RemoveEmptyEntries); foreach (var item in msgs) { var m = item; var msg = m.RandomMess(); if (EventType == typeof(DebugEvent)) { var e = Event as DebugEvent; msg = msg.Replace("[@发送者账号]", e.username).Trim(); e.SendDebugMsg.Invoke(e.username, msg); } else if (EventType == typeof(Chat.Framework.WXSdk.Events.WXReceiveGroupMsg)) { var e = Event as Chat.Framework.WXSdk.Events.WXReceiveGroupMsg; string at = msg.Contains("[@发送者账号]") ? e.Member.Username : ""; msg = msg.Replace("[@发送者账号]", e.Member.GetName()).Trim(); e.Client.SendMessage(e.Group.UserName, msg, at); } else if (EventType == typeof(Chat.Framework.WXSdk.Events.WXReiceveFriendMsg)) { var e = Event as Chat.Framework.WXSdk.Events.WXReiceveFriendMsg; msg = msg.Replace("[@发送者账号]", "").Trim(); e.Client.SendMessage(e.Friend.UserName, msg); } else if (EventType == typeof(Chat.Framework.QQSdk.Events.QQReceiveFriendMsgEvents)) { var e = Event as Chat.Framework.QQSdk.Events.QQReceiveFriendMsgEvents; var session = ApiClient.GetSession(); var robot = session.FindRobotInfo(e.QQBase.QQ.ToString(), ChatType.QQ); if (robot == null) return; msg = msg.Replace("[@发送者账号]", "").Trim(); //if (e.TempMsgID == 0) // e.QQBase.SendFriendMessage(e.QQ, msg); //else // e.QQBase.SendTempMessage(e.QQ, msg); ApiClient.SendMessage(robot, e.QQ.ToString(), msg, e.IsTemp); } else if (EventType == typeof(Chat.Framework.QQSdk.Events.QQReceiveGroupMsgEvents)) { var e = Event as Chat.Framework.QQSdk.Events.QQReceiveGroupMsgEvents; var session = ApiClient.GetSession(); var robot = session.FindRobotInfo(e.QQBase.QQ.ToString(), ChatType.QQ); if (robot == null) return; msg = msg.Replace("[@发送者账号]", $"[@{e.QQ}]").Trim(); //e.QQBase.SendGroupMessage(e.GroupId, msg); ApiClient.SendMessage(robot, e.QQ.ToString(), msg, e.GroupId.ToString()); } else if (EventType == typeof(Chat.Framework.PCRobotSDK.WechatEvents.WechatReceiveMsgEvents)) { var e = Event as Chat.Framework.PCRobotSDK.WechatEvents.WechatReceiveMsgEvents; var session = ApiClient.GetSession(); var robot = session.FindRobotInfo(e.Data.RobotUsername, e.Data.RobotType == PCRobot.Pack.RobotType.客户端微信 ? ChatType.微信 : ChatType.企业微信); if (robot == null) return; //Console.WriteLine(e.Data.FromGroupid); msg = msg.Replace("\r\n", "\n").Trim().Replace("[时间]", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); try { msg = msg.Contains("[随机表情]") ? msg.Replace("[随机表情]", WXClientImpl_IPAD.FindRandomExpression()) : msg; //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); // } //} msg = DelayMess(msg); //发送XML消息 if (msg.ToLower().Trim().StartsWith("")) { msg = $@"{Util.RemoveEmoji(e.Data.RobotUsernick)}0{msg.Trim().Replace("&", "&")}1Window wechat"; ApiClient.SendMessage(robot, e.Data.FromUsername, msg, e.Data.FromGroupid); } //发送图片消息 var matchs = Regex.Matches(msg, @"(\[图片\=[^\]]+\])", RegexOptions.IgnoreCase); foreach (Match match in matchs) { ApiClient.SendMessage(robot, e.Data.FromUsername, match.Groups[1].Value, e.Data.FromGroupid); } msg = Regex.Replace(msg, @"\[图片\=([^\]]+)\]", ""); msg = DelayMess(msg); //发送语音消息 matchs = Regex.Matches(msg, @"(\[语音\=[^\]]+\])", RegexOptions.IgnoreCase); foreach (Match match in matchs) { ApiClient.SendMessage(robot, e.Data.FromUsername, match.Groups[1].Value, e.Data.FromGroupid); } msg = Regex.Replace(msg, @"\[语音\=([^\]]+)\]", ""); msg = DelayMess(msg); matchs = Regex.Matches(msg, @"(\[视频\=[^\]]+\])", RegexOptions.IgnoreCase); foreach (Match match in matchs) { ApiClient.SendMessage(robot, e.Data.FromUsername, match.Groups[1].Value, e.Data.FromGroupid); } msg = Regex.Replace(msg, @"\[视频\=([^\]]+)\]", ""); msg = DelayMess(msg); //ToDo 卡片还没完成 //matchs = Regex.Matches(msg, @"\[卡片\=([^\]]+)\]", RegexOptions.IgnoreCase); //foreach (Match match in matchs) //{ // SendCard(username, match.Groups[1].Value == "自己" ? robot.name : match.Groups[1].Value); //} //msg = Regex.Replace(msg, @"\[卡片\=([^\]]+)\]", ""); msg = DelayMess(msg); if (string.IsNullOrWhiteSpace(msg)) continue; if (msg.StartsWith("\r\n")) msg = msg.Substring("\r\n".Length); if (msg.StartsWith("\n")) msg = msg.Substring("\n".Length); } catch (Exception ex) { //("SendMessage ERROR:" + ex.Message); } ApiClient.SendMessage(robot, e.Data.FromUsername, msg, e.Data.FromGroupid); } } Cancel = SetCancel; } /// /// 消息延迟 /// /// 消息 private 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; } } }