2706 lines
119 KiB
C#
2706 lines
119 KiB
C#
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&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&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&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&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("&", "");
|
||
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("&", "&")}<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;
|
||
}
|
||
|
||
|
||
}
|
||
}
|