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

2706 lines
119 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;
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 + $",{(WXClientTool.auth_info != null ? JsonConvert.SerializeObject(WXClientTool.auth_info) : string.Empty)}"
});
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;
return (checkUrl != null && (checkUrl.Status == 0 || checkUrl.Status == -1));
}
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);
}
/// <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);
}
/// <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)
{
var recommendedUser = item.Groups[1].Value;
if (recommendedUser.ToLower().Contains("<?xml"))
{
SendCardXml(username, recommendedUser);
}
else
{
SendCard(username, recommendedUser == "自己" ? 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;
//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;
}
}
}