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

2703 lines
119 KiB
C#
Raw Normal View History

2022-09-20 03:10:29 +00:00
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
{
/// <summary>
/// 普通PC机器人
/// </summary>
public class WXClientImpl_HOOK : WeixinBase
{
/// <summary>
/// 上次心跳时间
/// </summary>
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<string, Friend>();
GroupMembers = new Dictionary<string, GroupMember[]>();
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]));
}
/// <summary>
/// pc普通微信状态改变
/// </summary>
/// <param name="status">状态</param>
/// <param name="e">事件</param>
/// <param name="is_next">没用</param>
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("请在易转发,客户端执行登陆!");
}
/// <summary>
/// 获得好友或群组信息
/// </summary>
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<string, object>;
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<string> 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<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 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<string> 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<string, object>;
// var total_member = int.Parse(data["total_member"].ToString());
// var gId = data["wxid"].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["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
/// <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>
/// 检测僵尸最后获取Friends集合判断里面的Ticket的值不为空为僵尸
/// </summary>
public void GetZombie()
{
try
{
WechatPack send = new WechatPack(this);
send.SendServer(PCRobotCMD.getZombie);
}
catch (Exception) { }
}
/// <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>
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)
{
//
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<string, object>;
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<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(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 };
}
/// <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)
{
//
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<string, object>;
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<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(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;
}
/// <summary>
/// 创建群
/// </summary>
/// <param name="wxids">用户账号需要3个或者以上</param>
/// <returns></returns>
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;
}
/// <summary>
/// 创建群
/// </summary>
/// <param name="wxids">用户账号用,分隔</param>
/// <returns></returns>
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)
{ }
}
/// <summary>
/// 获取群基本消息(不包含群成员)
/// </summary>
/// <returns></returns>
public override List<Friend> GetGroupsNotInMember()
{
List<Friend> friends = new List<Friend>();
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<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 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;
}
/// <summary>
/// 检测URL在微信中是否有效
/// </summary>
/// <param name="url">要检查的链接</param>
/// <returns>返回true为连接没有屏蔽</returns>
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;
2022-12-13 04:37:59 +00:00
return (checkUrl != null && (checkUrl.Status == 0 || checkUrl.Status == -1));
2022-09-20 03:10:29 +00:00
}
catch (Exception ex)
{
this.WriteLog($"检测链接是否被封异常:" + ex.Message + " - " + ex.StackTrace);
}
}
}
return false;
}
/// <summary>
///
/// </summary>
/// <param name="url"></param>
public override void OpenUrl(string url)
{
WechatPack pack = new WechatPack(this);
var msg_id = pack.SendServer(PCRobotCMD.openUrl, url);
}
/// <summary>
/// 清理历史聊天记录
/// </summary>
public override void ClearChatHistoryMsg()
{
WechatPack pack = new WechatPack(this);
pack.SendServer(PCRobotCMD.clearChatHistoryMsg);
}
/// <summary>
/// 设置会话已读
/// </summary>
public override void SetSessionReadedMsg(string wxid)
{
WechatPack pack = new WechatPack(this);
pack.SendServer(PCRobotCMD.setSessionReadedMsg, wxid);
}
/// <summary>
/// 修改群聊名称
/// </summary>
/// <param name="new_name">新的群名</param>
/// <param name="groupId">群id</param>
public override void SetRoomName(string new_name, string groupId)
{
WechatPack pack = new WechatPack(this);
pack.SendServer(PCRobotCMD.setRoomName, new_name, tousername: groupId);
}
/// <summary>
/// 修改群公告(可用于@全体)
/// </summary>
/// <param name="notice">新公告</param>
/// <param name="groupId">群聊wxid</param>
public override void SetRoomNotice(string notice, string groupId)
{
WechatPack pack = new WechatPack(this);
pack.SendServer(PCRobotCMD.setRoomNotice, notice, tousername: groupId);
}
/// <summary>
/// 设置自己在群中昵称
/// </summary>
/// <param name="nickname">要设置的昵称</param>
/// <param name="groupId">需要设置的群id</param>
public override void ModRoomMyName(string nickname, string groupId)
{
WechatPack pack = new WechatPack(this);
pack.SendServer(PCRobotCMD.modRoomMyName, nickname, tousername: groupId);
}
/// <summary>
/// 设置是否显示群成员昵称
/// </summary>
/// <param name="status">true为开启</param>
/// <param name="groupId">要显示得到群</param>
public override void SetRoomShowMemeberName(bool status, string groupId)
{
WechatPack pack = new WechatPack(this);
pack.SendServer(PCRobotCMD.setRoomShowMemeberName, status.ToString(), tousername: groupId);
}
/// <summary>
/// 修改群聊名称
/// </summary>
/// <param name="newnick">新名称</param>
/// <param name="groupId">群号</param>
public override void ModRoomName(string newnick, string groupId)
{
WechatPack pack = new WechatPack(this);
pack.SendServer(PCRobotCMD.modRoomName, newnick, tousername: groupId);
}
/// <summary>
/// 是否消息免打扰
/// </summary>
/// <param name="status">true为开启</param>
/// <param name="wxid">wxid</param>
public override void SetRecvNotify(bool status, string wxid)
{
WechatPack pack = new WechatPack(this);
pack.SendServer(PCRobotCMD.setRecvNotify, status.ToString(), tousername: wxid);
}
/// <summary>
/// 关注公众号
/// </summary>
/// <param name="wxid">公众号wxid</param>
public override void AddPublicUser(string wxid)
{
WechatPack pack = new WechatPack(this);
pack.SendServer(PCRobotCMD.addPublicUser, tousername: wxid);
}
/// <summary>
/// 开启/关闭防撤回功能
/// </summary>
/// <param name="status">1是开启防撤回0是关闭</param>
public override void SetDisableRevoke(bool status)
{
WechatPack pack = new WechatPack(this);
pack.SendServer(PCRobotCMD.setDisableRevoke, status.ToString());
}
public override List<Dictionary<string, object>> FindCircles()
{
return FindCircle("");
}
public override List<Dictionary<string, object>> FindCircle(string username, string firstPageMd5 = "", long MaxId = 0)
{
return FindCircle(username, MaxId.ToString());
}
private List<Dictionary<string, object>> 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<string, object>;
//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<CirCleInfo> cirCleInfoList = new List<CirCleInfo>();
for (int i = 0; i < objectList.Count; i++)
{
var obj = JsonConvert.SerializeObject(objectList[i]);
if (obj != null)
{
var cInfo = JsonConvert.DeserializeObject<CirCleInfoOri>(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<LikeUserList> likeUList = new List<LikeUserList>();
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<CommentUserList> commentUList = new List<CommentUserList>();
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<Dictionary<string, object>> _objs = new List<Dictionary<string, object>>();
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<Dictionary<string, object>>();
}
/// <summary>
/// 自动授权登录小程序
/// </summary>
/// <param name="appid"></param>
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
/// <summary>
/// 点赞
/// </summary>
private class LikeUserList
{
/// <summary>
///
/// </summary>
public string Username { get; set; }
/// <summary>
///
/// </summary>
public string Nickname { get; set; }
/// <summary>
///
/// </summary>
public int Source { get; set; }
/// <summary>
///
/// </summary>
public int Type { get; set; }
/// <summary>
///
/// </summary>
public string Content { get; set; }
/// <summary>
///
/// </summary>
public int CreateTime { get; set; }
/// <summary>
///
/// </summary>
public int CommentId { get; set; }
/// <summary>
///
/// </summary>
public int ReplyCommentId { get; set; }
/// <summary>
///
/// </summary>
public string ReplyUsername { get; set; }
/// <summary>
///
/// </summary>
public int IsNotRichText { get; set; }
/// <summary>
///
/// </summary>
public int ReplyCommentId2 { get; set; }
/// <summary>
///
/// </summary>
public int CommentId2 { get; set; }
/// <summary>
///
/// </summary>
public int DeleteFlag { get; set; }
/// <summary>
///
/// </summary>
public int CommentFlag { get; set; }
}
/// <summary>
/// 评价
/// </summary>
private class CommentUserList
{
/// <summary>
///
/// </summary>
public string Username { get; set; }
/// <summary>
/// 先森吳
/// </summary>
public string Nickname { get; set; }
/// <summary>
///
/// </summary>
public int Source { get; set; }
/// <summary>
///
/// </summary>
public int Type { get; set; }
/// <summary>
///
/// </summary>
public string Content { get; set; }
/// <summary>
///
/// </summary>
public int CreateTime { get; set; }
/// <summary>
///
/// </summary>
public int CommentId { get; set; }
/// <summary>
///
/// </summary>
public int ReplyCommentId { get; set; }
/// <summary>
///
/// </summary>
public string ReplyUsername { get; set; }
/// <summary>
///
/// </summary>
public int IsNotRichText { get; set; }
/// <summary>
///
/// </summary>
public int ReplyCommentId2 { get; set; }
/// <summary>
///
/// </summary>
public int CommentId2 { get; set; }
/// <summary>
///
/// </summary>
public int DeleteFlag { get; set; }
/// <summary>
///
/// </summary>
public int CommentFlag { get; set; }
}
/// <summary>
/// 朋友圈信息
/// </summary>
private class CirCleInfo
{
/// <summary>
///
/// </summary>
public decimal Id { get; set; }
/// <summary>
///
/// </summary>
public string Username { get; set; }
/// <summary>
///
/// </summary>
public int SnsObjectType { get; set; }
/// <summary>
///
/// </summary>
public string Nickname { get; set; }
/// <summary>
///
/// </summary>
public int CreateTime { get; set; }
/// <summary>
/// <TimelineObject><id>13647904548865061200</id><username>wxid_tnizkijej5uq22</username><createTime>1626957005</createTime><contentDesc>看不懂不应该是常态吗[破涕为笑]</contentDesc><contentDescShowType>0</contentDescShowType><contentDescScene>3</contentDescScene><private>0</private><sightFolded>0</sightFolded><showFlag>0</showFlag><appInfo><id></id><version></version><appName></appName><installUrl></installUrl><fromUrl></fromUrl><isForceUpdate>0</isForceUpdate></appInfo><sourceUserName></sourceUserName><sourceNickName></sourceNickName><statisticsData></statisticsData><statExtStr></statExtStr><ContentObject><contentStyle>2</contentStyle><title></title><description></description><mediaList></mediaList><contentUrl></contentUrl></ContentObject><actionInfo><appMsg><messageAction></messageAction></appMsg></actionInfo><location poiClassifyId="" poiName="" poiAddress="" poiClassifyType="0" city=""></location><publicUserName></publicUserName><streamvideo><streamvideourl></streamvideourl><streamvideothumburl></streamvideothumburl><streamvideoweburl></streamvideoweburl></streamvideo></TimelineObject>
/// </summary>
public string ObjectDesc { get; set; }
/// <summary>
///
/// </summary>
public int LikeFlag { get; set; }
/// <summary>
///
/// </summary>
public int LikeCount { get; set; }
/// <summary>
///
/// </summary>
public int LikeUserListCount { get; set; }
/// <summary>
///
/// </summary>
public List<LikeUserList> LikeUserList { get; set; }
/// <summary>
///
/// </summary>
public int CommentCount { get; set; }
/// <summary>
///
/// </summary>
public int CommentUserListCount { get; set; }
/// <summary>
///
/// </summary>
public List<CommentUserList> CommentUserList { get; set; }
/// <summary>
///
/// </summary>
public int WithUserCount { get; set; }
/// <summary>
///
/// </summary>
public int WithUserListCount { get; set; }
/// <summary>
///
/// </summary>
public object WithUserList { get; set; }
/// <summary>
///
/// </summary>
public int ExtFlag { get; set; }
/// <summary>
///
/// </summary>
public int NoChange { get; set; }
/// <summary>
///
/// </summary>
public int GroupCount { get; set; }
/// <summary>
///
/// </summary>
public object GroupList { get; set; }
/// <summary>
///
/// </summary>
public int IsNotRichText { get; set; }
/// <summary>
///
/// </summary>
public string ReferUsername { get; set; }
/// <summary>
///
/// </summary>
public int ReferId { get; set; }
/// <summary>
///
/// </summary>
public int BlackListCount { get; set; }
/// <summary>
///
/// </summary>
public object BlackList { get; set; }
/// <summary>
///
/// </summary>
public int DeleteFlag { get; set; }
/// <summary>
///
/// </summary>
public int GroupUserCount { get; set; }
/// <summary>
///
/// </summary>
public object GroupUser { get; set; }
/// <summary>
///
/// </summary>
public object ObjectOperations { get; set; }
/// <summary>
///
/// </summary>
public object SnsRedEnvelops { get; set; }
}
#region pc原始单条朋友圈对象
public class CommentUserListOri
{
/// <summary>
///
/// </summary>
public int commentFlag { get; set; }
/// <summary>
///
/// </summary>
public int commentId { get; set; }
/// <summary>
///
/// </summary>
public int commentId2 { get; set; }
/// <summary>
///
/// </summary>
public string content { get; set; }
/// <summary>
///
/// </summary>
public int createTime { get; set; }
/// <summary>
///
/// </summary>
public int deleteFlag { get; set; }
/// <summary>
///
/// </summary>
public int isNotRichText { get; set; }
/// <summary>
/// 先森吳
/// </summary>
public string nickname { get; set; }
/// <summary>
///
/// </summary>
public int replyCommentId { get; set; }
/// <summary>
///
/// </summary>
public int replyCommentId2 { get; set; }
/// <summary>
///
/// </summary>
public string replyUsername { get; set; }
/// <summary>
///
/// </summary>
public int source { get; set; }
/// <summary>
///
/// </summary>
public int type { get; set; }
/// <summary>
///
/// </summary>
public string username { get; set; }
}
public class LikeUserListOri
{
/// <summary>
///
/// </summary>
public int commentFlag { get; set; }
/// <summary>
///
/// </summary>
public int commentId { get; set; }
/// <summary>
///
/// </summary>
public int commentId2 { get; set; }
/// <summary>
///
/// </summary>
public string content { get; set; }
/// <summary>
///
/// </summary>
public int createTime { get; set; }
/// <summary>
///
/// </summary>
public int deleteFlag { get; set; }
/// <summary>
///
/// </summary>
public int isNotRichText { get; set; }
/// <summary>
///
/// </summary>
public string nickname { get; set; }
/// <summary>
///
/// </summary>
public int replyCommentId { get; set; }
/// <summary>
///
/// </summary>
public int replyCommentId2 { get; set; }
/// <summary>
///
/// </summary>
public string replyUsername { get; set; }
/// <summary>
///
/// </summary>
public int source { get; set; }
/// <summary>
///
/// </summary>
public int type { get; set; }
/// <summary>
///
/// </summary>
public string username { get; set; }
}
public class ObjectDesc
{
/// <summary>
///
/// </summary>
public string buffer { get; set; }
/// <summary>
///
/// </summary>
public int iLen { get; set; }
}
public class ObjectOperations
{
/// <summary>
///
/// </summary>
public string buffer { get; set; }
/// <summary>
///
/// </summary>
public int iLen { get; set; }
}
public class PreDownloadInfo
{
/// <summary>
///
/// </summary>
public string noPreDownloadRange { get; set; }
/// <summary>
///
/// </summary>
public int preDownloadNetType { get; set; }
/// <summary>
///
/// </summary>
public int preDownloadPercent { get; set; }
}
public class SnsRedEnvelops
{
/// <summary>
///
/// </summary>
public int reportId { get; set; }
/// <summary>
///
/// </summary>
public int reportKey { get; set; }
/// <summary>
///
/// </summary>
public int resourceId { get; set; }
/// <summary>
///
/// </summary>
public int rewardCount { get; set; }
}
public class WeAppInfo
{
/// <summary>
///
/// </summary>
public int appId { get; set; }
/// <summary>
///
/// </summary>
public string mapPoiId { get; set; }
/// <summary>
///
/// </summary>
public string redirectUrl { get; set; }
/// <summary>
///
/// </summary>
public int score { get; set; }
/// <summary>
///
/// </summary>
public int showType { get; set; }
/// <summary>
///
/// </summary>
public string userName { get; set; }
}
public class CirCleInfoOri
{
/// <summary>
///
/// </summary>
public int blackListCount { get; set; }
/// <summary>
///
/// </summary>
public int commentCount { get; set; }
/// <summary>
///
/// </summary>
public List<CommentUserListOri> commentUserList { get; set; }
/// <summary>
///
/// </summary>
public int commentUserListCount { get; set; }
/// <summary>
///
/// </summary>
public int createTime { get; set; }
/// <summary>
///
/// </summary>
public int deleteFlag { get; set; }
/// <summary>
///
/// </summary>
public int extFlag { get; set; }
/// <summary>
///
/// </summary>
public int groupCount { get; set; }
/// <summary>
///
/// </summary>
public int groupUserCount { get; set; }
/// <summary>
///
/// </summary>
public decimal id { get; set; }
/// <summary>
///
/// </summary>
public int isNotRichText { get; set; }
/// <summary>
///
/// </summary>
public int likeCount { get; set; }
/// <summary>
///
/// </summary>
public int likeFlag { get; set; }
/// <summary>
///
/// </summary>
public List<LikeUserListOri> likeUserList { get; set; }
/// <summary>
///
/// </summary>
public int likeUserListCount { get; set; }
/// <summary>
///
/// </summary>
public string nickname { get; set; }
/// <summary>
///
/// </summary>
public int noChange { get; set; }
/// <summary>
///
/// </summary>
public ObjectDesc objectDesc { get; set; }
/// <summary>
///
/// </summary>
public ObjectOperations objectOperations { get; set; }
/// <summary>
///
/// </summary>
public PreDownloadInfo preDownloadInfo { get; set; }
/// <summary>
///
/// </summary>
public int referId { get; set; }
/// <summary>
///
/// </summary>
public string referUsername { get; set; }
/// <summary>
///
/// </summary>
public SnsRedEnvelops snsRedEnvelops { get; set; }
/// <summary>
///
/// </summary>
public string username { get; set; }
/// <summary>
///
/// </summary>
public WeAppInfo weAppInfo { get; set; }
/// <summary>
///
/// </summary>
public int withUserCount { get; set; }
/// <summary>
///
/// </summary>
public int withUserListCount { get; set; }
}
#endregion
#endregion
/// <summary>
/// 朋友圈点赞
/// </summary>
/// <param name="username">无用</param>
/// <param name="circleId">朋友圈id</param>
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 $"<id>{result.Data}</id>";
}
}
catch (Exception ex)
{
this.WriteLog($"发送朋友圈异常:" + ex.Message + " - " + ex.StackTrace);
}
}
else
{
}
}
return string.Empty;
}
#region
/// <summary>
/// 解析获取xml
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
private string GetCircleXml(string msg)
{
var xml = string.Empty;
try
{
msg = msg.RandomMess().Trim();
if (msg.StartsWith("<TimelineObject>", StringComparison.CurrentCultureIgnoreCase) && msg.EndsWith("</TimelineObject>", 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<string> images = null;
var match = Regex.Matches(msg, @"\[图片\=([^\]]+)\]", RegexOptions.IgnoreCase);
if (match.Count > 0)
{
images = new List<string>();
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<string> videos = null;
var match = Regex.Matches(msg, @"\[视频\=([^\]]+)\]", RegexOptions.IgnoreCase);
if (match.Count > 0)
{
videos = new List<string>();
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<string> videos = null;
var match = Regex.Matches(msg, @"\[链接\=([^\]]+)\]", RegexOptions.IgnoreCase);
if (match.Count > 0)
{
videos = new List<string>();
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<string> list, CircleType circleType)
{
StringBuilder sb = new StringBuilder();
try
{
switch (circleType)
{
case CircleType.:
{
sb.Append("<TimelineObject><id>" + Util.GenerateRandomCode(20) + "</id><username>weixin</username><createTime>" + Util.TimeStamp() + "</createTime><contentDescShowType>0</contentDescShowType><contentDescScene>3</contentDescScene><private>0</private>");
sb.Append("<contentDesc>" + content + "</contentDesc>");
sb.Append("<sightFolded>0</sightFolded><showFlag>0</showFlag><appInfo><id></id><version></version><appName></appName><installUrl></installUrl><fromUrl></fromUrl><isForceUpdate>0</isForceUpdate></appInfo><sourceUserName></sourceUserName><sourceNickName></sourceNickName><statisticsData></statisticsData><statExtStr></statExtStr><ContentObject><contentStyle>2</contentStyle><title></title><description></description><mediaList></mediaList><contentUrl></contentUrl></ContentObject><actionInfo><appMsg><messageAction></messageAction></appMsg></actionInfo><location poiClassifyId=\"\" poiName=\"\" poiAddress=\"\" poiClassifyType=\"0\" city=\"\"></location><publicUserName></publicUserName><streamvideo><streamvideourl></streamvideourl><streamvideothumburl></streamvideothumburl><streamvideoweburl></streamvideoweburl></streamvideo></TimelineObject>");
}
break;
case CircleType.:
{
{
sb.Append("<TimelineObject><id>" + Util.GenerateRandomCode(20) + "</id><username>weixin</username><createTime>" + Util.TimeStamp() + "</createTime><contentDescShowType>0</contentDescShowType><contentDescScene>0</contentDescScene><private>0</private>");
sb.Append("<contentDesc>" + content + "</contentDesc>");
sb.Append("<sightFolded>0</sightFolded><showFlag>0</showFlag><appInfo><id></id><version></version><appName></appName><installUrl></installUrl><fromUrl></fromUrl><isForceUpdate>0</isForceUpdate></appInfo><sourceUserName></sourceUserName><sourceNickName></sourceNickName><statisticsData></statisticsData><statExtStr></statExtStr><ContentObject><contentStyle>15</contentStyle><title>微信小视频</title><description>Sight</description><mediaList><media>");
sb.Append("<id>" + Util.GenerateRandomCode(20) + "</id>");
sb.Append("<type>6</type><title></title>");
sb.Append("<contentSubStyle>0</contentSubStyle>");
sb.Append("<title></title>");
sb.Append("<description>" + content + "</description>");
sb.Append("<private>0</private><userData></userData><subType>0</subType><videoSize width=\"640\" height=\"368\"></videoSize>");
sb.Append("<url type=\"1\" md5=\"" + Util.GetMD5Hash(Guid.NewGuid().ToByteArray()) + "\" videomd5=\"" + Util.GetMD5Hash(Guid.NewGuid().ToByteArray()) + "\">" + ((list != null && list.Count != 0) ? list[0] : "https://support.weixin.qq.com/cgi-bin/mmsupport-bin/readtemplate?t=page/common_page__upgrade&amp;v=1") + "</url>");
sb.Append("<thumb type=\"1\">" + ((list != null && list.Count != 0) ? list[0] : "https://support.weixin.qq.com/cgi-bin/mmsupport-bin/readtemplate?t=page/common_page__upgrade&amp;v=1") + "</thumb>");//这里应该是视频的第一张图片
sb.Append("<size width=\"288.000000\" height=\"165.000000\" totalSize=\"1615102\"></size><videoDuration>27.166667</videoDuration></media></mediaList>");
sb.Append("<contentUrl>https://support.weixin.qq.com/cgi-bin/mmsupport-bin/readtemplate?t=page/common_page__upgrade&amp;v=1</contentUrl></ContentObject><actionInfo><appMsg><messageAction></messageAction></appMsg></actionInfo><location poiClassifyId=\"\" poiName=\"\" poiAddress=\"\" poiClassifyType=\"0\" city=\"\"></location><publicUserName></publicUserName><streamvideo><streamvideourl></streamvideourl><streamvideothumburl></streamvideothumburl><streamvideoweburl></streamvideoweburl></streamvideo></TimelineObject>");
}
}
break;
case CircleType.:
{
sb.Append("<TimelineObject><id>" + Util.GenerateRandomCode(20) + "</id><username>weixin</username><createTime>" + Util.TimeStamp() + "</createTime><contentDesc></contentDesc><contentDescShowType>0</contentDescShowType><contentDescScene>4</contentDescScene><private>0</private><sightFolded>0</sightFolded><showFlag>0</showFlag><location city=\"潍坊\" longitude=\"119.149178\" latitude=\"36.724952\" poiName=\"\" poiAddress=\"\" poiScale=\"11.000000\" poiInfoUrl=\"\" poiClassifyId=\"\" poiClassifyType=\"0\" poiClickableStatus=\"0\"></location><appInfo><id></id><version></version><appName></appName><installUrl></installUrl><fromUrl></fromUrl><isForceUpdate>0</isForceUpdate></appInfo><sourceUserName></sourceUserName><sourceNickName></sourceNickName><statisticsData></statisticsData><statExtStr></statExtStr><ContentObject>");
sb.Append("<contentStyle>3</contentStyle>");
sb.Append("<title>" + content + "</title>");
sb.Append("<description>" + content + "</description>");
sb.Append("<contentUrl>" + ((list != null && list.Count != 0) ? list[0] : "https://support.weixin.qq.com/cgi-bin/mmsupport-bin/readtemplate?t=page/common_page__upgrade&amp;v=1") + "</contentUrl>");
sb.Append("<mediaList>");
sb.Append("<media>");
sb.Append("<id>" + Util.GenerateRandomCode(20) + "</id>");
sb.Append("<type>2</type>");
sb.Append("<title></title>");
sb.Append("<description></description>");
sb.Append("<private>0</private>");
sb.Append("<userData></userData><subType>0</subType><videoSize width=\"0\" height=\"0\"></videoSize>");
sb.Append("<url type=\"0\" md5=\"\" videomd5=\"\">https://img.sj33.cn/uploads/allimg/201402/7-140223103130591.png</url>");
sb.Append("<lowBandUrl type=\"0\">https://img.sj33.cn/uploads/allimg/201402/7-140223103130591.png</lowBandUrl>");
sb.Append("<thumb type=\"1\">https://img.sj33.cn/uploads/allimg/201402/7-140223103130591.png</thumb>");
sb.Append("</media>");
sb.Append("</mediaList>");
sb.Append("</ContentObject><actionInfo><appMsg><messageAction></messageAction></appMsg></actionInfo><publicUserName></publicUserName><streamvideo><streamvideourl></streamvideourl><streamvideothumburl></streamvideothumburl><streamvideoweburl></streamvideoweburl></streamvideo></TimelineObject>");
}
break;
case CircleType.:
{
sb.Append("<TimelineObject><id>" + Util.GenerateRandomCode(20) + "</id><username>weixin</username><createTime>" + Util.TimeStamp() + "</createTime>");
sb.Append("<contentDesc>" + content + "</contentDesc>");
sb.Append("<contentDescShowType>0</contentDescShowType><contentDescScene>3</contentDescScene><private>0</private><sightFolded>0</sightFolded><showFlag>0</showFlag><appInfo><id></id><version></version><appName></appName><installUrl></installUrl><fromUrl></fromUrl><isForceUpdate>0</isForceUpdate></appInfo><sourceUserName></sourceUserName><sourceNickName></sourceNickName><statisticsData></statisticsData><statExtStr></statExtStr><ContentObject><contentStyle>1</contentStyle><title></title><description></description>");
sb.Append("<mediaList>");
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("<media>");
sb.Append("<id>" + Util.GenerateRandomCode(20) + "</id>");
sb.Append("<type>2</type>");
sb.Append("<title></title>");
sb.Append("<description>" + content + "</description>");
sb.Append("<private>0</private><userData></userData><subType>0</subType>");
sb.Append("<videoSize width=\"3024\" height=\"3585\"></videoSize>");
sb.Append("<url type=\"1\" md5=\"" + Util.GetMD5Hash(Guid.NewGuid().ToByteArray()) + "\" videomd5=\"\">" + url + "</url>");
sb.Append("<thumb type=\"1\">" + url + "</thumb>");
sb.Append("<size height=\"1280.000000\" width=\"1078.000000\" totalSize=\"209026.0\"></size>");
sb.Append("</media>");
}
}
sb.Append("</mediaList>");
sb.Append("<contentUrl></contentUrl></ContentObject><actionInfo><appMsg><messageAction></messageAction></appMsg></actionInfo><location poiClassifyId=\"\" poiName=\"\" poiAddress=\"\" poiClassifyType=\"0\" city=\"\"></location><publicUserName></publicUserName><streamvideo><streamvideourl></streamvideourl><streamvideothumburl></streamvideothumburl><streamvideoweburl></streamvideoweburl></streamvideo></TimelineObject>");
}
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<string, string> CircleUrlDic = new Dictionary<string, string>();
private Queue<string> Queues = new Queue<string>();
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
/// <summary>
/// 开始上传图片
/// </summary>
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("&amp;", "");
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
/// <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}");
}
}
/// <summary>
/// 分析hook服务器过来的事件
/// </summary>
/// <param name="obj"></param>
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}");
}
}
/// <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>
/// <param name="message"></param>
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)
{ }
}
/// <summary>
/// 退出登录
/// </summary>
public override void LoginOut()
{
//发送指令 强制退出易转发那边的微信
WechatPack pack = new WechatPack(this);
pack.SendServer(PCRobotCMD.closeWechat);
try
{
LogHelper.GetSingleObj().Debug("", $"LoginOut不带提示:{this.WeixinHao}");
}
catch (Exception)
{ }
}
/// <summary>
/// 领取转账
/// </summary>
/// <param name="Invalidtime"></param>
/// <param name="Transferid"></param>
/// <param name="FromUsername"></param>
/// <return s></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 }, { "WxId", FromUsername } }), 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);
}
2022-11-12 08:55:55 +00:00
/// <summary>
/// 发送XML卡片
/// </summary>
/// <param name="username"></param>
/// <param name="xml"></param>
public override void SendCardXml(string username, string xml)
{
WechatPack pack = new WechatPack(this);
pack.SendServer(PCRobotCMD.sendCardXml, xml, WechatMsgType., username);
}
2022-09-20 03:10:29 +00:00
/// <summary>
/// 邀请入群
/// </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.sendInviteGroup, groupId, WechatMsgType., username);
return string.Empty;
}
/// <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
{
WechatPack pack = new WechatPack(this);
pack.SendServer(PCRobotCMD.sendImg, address, WechatMsgType., username);
}
catch (Exception ex)
{
this.WriteLog($"发送图片失败:{ex.Message} - {ex.StackTrace}");
}
}
/// <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.Trim().ToLower().StartsWith("<appmsg") && message.Trim().ToLower().EndsWith("</appmsg>"))
{
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);
//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)
{
2022-11-12 08:55:55 +00:00
var recommendedUser = item.Groups[1].Value;
if (recommendedUser.ToLower().Contains("<?xml"))
{
SendCardXml(username, recommendedUser);
}
else
{
SendCard(username, recommendedUser == "自己" ? User.Username : item.Groups[1].Value);
}
2022-09-20 03:10:29 +00:00
}
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;
//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
/// <summary>
/// 同意添加我为好友
/// </summary>
/// <param name="token"></param>
/// <returns></returns>
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;
}
/// <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 = "")
{
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("本协议不支持该操作");
}
/// <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;
}
}
}