old_flsystem/类库/Chat.Framework/WXSdk/Implement/WXClientImpl_QYHOOK.cs

1251 lines
61 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Chat.Framework.PCRobotSDK.WechatEvents;
using Chat.Framework.PCRobotSDK.WorkWechatEvents;
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.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
namespace Chat.Framework.WXSdk.Implement
{
/// <summary>
/// 企业PC机器人
/// </summary>
public class WXClientImpl_QYHOOK : WeixinBase
{
/// <summary>
/// 上次心跳时间
/// </summary>
public DateTime HeartBreakTime { get; internal set; } = DateTime.MinValue;
/// <summary>
/// 企业机器人
/// </summary>
/// <param name="weixinhao">企业账号</param>
/// <param name="usernick">企业昵称</param>
/// <param name="uin">企业账号</param>
public WXClientImpl_QYHOOK(string weixinhao, string usernick, long uin = -1)
{
WeixinType = WeixinType.QYHook微信;
WeixinHao = weixinhao;
User = new WeixinBaseUser(WeixinHao, usernick, uin);
Friends = new Dictionary<string, Friend>();
GroupMembers = new Dictionary<string, GroupMember[]>();
HeartBreakTime = DateTime.Now;
RequestContact();
base.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]));
}
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
{
if (User.Uin.ToString() != "0" && User.Uin.ToString() != "-1")
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})】授权异常:" + $".{(WXClientTool.auth_info != null ? JsonConvert.SerializeObject(WXClientTool.auth_info) : string.Empty)}"
});
status = WxStatus.;
//LoginOut($"【{User.Username}{User.Nick})】{ex.Message}");
Dispose();
ChatClient.LoginOutWeixin(WeixinHao, $"【{User.Uin}{User.Nick})】{ex.Message}");
}
}
}
else
{
LogHelper.GetSingleObj().Debug("", $"QY微信状态修改:{this.WeixinHao} - {status}");
ChatClient.LoginOutWeixin(WeixinHao);
}
base.ChangeStatus(status, e);
}
/// <summary>
/// 退出消息
/// </summary>
/// <param name="message"></param>
public override void LoginOut(string message)
{
//发送指令 强制退出易转发那边的微信
WechatPack pack = new WechatPack(this);
pack.SendServer(PCRobotCMD.closeWechat, message);
try
{
LogHelper.GetSingleObj().Debug("", $"LoginOutQY带提示:{this.WeixinHao}");
}
catch (Exception)
{ }
}
/// <summary>
/// 退出登录
/// </summary>
public override void LoginOut()
{
//发送指令 强制退出易转发那边的微信
WechatPack pack = new WechatPack(this);
pack.SendServer(PCRobotCMD.closeWechat);
try
{
LogHelper.GetSingleObj().Debug("", $"LoginOutQY不带提示:{this.WeixinHao}");
}
catch (Exception)
{ }
}
public override void ShowLogin()
{
throw new Exception("请在易转发,客户端执行登陆!");
}
/// <summary>
/// 获得好友或群组信息
/// </summary>
public override Friend GetContact(string wxid, bool refresh = false)
{
lock (this.Friends)
{
try
{
if (refresh || !Friends.ContainsKey(wxid))
{
var msg_id = GetWxidInfo(wxid);
if (!string.IsNullOrEmpty(msg_id))
{
var rst = ChatClient.PCRobotPool.PackHist.GetResult(msg_id).Result;
if (rst != null)
{
//{"avatar":"http://wx.qlogo.cn/mmhead/GPyw0pGicibl4KQicb5bXGu2SibrykeGOH5IicK2d8LTfbA11zNB2A2SoKg/0","conversation_id":"S:1688853956558440_7881301364988874","corp_id":null,"desc":"","external_job":null,"nickname":"","position":"","realname":"","remark":"","sex":2,"user_id":"7881301364988874","username":"18","manager_wxid":null,"is_manager":0,"member_list":null}
try
{
var contact = rst as WorkWechatContact;
if (!string.IsNullOrWhiteSpace(contact.Message))
{
var data = @"{""data"":" + contact.Message + "}";
var _result = HttpExtend.JsonToDictionary(data);
if (_result != null)
{
var result = _result["data"] as Dictionary<string, object>;
var avatar = result["avatar"]?.ToString();
var username = result["username"]?.ToString();
var user_id = result["user_id"]?.ToString();
var sex = int.Parse(result["sex"]?.ToString());
var remark = result["remark"]?.ToString();
var manager_wxid = result["manager_wxid"]?.ToString();
Friends[user_id] = new Friend() { SmallHeadImgUrl = avatar, BigHeadImgUrl = avatar, City = string.Empty, Sex = sex, NickName = username, Remark = remark, UserName = user_id, Alias = user_id, ExtInfo = string.Empty, Province = string.Empty, ChatRoomOwner = manager_wxid, ChatroomVersion = string.Empty };
}
}
}
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 };
}
}
public Dictionary<string, GroupMember[]> GroupMembers { get; private set; }
/// <summary>
/// 获取群成员信息
/// </summary>
/// <param name="groupid"></param>
/// <param name="wxid"></param>
/// <returns></returns>
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)
{
//{"conversation_id":"R:10696053211008104","total":3,"friends":[{"avatar":"http://wx.qlogo.cn/mmhead/GPyw0pGicibl4KQicb5bXGu2SibrykeGOH5IicK2d8LTfbA11zNB2A2SoKg/0","conversation_id":"S:1688853956558440_7881301364988874","corp_id":null,"desc":"","external_job":null,"nickname":"18","position":"","realname":"","remark":"","sex":2,"user_id":"7881301364988874","username":null,"manager_wxid":"","is_manager":0,"member_list":""}]}
try
{
var contact = rst as WorkWechatContact;
if (!string.IsNullOrWhiteSpace(contact.Message))
{
var data = @"{""data"":" + contact.Message + "}";
var _result = HttpExtend.JsonToDictionary(data);
if (_result != null)
{
var result = _result["data"] as Dictionary<string, object>;
var conversation_id = result["conversation_id"]?.ToString();
var total = result["total"]?.ToString();
var friend = (result["friends"] as ArrayList)[0] as Dictionary<string, object>;
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(conversation_id))
{
GroupMembers.Add(conversation_id, new GroupMember[] { });
}
var gm = GroupMembers[conversation_id].ToList();
if (gm.FirstOrDefault(f => f.Username == wxid) == null)
{
gm.Add(new GroupMember() { SmallHeadImgUrl = avatar, BigHeadImgUrl = avatar, Groupid = conversation_id, Username = wxid, NickName = nickname });
GroupMembers[conversation_id] = gm.ToArray();
}
//Friends[user_id] = new Friend() { SmallHeadImgUrl = avatar, BigHeadImgUrl = avatar, City = string.Empty, Sex = sex, NickName = nickname, Remark = remark, UserName = user_id, Alias = user_id, ExtInfo = string.Empty, Province = string.Empty, ChatRoomOwner = manager_wxid, ChatroomVersion = string.Empty };
}
}
}
}
catch (Exception ex)
{
this.WriteLog($"获取 Member 异常 :" + ex.Message + " - " + ex.StackTrace);
}
}
}
}
//if (!GroupMembers.ContainsKey(groupid)) return null;
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 };
}
/// <summary>
/// 获取群成员信息
/// </summary>
/// <param name="groupid"></param>
/// <param name="wxid"></param>
/// <returns></returns>
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)
{
//{"conversation_id":"R:10696053211008104","total":3,"friends":[{"avatar":"http://wx.qlogo.cn/mmhead/GPyw0pGicibl4KQicb5bXGu2SibrykeGOH5IicK2d8LTfbA11zNB2A2SoKg/0","conversation_id":"S:1688853956558440_7881301364988874","corp_id":null,"desc":"","external_job":null,"nickname":"18","position":"","realname":"","remark":"","sex":2,"user_id":"7881301364988874","username":null,"manager_wxid":"","is_manager":0,"member_list":""}]}
try
{
var contact = rst as WorkWechatContact;
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<string, object>;
var conversation_id = result["conversation_id"]?.ToString();
var total = result["total"]?.ToString();
var friend = (result["friends"] as ArrayList)[0] as Dictionary<string, object>;
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(conversation_id))
{
GroupMembers.Add(conversation_id, new GroupMember[] { });
}
var gm = GroupMembers[conversation_id].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 = conversation_id, Username = wxid, NickName = nickname });
GroupMembers[conversation_id] = gm.ToArray();
}
//Friends[user_id] = new Friend() { SmallHeadImgUrl = avatar, BigHeadImgUrl = avatar, City = string.Empty, Sex = sex, NickName = nickname, Remark = remark, UserName = user_id, Alias = user_id, ExtInfo = string.Empty, Province = string.Empty, ChatRoomOwner = manager_wxid, ChatroomVersion = string.Empty };
}
}
catch (Exception ex)
{
this.WriteLog($"获取 Member 异常 :" + ex.Message + " - " + ex.StackTrace);
}
}
}
}
//if (!GroupMembers.ContainsKey(groupid)) return null;
if (!GroupMembers.ContainsKey(groupid)) GroupMembers[groupid] = new GroupMember[] { new GroupMember() { Groupid = groupid, Username = wxid } };
var member = GroupMembers[groupid].FirstOrDefault(f => f.Username == wxid);
return member;
}
catch (Exception ex)
{
this.WriteLog($"获取群信息:{ex.Message}");
}
return null;
}
/// <summary>
/// 创建群
/// </summary>
/// <param name="wxids"></param>
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;
}
#region xx
/// <summary>
/// 请求获取群信息
/// </summary>
/// <param name="groupid"></param>
//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}");
// }
//}
//private readonly object FriendsLock = new object();
//Action<string> FriendsAction;
// private void GetFriends(string friendsJson)
// {
// try
// {
// this.WriteLog($"GetFriends = {friendsJson}");
// lock (FriendsLock)
// {
// #region
// var dic = HttpExtend.JsonToDictionary(friendsJson);
// if (dic != null && dic.ContainsKey("data"))
// {
// var data = dic["data"] as System.Collections.ArrayList;
// foreach (Dictionary<string, object> 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 avatar = item["avatar"]?.ToString();
// var conversation_id = item["conversation_id"]?.ToString();
// var corp_id = item["corp_id"]?.ToString();
// var desc = item["desc"]?.ToString();
// var external_job = item["external_job"]?.ToString();
// var nickname = item["nickname"]?.ToString();
// var position = item["position"]?.ToString();
// var realname = item["realname"]?.ToString();
// var remark = item["remark"]?.ToString();
// var sex = int.Parse(item["sex"]?.ToString());
// var username = item["username"]?.ToString();
// var user_id = item["user_id"]?.ToString();
// var manager_wxid = item["manager_wxid"]?.ToString();
// var is_manager = int.Parse(item["is_manager"].ToString());
// Friends[user_id] = new Friend() { SmallHeadImgUrl = avatar, BigHeadImgUrl = avatar, City = string.Empty, Sex = sex, NickName = nickname, Remark = remark, UserName = user_id, Alias = user_id, ExtInfo = string.Empty, Province = string.Empty, ChatRoomOwner = manager_wxid, ChatroomVersion = string.Empty };
// #region 获取群详细信息
// if (user_id.Contains("R:"))
// {
// GetGroupInfo(user_id);
// Thread.Sleep(5);
// }
// #endregion
// }
// }
// #endregion
// }
// this.WriteLog($"GetFriends@ = {HttpHelper.ObjectToJson(Friends)}");
// }
// catch (Exception ex)
// {
// this.WriteLog($@"获取成员失败:{ex.Message} - {ex.StackTrace}
//friendsJson = {friendsJson}");
// }
//}
// private readonly object GroupMemberLock = new object();
// Action<string> GroupMembersAction;
// private void GetGroupMembers(string friendsJson)
// {
// try
// {
// this.WriteLog($"GetGroupMembers = {friendsJson}");
// lock (GroupMemberLock)
// {
// #region
// var dic = HttpExtend.JsonToDictionary(friendsJson);
// if (dic != null && dic.ContainsKey("data"))
// {
// var data = dic["data"] as Dictionary<string, object>;
// //var total_member = int.Parse(data["total_member"].ToString());
// var gId = data["conversation_id"].ToString();
// var list = data["member_list"] as ArrayList;
// List<GroupMember> groups = null;
// if (GroupMembers.ContainsKey(gId))
// groups = GroupMembers[gId].ToList();
// else
// groups = new List<GroupMember>();
// foreach (Dictionary<string, object> 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["user_id"]?.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
// }
// this.WriteLog($"GetGroupMembers@ = {HttpHelper.ObjectToJson(GroupMembers)}");
// }
// catch (Exception ex)
// {
// this.WriteLog($@"获取群成员失败:{ex.Message} - {ex.StackTrace}
//friendsJson = {friendsJson}");
// }
// }
#endregion
/// <summary>
/// 分析hook服务器过来的事件
/// </summary>
/// <param name="obj"></param>
public override void Receive(object obj)
{
var cmd = string.Empty;
try
{
//LogHelper.GetSingleObj().Debug("", $"获取到解析后的数据_QY = {obj.GetType().Name},Uin:{this.User.Uin},{this.User.Nick}({this.WeixinHao})");
var events = ChatClient.Events;
if (obj.GetType() == typeof(WorkWechatReceiveMsgEvents))//私聊和群聊消息
{
var evt = obj as WorkWechatReceiveMsgEvents;
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(WorkWechatApplyFriendEvents))//申请添加我为好友,需要审核
{
if (Util.GetNoAnalysisConfig().Count == 0 || Util.GetNoAnalysisConfig().Contains("新申请"))
{
var evt = obj as WorkWechatApplyFriendEvents;
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(WorkWechatNewFriendEvents))
{
if (Util.GetNoAnalysisConfig().Count == 0 || Util.GetNoAnalysisConfig().Contains("新好友"))
{
var evt = obj as WorkWechatNewFriendEvents;
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(WorkWechatReicevePayEvents))//收到支付
{
if (Util.GetNoAnalysisConfig().Count == 0 || Util.GetNoAnalysisConfig().Contains("转账"))
{
var evt = obj as WorkWechatReicevePayEvents;
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(WorkWechatNewMemerEvents))//新人入群
{
if (Util.GetNoAnalysisConfig().Count == 0 || Util.GetNoAnalysisConfig().Contains("新群友"))
{
var evt = obj as WorkWechatNewMemerEvents;
cmd = evt.Data.Cmd.ToString();
var group = GetContact(evt.Data.GroupId);
if (group == null) return;
events.OnEvent(new WXNewMemer(this) { Group = group, GroupId = evt.Data.GroupId, MemberNicks = evt.Data.MemberNick, SourceNick = Util.RemoveEmoji(evt.Data.SourceNick), SourceName = evt.Data.SourceName });
}
}
else if (obj.GetType() == typeof(WorkWechatContactListEvents))//获得通讯录列表
{
//var evt = obj as WorkWechatContactListEvents;
//cmd = evt.Data.Cmd.ToString();
//FriendsAction = GetFriends;
//FriendsAction(evt.Data.Message);
}
else if (obj.GetType() == typeof(WorkWechatGroupMemberEvents))//获得群成员
{
//var evt = obj as WorkWechatGroupMemberEvents;
//cmd = evt.Data.Cmd.ToString();
//GroupMembersAction = GetGroupMembers;
//GroupMembersAction(evt.Data.Message);
}
else if (obj.GetType() == typeof(WechatStatusEvents))//微信状态改变
{
var evt = obj as WechatStatusEvents;
cmd = evt.Cmd.ToString();
ChangeStatus(evt.Status == PCRobot.Pack.Status.线 ? WxStatus.线 : WxStatus.退);
this.HeartBreakTime = DateTime.Now;
}
}
catch (Exception ex)
{
this.WriteLog($"PC服务器消息处理异常【{cmd}】- {ex.Message},{ex.StackTrace}");
}
}
/// <summary>
/// 好友列表
/// </summary>
public Dictionary<string, Friend> Friends { get; private set; }
public override List<T> FindFriends<T>()
{
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<List<T>>(data);
}
}
catch (Exception ex)
{
this.WriteLog($"获取企业外部通讯录用户异常:" + ex.Message + " - " + ex.StackTrace);
}
}
}
}
catch (Exception ex)
{ }
return null;
}
/// <summary>
/// 请求获取联系人
/// </summary>
/// <param name="wxid"></param>
public string RequestContact()
{
try
{
WechatPack pack = new WechatPack(this);
return pack.SendServer(PCRobotCMD.getContact);
}
catch (Exception ex)
{ }
return string.Empty;
}
/// <summary>
/// 获取指定的用户
/// </summary>
public string GetWxidInfo(string wxid)
{
try
{
WechatPack pack = new WechatPack(this);
return pack.SendServer(PCRobotCMD.getWxidInfo, wxid);
}
catch (Exception ex)
{ }
return string.Empty;
}
/// <summary>
/// 获取指定的用户或群的信息
/// </summary>
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;
}
/// <summary>
/// 获取指定的用户或群的信息
/// </summary>
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;
}
/// <summary>
/// 领取转账
/// </summary>
/// <param name="Invalidtime"></param>
/// <param name="Transferid"></param>
/// <param name="FromUsername"></param>
/// <returns></returns>
public override int TenPayTransferConfirm(string Invalidtime, string Transferid, string FromUsername)
{
WechatPack pack = new WechatPack(this);
pack.SendServer(PCRobotCMD.getPay, HttpHelper.ObjectToJson(new Dictionary<string, string>() { { "Invalidtime", Invalidtime }, { "Transferid", Transferid } }), WechatMsgType., FromUsername);
return 0;
}
/// <summary>
/// 发送卡片
/// </summary>
/// <param name="username"></param>
/// <param name="friendwxid"></param>
public override void SendCard(string username, string friendwxid)
{
WechatPack pack = new WechatPack(this);
pack.SendServer(PCRobotCMD.sendCard, friendwxid, WechatMsgType., username);
}
/// <summary>
/// 邀请入群发送名片 和 AddChatRoomMember 功能一样
/// </summary>
/// <param name="username"></param>
/// <param name="groupId"></param>
/// <returns></returns>
public override string InviteIntoGroup(string username, string groupId)
{
WechatPack pack = new WechatPack(this);
pack.SendServer(PCRobotCMD.inviteIntoGroup, groupId, WechatMsgType., username);
return string.Empty;
}
/// <summary>
/// 邀请入群发送名片 和 AddChatRoomMember 功能一样
/// </summary>
/// <param name="groupid"></param>
/// <param name="members"></param>
public override void AddChatRoomMember_40Down(string groupid, string members)
{
WechatPack pack = new WechatPack(this);
pack.SendServer(PCRobotCMD.inviteIntoGroup, groupid, WechatMsgType., members);
}
/// <summary>
/// 邀请入群发送名片 和 AddChatRoomMember_40Down 功能一样
/// </summary>
/// <param name="groupid"></param>
/// <param name="members"></param>
public override void AddChatRoomMember(string groupid, string members)
{
AddChatRoomMember_40Down(groupid, members);
}
/// <summary>
/// 删除群用户
/// </summary>
/// <param name="username"></param>
/// <param name="groupId"></param>
/// <returns></returns>
public override string DeleteGroupMember(string username, string groupId)
{
WechatPack pack = new WechatPack(this);
pack.SendServer(PCRobotCMD.deleteGroupMember, username, WechatMsgType., groupId);
return string.Empty;
}
/// <summary>
/// 发送图片
/// </summary>
/// <param name="username"></param>
/// <param name="address"></param>
public override void SendImage(string username, string address)
{
try
{
byte[] ImangByte = null;
string extension = Path.GetExtension(address);
if (address.StartsWith("http", StringComparison.InvariantCultureIgnoreCase))
{
ImangByte = new System.Net.WebClient().DownloadData(address);
byte[] imageHash = new MD5CryptoServiceProvider().ComputeHash(ImangByte);
//图片哈希值
string StrimageHash = Util.HexToStr(imageHash);
string FileName = StrimageHash + extension;
string FilePath = Path.Combine(Util.MapPath("cache\\image", true), FileName);
if (!File.Exists(FilePath))
{
File.WriteAllBytes(FilePath, ImangByte);
}
if (File.Exists(FilePath))
address = FilePath;
else
throw new Exception("图片异常");
}
WechatPack pack = new WechatPack(this);
pack.SendServer(PCRobotCMD.sendImg, address, WechatMsgType., username);
}
catch (Exception ex)
{
this.WriteLog($"发送图片失败:{ex.Message} - {ex.StackTrace}");
}
}
public override void SendProgramMessage(string username, string ghid, string wxid, string name, string title, string enterpoint, string headimg, string image_key1, string image_key2, string image_key3, string image_size)
{
try
{
WechatPack pack = new WechatPack(this);
pack.SendServer(PCRobotCMD.sendProgramMessage, JsonConvert.SerializeObject(new { data = new { conversation_id = username, ghid = ghid, wxid = wxid, name = name, title = title, enterpoint = enterpoint, headimg = headimg, image_key1 = image_key1, image_key2 = image_key2, image_key3 = image_key3, image_size = image_size } }), WechatMsgType., username);
}
catch (Exception ex)
{
this.WriteLog("SendProgramMessage ERROR:" + ex.Message);
}
}
/// <summary>
/// 发送消息
/// </summary>
/// <param name="username"></param>
/// <param name="message"></param>
/// <param name="atUsername"></param>
/// <returns></returns>
public override Task<bool> 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.ToLower().Trim().StartsWith("<appmsg") && message.ToLower().Trim().EndsWith("</appmsg>"))
{
//if (!message.ToLower().Contains("<weappinfo>"))
if (true)
{
message = $@"<msg><fromusername>{WeixinHao}</fromusername><scene>0</scene><commenturl></commenturl>{msg/*.Replace("&", "&amp;")*/}<appinfo><version>1</version><appname>Window wechat</appname></appinfo></msg>";
pack.SendServer(PCRobotCMD.sendTxt, message, WechatMsgType., username);
}
else
{
/*
{"data":{"content_type":78,"conversation_id":"S:1688852952419302_1688853086316483","enterpoint":"pages/index.html","ghid":"gh_0ed5d82fd775@app","headimg":"http://mmbiz.qpic.cn/mmbiz_png/R5xk2bJZhgSL24GXicQ24b8h7zwWKY9Eia4Pl4RJibFml6k2icWj8H7rbFmiaiakt7wPwx7vUgrKic62PBZpdTTwdsJ2g/640?wx_fmt=png&wxfrom=200","image_key1":"3069020102046230600201000204b84e8be602030f4243020412cf9b24020460df2504042439643136386638302d303661652d343136322d386438342d6265643138623961356665620201000203024ef0041083bf4e722024dbcfc797cfaa1e97ac090201010201000400","image_key2":"13e72cff06014d4e9d392fd059228092","image_key3":"83bf4e722024dbcfc797cfaa1e97ac09","image_size":151279,"is_pc":0,"local_id":"18","name":"通信行程卡","receiver":"1688853086316483","send_time":"1625236741","sender":"1688852952419302","sender_name":"滴滴滴","server_id":"1000455","title":"通信行程卡","wxid":"wx8f446acf8c4a85f5"},"type":11066}
*/
SendProgramMessage(username, "gh_0ed5d82fd775@app", "wx8f446acf8c4a85f5", "兑换助兑换助兑换助", "兑换助兑换助", "pages/11111111111111", "http://mmbiz.qpic.cn/mmbiz_png/R5xk2bJZhgSL24GXicQ24b8h7zwWKY9Eia4Pl4RJibFml6k2icWj8H7rbFmiaiakt7wPwx7vUgrKic62PBZpdTTwdsJ2g/640?wx_fmt=png&wxfrom=200", "3069020102046230600201000204b84e8be602030f4243020412cf9b24020460df2504042439643136386638302d303661652d343136322d386438342d6265643138623961356665620201000203024ef0041083bf4e722024dbcfc797cfaa1e97ac090201010201000400", "13e72cff06014d4e9d392fd059228092", "83bf4e722024dbcfc797cfaa1e97ac09", "151279");
}
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("", $"QY图片压缩异常:{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)
{
SendCard(username, item.Groups[1].Value == "自己" ? User.Username : item.Groups[1].Value);
}
message = Regex.Replace(message, @"\[卡片\=([^\]]+)\]", "");
message = DelayMess(message);
if (string.IsNullOrWhiteSpace(message)) continue;
if (message.StartsWith("\r\n")) message = message.Substring("\r\n".Length);
if (message.StartsWith("\n")) message = message.Substring("\n".Length);
//pack.SendServer(PCRobotCMD.sendTxt, message, WechatMsgType.文本, username);
pack.SetNextData(new ServerWechatMsg() { Cmd = PCRobotCMD.sendTxt, ToMessage = message, ToMessageType = WechatMsgType., ToUsername = username });
RunSendMessageQueue(pack);
}
return true;
}
catch (Exception ex)
{
this.WriteLog("SendMessage ERROR:" + ex.Message);
return false;
}
});
}
#region
/// <summary>
/// 需要发送的消息队列
/// </summary>
private ConcurrentQueue<WechatPack> SendMessageQueue { get; set; } = new ConcurrentQueue<WechatPack>();
private object lock_sendmessage = new object();
private bool lock_sendmessage_ing = false;
private int fragmentCount = 0;
private DateTime fragmentTime = DateTime.MinValue;
private Random random = new Random();
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;
}
else
Thread.Sleep(60);
}
else
Thread.Sleep(60);
#endregion
}
}
}
catch (Exception)
{
}
finally
{
lock_sendmessage_ing = false;
}
});
}
}
#endregion
/// <summary>
/// 同意添加我为好友
/// </summary>
/// <param name="token"></param>
/// <returns></returns>
public override string AgreeAddMe(string token)
{
WechatPack pack = new WechatPack(this);
pack.SendServer(PCRobotCMD.agreeFriend, token, WechatMsgType., string.Empty);
return string.Empty;
}
/// <summary>
/// 删除好友
/// </summary>
/// <param name="username"></param>
/// <returns></returns>
public override string DeleteFriend(string username)
{
WechatPack pack = new WechatPack(this);
pack.SendServer(PCRobotCMD.deleteFriend, username, WechatMsgType., string.Empty);
return string.Empty;
}
/// <summary>
/// 修改用户信息
/// </summary>
/// <param name="username"></param>
/// <param name="type"></param>
/// <param name="remark"></param>
public override void EditContacts(string username, EditContactsType type, string remark = "")
{
Task.Run(() =>
{
for (int i = 0; i < 3; i++)
{
if (type == EditContactsType.)
{
WechatPack pack = new WechatPack(this);
pack.SendServer(PCRobotCMD.editContacts, remark, WechatMsgType., username);
Thread.Sleep(500);
}
//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("本协议不支持该操作");
}
});
}
/// <summary>
/// 消息延迟
/// </summary>
/// <param name="message"></param>
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;
}
}
}