using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using Chat.Framework.QQSdk.Events; using QQPlus.Framework; using QQPlus.Framework.Entities; using QQPlus.Framework.SDK; namespace Chat.Framework.QQSdk.PCQQ { public class PCQQClient : QQBase { private void Close() { if (qqclient != null) { if (qqclient.User != null) qqclient.Logout(); qqclient.LoginSuccessed -= Qqclient_LoginSuccessed; qqclient.LoginStatusChanged -= Qqclient_LoginStatusChanged; } this.UnRegisterEvent(); qqclient = null; } public override void AutoLogin() { this.Login(base.QQ.ToString(), base.Password); } private void Qqclient_LoginStatusChanged(object sender, LoginStatusChangedQQEventArgs e) { var msg = $"{e.LoginStatus}-{e.Other}"; if (msg.Contains("0836")) { qqclient.Login(); } else { this.IsLogin = (e.LoginStatus == LoginStatus.Login); if (!this.IsLogin) OnLog("状态修改为:" + e.Other); if (IsLogin) this.Nickname = this.qqclient.User.NickName; var x = new QQLoginChangeEvents(this, IsLogin, msg); ChatClient.QQPool.OnEvent(x); } } private void Qqclient_LoginSuccessed(object sender, LoginSuccessedQQEventArgs e) { var client = sender as QQClient; var x = new QQLoginChangeEvents(this, true, $"登陆成功!"); ChatClient.QQPool.OnEvent(x); OnLog($"QQ:{(client == null ? string.Empty : client.User.NickName)}({(client == null ? 0 : client.User.QQ)}) 登陆成功!"); } internal QQPlus.Framework.QQClient qqclient { get; private set; } public bool IsUDP { get; private set; } public string Version { get; private set; } public void Login(string Username, string Userpass, string Version, bool IsUDP) { this.Version = Version; this.IsUDP = IsUDP; this.Login(Username, Userpass); } public override void Logout() { this.Close(); } public override void Login(string Username, string Userpass) { uint QQ; if (string.IsNullOrEmpty(Username) || string.IsNullOrEmpty(Userpass) || !uint.TryParse(Username, out QQ)) throw new Exception("您输入的QQ或密码格式不正确!"); this.Close(); this.QQ = QQ; this.QQReLoginDic[QQ] = 0;//重置计时器 this.Password = Userpass; qqclient = new QQPlus.Framework.QQClient(QQ, Userpass); qqclient.User.IsUdp = this.IsUDP; qqclient.Config.QQProtocol = this.Version; qqclient.LoginSuccessed += Qqclient_LoginSuccessed; qqclient.LoginStatusChanged += Qqclient_LoginStatusChanged; qqclient.Login(); } internal override void RegisterEvent() { if (qqclient != null && !IsRegisterEvent) { IsRegisterEvent = true; qqclient.LostConnection += Qqclient_LostConnection; qqclient.ReceiveNormalIM += Qqclient_ReceiveNormalIM; qqclient.ReceiveClusterIM += Qqclient_ReceiveClusterIM; qqclient.ReceiveTempIM += Qqclient_ReceiveTempIM; qqclient.AddMeFriend += Qqclient_AddMeFriend; qqclient.AddMeFriendNeedAuth += Qqclient_AddMeFriendNeedAuth; qqclient.AddedToCluster += Qqclient_AddedToCluster; //qqclient.AddToClusterNeedAuth += Qqclient_AddToClusterNeedAuth; qqclient.AddedToClusterInvite += Qqclient_AddedToClusterInvite; } } /// /// QQ群新人申请进群需要审核 /// /// /// private void Qqclient_AddedToClusterInvite(object sender, AddedToClusterInviteQQEventArgs e) { try { //var evt = new QQNewGroupMemberEvents(this) { GroupId = e.Cluster.ExternalId, GroupName = e.Cluster.Name, Creator = e.Cluster.Creator, NewFriendQQ = e.ClusterMember.QQ, NewFriendNick = e.ClusterMember.Nick == null ? string.Empty : e.ClusterMember.Nick, OldFriendNick = e.ClusterMemberAdmin.Nick, OldFriendQQ = e.ClusterMemberAdmin.QQ }; //ChatClient.QQPool.OnEvent(evt); var evt = new InviteAddClusterNeedAuthEvents(this) { GroupId = e.Cluster.ExternalId, GroupName = e.Cluster.Name, Creator = e.Cluster.Creator, NewFriendQQ = e.ClusterMember.QQ, NewFriendNick = e.ClusterMember.Nick == null ? string.Empty : e.ClusterMember.Nick, OldFriendNick = e.ClusterMemberAdmin.Nick, OldFriendQQ = e.ClusterMemberAdmin.QQ }; ChatClient.QQPool.OnEvent(evt); } catch (Exception ex) { this.OnLog($"Qqclient_AddedToClusterInvite Error:{ex.Message}"); } } /// /// 1视乎是通过群申请以后进这个事件 /// /// /// private void Qqclient_AddedToCluster(object sender, AddedToClusterQQEventArgs e) { try { var evt = new QQNewGroupMemberEvents(this) { GroupId = e.Cluster.ExternalId, GroupName = e.Cluster.Name, Creator = e.Cluster.Creator, NewFriendQQ = e.ClusterMember.QQ, NewFriendNick = e.ClusterMember.Nick == null ? string.Empty : e.ClusterMember.Nick, OldFriendNick = e.ClusterMemberAdmin.Nick, OldFriendQQ = e.ClusterMemberAdmin.QQ }; ChatClient.QQPool.OnEvent(evt); } catch (Exception ex) { this.OnLog($"Qqclient_AddedToCluster Error:{ex.Message}"); } } private void Qqclient_AddMeFriend(object sender, AddMeFriendQQEventArgs e) { try { var friend = qqclient.GetFriend(e.QQ); var evt = new QQNewFriendEvents(this) { QQ = e.QQ, Nickname = friend != null ? friend.NickName : string.Empty }; ChatClient.QQPool.OnEvent(evt); } catch (Exception ex) { this.OnLog($"Qqclient_AddMeFriend Error:{ex.Message}"); } } ///// ///// 添加到集群需要验证 ///// ///// ///// //private void Qqclient_AddToClusterNeedAuth(object sender, AddToClusterNeedAuthQQEventArgs e) //{ // try // { // var evt = new QQAddToClusterNeedAuthEvents(this) { QQ = e.QQ, Message = e.Message, Cluster = e.Cluster }; // ChatClient.QQPool.OnEvent(evt); // } // catch (Exception ex) // { // this.OnLog($"Qqclient_AddToClusterNeedAuth Error:{ex.Message}"); // } //} private void Qqclient_AddMeFriendNeedAuth(object sender, AddMeFriendNeedAuthQQEventArgs e) { try { var evt = new QQAddMeNeedAuthEvents(this) { QQ = e.QQ, Nickname = e.Nick, Message = e.Message }; ChatClient.QQPool.OnEvent(evt); } catch (Exception ex) { this.OnLog($"Qqclient_AddMeFriendNeedAuth Error:{ex.Message}"); } } private void Qqclient_ReceiveTempIM(object sender, ReceiveTempIMQQEventArgs e) { try { var friend = qqclient.GetFriend(e.QQ); var temp = new QQReceiveFriendMsgEvents(this) { TempMsgID = e.ExternalId, QQ = e.QQ, Message = e.Message, Nickname = (friend == null ? string.Empty : friend.NickName) }; ChatClient.QQPool.OnEvent(temp); } catch (Exception ex) { this.OnLog($"Qqclient_ReceiveTempIM Error:{ex.Message}"); } } /// /// 记录QQ重新登录 /// Dictionary QQReLoginDic = new Dictionary(); private void Qqclient_LostConnection(object sender, LostConnectionQQEventArgs e) { //看看是否有已登录的,并且自己还没有被移除 var v = ChatClient.QQPool.QQClients.Where(f => f.Value.IsLogin); if (v != null && ChatClient.QQPool.QQClients.Values.Contains(this)) { ChatClient.QQPool.OnEvent(new QQLostConnectionEvents(this, e.Message)); } } internal override void UnRegisterEvent() { if (qqclient != null && IsRegisterEvent) { IsRegisterEvent = false; qqclient.ReceiveClusterIM -= Qqclient_ReceiveClusterIM; qqclient.LostConnection -= Qqclient_LostConnection; qqclient.ReceiveNormalIM -= Qqclient_ReceiveNormalIM; qqclient.ReceiveTempIM -= Qqclient_ReceiveTempIM; qqclient.AddMeFriend -= Qqclient_AddMeFriend; qqclient.AddMeFriendNeedAuth -= Qqclient_AddMeFriendNeedAuth; qqclient.AddedToCluster -= Qqclient_AddedToCluster; //qqclient.AddToClusterNeedAuth -= Qqclient_AddToClusterNeedAuth; } } private void Qqclient_ReceiveClusterIM(object sender, ReceiveClusterIMQQEventArgs e) { try { if (e.ClusterMember.QQ == this.QQ) return; var client = sender as QQClient; this.OnLog($"QQ({(client == null ? 0 : client.User.QQ)})->群消息->{e.ClusterMember.Nick}({e.ClusterMember.QQ})在[{e.Cluster.Name}({e.Cluster.ExternalId})]群说:{e.Message}"); var temp = new QQReceiveGroupMsgEvents(this) { QQ = e.ClusterMember.QQ, Message = e.Message, Nickname = e.ClusterMember.Nick, GroupName = e.Cluster.Name, GroupId = e.Cluster.ExternalId }; ChatClient.QQPool.OnEvent(temp); } catch (Exception ex) { this.OnLog($"Qqclient_ReceiveNormalIM Error:{ex.Message}"); } } private void Qqclient_ReceiveNormalIM(object sender, ReceiveNormalIMQQEventArgs e) { try { if (e.QQ == this.QQ) return; var client = sender as QQClient; this.OnLog($"QQ({(client == null ? 0 : client.User.QQ)})->私消息->{string.Empty}({e.QQ})说:{e.Message}"); var friend = qqclient.GetFriend(e.QQ); var temp = new QQReceiveFriendMsgEvents(this) { QQ = e.QQ, Message = e.Message, Nickname = (friend != null ? friend.NickName : string.Empty) }; ChatClient.QQPool.OnEvent(temp); } catch (Exception ex) { this.OnLog($"Qqclient_ReceiveNormalIM Error:{ex.Message}"); } } public override void AerifyAddMe(uint QQ, bool Agree) { try { if (IsLogin) qqclient.AgreeFriendInvite(QQ, (byte)(Agree ? 4 : 5)); } catch (Exception ex) { this.OnLog($"Qqclient_ReceiveNormalIM Error:{ex.Message}"); } } class QQMessagePack { private string content; List needMessage; public QQMessagePack(string Message) { this.content = Message; this.needMessage = GetNeedMessage(); } #region 返回一个随机表情 private static string Expression = "[微笑],[憨笑],[呲牙],[爱心],[啤酒],[太阳],[礼物],[抱拳],[咖啡],[调皮],[激动],[回头],[色],[愉快],[爱情],[飞吻],[跳跳],[发抖],[转圈],[献吻],[耶],[红包],[嘿哈]"; private static List ExpressionList = null; private static Random random = new Random(); public static string FindRandomExpression() { if (ExpressionList == null) ExpressionList = Expression.Split(',').ToList(); return ExpressionList[random.Next(ExpressionList.Count)]; } #endregion private List GetNeedMessage() { List _msgs = new List(); if (string.IsNullOrEmpty(content)) return _msgs; content = content.Replace("\r\n", "\n").Trim().Replace("[时间]", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); var msgs = content.Split(new string[] { "[分段]" }, StringSplitOptions.RemoveEmptyEntries); try { foreach (var msg in msgs) { var message = msg.Trim(); if (string.IsNullOrEmpty(message)) continue; message = message.Contains("[随机表情]") ? message.Replace("[随机表情]", 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}"); //_msgs.Add(reg.Groups[1].Value); } } //发送XML消息 if (message.StartsWith("")) { _msgs.Add("暂不支持微信卡片消息!"); } //发送图片消息 var matchs = Regex.Matches(message, @"\[图片\=([^\]]+)\]", RegexOptions.IgnoreCase); foreach (Match match in matchs) { _msgs.Add($"[image={ match.Groups[1].Value}]"); } message = Regex.Replace(message, @"\[图片\=([^\]]+)\]", ""); //发送语音消息 matchs = Regex.Matches(message, @"\[语音\=([^\]]+)\]", RegexOptions.IgnoreCase); foreach (Match item in matchs) { //暂不支持语音消息 } message = Regex.Replace(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) { //暂不支持视频消息 } } } message = Regex.Replace(message, @"\[视频\=([^\]]+)\]", ""); matchs = Regex.Matches(message, @"\[卡片\=([^\]]+)\]", RegexOptions.IgnoreCase); foreach (Match item in matchs) { //暂不支持卡片 //SendCard(username, item.Groups[1].Value == "自己" ? User.Username : item.Groups[1].Value); } message = Regex.Replace(message, @"\[卡片\=([^\]]+)\]", ""); if (string.IsNullOrEmpty(message)) continue; if (message.StartsWith("\r\n")) message = message.Substring("\r\n".Length); if (message.StartsWith("\n")) message = message.Substring("\n".Length); _msgs.Add(message); } } catch (Exception) { } return _msgs; } private int index = 0; public string NextMessage() { if (needMessage.Count == index) return string.Empty; string msg = needMessage[index]; var reg = Regex.Match(msg, @"\[延迟=(\d+)\]"); if (reg.Success) { Thread.Sleep(int.Parse(reg.Groups[1].Value) * 1000); } index++; return msg; } } public override void SendFriendImage(uint QQ, string ImageSrc) { try { if (qqclient != null) qqclient.SendMessage(QQ, $"[image={ImageSrc}]"); } catch (Exception) { } } public override void SendFriendMessage(uint QQ, string Message) { if (IsLogin) { try { QQMessagePack pack = new QQMessagePack(Message); do { var msg = pack.NextMessage(); if (string.IsNullOrEmpty(msg)) break; qqclient.SendMessage(QQ, msg); } while (true); } catch (Exception) { } } } public override void SendGroupImage(uint GroupId, string ImageSrc) { try { if (qqclient != null) qqclient.SendClusterMessage(GroupId, $"[image={ImageSrc}]"); } catch (Exception) { } } public override void SendGroupMessage(uint GroupId, string Message) { if (IsLogin) { try { QQMessagePack pack = new QQMessagePack(Message); do { var msg = pack.NextMessage(); if (string.IsNullOrEmpty(msg)) break; //this.OnLog($"准备发送{GroupId}-{Message}"); qqclient.SendClusterMessage(GroupId, msg); } while (true); } catch (Exception) { } } } public override void SendTempMessage(uint QQ, string Message) { if (IsLogin) { try { QQMessagePack pack = new QQMessagePack(Message); do { var msg = pack.NextMessage(); if (string.IsNullOrEmpty(msg)) break; var result = qqclient.SendTempMessage(QQ, msg); Console.WriteLine("result = " + result); } while (true); } catch (Exception) { } } } } }