old_flsystem/PCRobot/PCWechat/Routine/WechatRoutineBase.cs

611 lines
22 KiB
C#
Raw Normal View History

2022-09-20 03:10:29 +00:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
using PCRobot.Entitys;
using PCRobot.Pack;
using PCRobot.Utils;
namespace PCRobot.PCWechat.Routine
{
/// <summary>
/// 个人微信基类
/// </summary>
public abstract class WechatRoutineBase : WechatBase
{
/// <summary>
/// 是否初始化
/// </summary>
internal static bool IsInstall { get; set; }
public WechatRoutineBase(WechatUser User) : base(User) { }
#region
///// <summary>
///// 发送小程序 - 接收到的小程序消息id
///// </summary>
///// <param name="username">接收者的微信</param>
///// <param name="text">发送</param>
//public abstract void SendProgramMessage(string username, string msgid);
/// <summary>
/// 发送Xml(自己拼接Xml)【发送操作】
/// </summary>
/// <param name="username">发给谁</param>
/// <param name="message">Xml消息</param>
/// <param name="customSource">自定义来源</param>
public abstract void SendXml(string username, string xml, string customSource = "Window wechat");
/// <summary>
/// 发送名片XML原始消息[可用于检验僵尸粉]
/// </summary>
/// <param name="username"></param>
/// <param name="xml"></param>
public abstract void SendCardXml(string username, string xml);
/// <summary>
/// 发送引用消息
/// </summary>
/// <param name="username">发送给谁</param>
/// <param name="replyMess">发送的内容</param>
/// <param name="messageType">消息的类型</param>
/// <param name="quoteMess">引用的内容</param>
/// <param name="quoteMsgid">引用的消息id</param>
/// <param name="quoteUsername">引用的用户账号</param>
/// <param name="quoteUsernick">引用的账号昵称</param>
/// <returns></returns>
public abstract void SendQuoteMessage(string username, string replyMess, WechatMsgType messageType,
string quoteMess, string quoteMsgid, string quoteUsername, string quoteUsernick);
/// <summary>
/// 发送链接(卡片)
/// </summary>
/// <param name="username">接收者的账号</param>
/// <param name="title">链接标题</param>
/// <param name="desc">链接描述</param>
/// <param name="url">链接地址</param>
/// <param name="imageUrl">链接图片URL</param>
/// <param name="customSource">自定义来源</param>
public abstract void SendLinkMessage(string username, string title, string desc, string url, string imageUrl,
string customSource);
#endregion
#region
/// <summary>
/// 邀请用户进群(40人以下,不用用户同意)【群操作】
/// </summary>
/// <param name="groupid">群ID</param>
/// <param name="usernames">被邀请的用户账号集</param>
/// <returns></returns>
public abstract void InviteMemberToGroup_40Down(string groupid, string[] usernames);
/// <summary>
/// 邀请用户进群(40人以上,需要用户同意)【群操作】
/// </summary>
/// <param name="groupid">群ID</param>
/// <param name="usernames">被邀请的用户账号集</param>
public abstract void InviteMemberToGroup_40Up(string groupid, string[] usernames);
/// <summary>
/// 修改自己在所群里的昵称【群操作】
/// </summary>
/// <param name="groupid">群ID</param>
/// <param name="newNick">新昵称</param>
/// <returns></returns>
public abstract void ModifyGroupMyNick(string groupid, string newNick);
/// <summary>
/// 自动同意进群邀请
/// </summary>
/// <param name="isAuto">0是取消自动1自动</param>
/// <returns></returns>
public abstract void AutoAcceptGroup(bool isAuto);
/// <summary>
/// 是否显示群成员昵称【群操作】
/// </summary>
/// <param name="groupid">群ID</param>
/// <param name="isShow">0不显示,1显示</param>
/// <returns></returns>
public abstract void ModifyGroupShowNick(string groupid, bool isShow);
/// <summary>
/// 群[保存到/移除]通讯录【群操作】
/// </summary>
/// <param name="groupid">群ID</param>
/// <param name="status">0移出通讯录,1保存到通讯录</param>
/// <returns></returns>
public abstract void SaveGroupToContact(string groupid, bool status);
public abstract void GetGroupsNotInMember();
/// <summary>
/// 检测僵尸粉
/// </summary>
public abstract void CheckZombiz();
///// <summary>
///// 获取群用户邀请
///// </summary>
///// <param name="groupid">群ID</param>
//public abstract Dictionary<string, GroupInviteInfo> GetGroupMemberInvite(string groupid);
#endregion
#region
/// <summary>
/// 转发任意类型消息【转发消息操作】
/// </summary>
/// <param name="username">接收者的账号</param>
/// <param name="msgid">转发的msgid</param>
public abstract void ForwardAny(string username, string msgid);
#endregion
#region
///// <summary>
///// 获取收藏列表【收藏消息类】
///// </summary>
//public abstract Task<Dictionary<string, CollectInfo>> GetCollects();
///// <summary>
///// 发送收藏【收藏消息类】
///// </summary>
///// <param name="username">接收者的账号</param>
///// <param name="local_id">收藏列表中local_id的值</param>
///// <returns></returns>
//public abstract void SendCollect(string username, string local_id);
///// <summary>
///// 添加收藏【收藏消息类】
///// </summary>
///// <param name="msgid">接收到的消息ID</param>
///// <returns></returns>
//public abstract void AddCollect(string msgid);
#endregion
#region
/// <summary>
/// 语音消息转文本【语音处理类】
/// </summary>
/// <param name="msgid">接收到的消息id</param>
/// <returns></returns>
public abstract string TransVoice(string msgid);
#endregion
#region
/// <summary>
/// 开启/关闭消息免打扰【群和好友操作】
/// </summary>
/// <param name="username">好友账号或群ID</param>
/// <param name="status">0是关闭,1是开启</param>
/// <returns></returns>
public abstract void ModifyRecvNotify(string username, bool status);
/// <summary>
/// 置顶/取消置顶聊天【群和好友操作】
/// </summary>
/// <param name="username">好友账号或群ID</param>
/// <param name="status">0是关闭,1是开启</param>
/// <returns></returns>
public abstract void ModifyChatTop(string username, bool status);
#endregion
#region
/// <summary>
/// 关注公众号【公众号操作类】
/// </summary>
/// <param name="username">公众号账号</param>
/// <param name="source_type">添加来源,可为空</param>
/// <returns></returns>
public abstract void AddPublicUser(string username, string source_type = "");
#endregion
#region
/// <summary>
/// 添加好友【好友操作】
/// </summary>
/// <param name="username">用户账号</param>
/// <param name="remark">备注</param>
/// <param name="source_type">来源
/// 6:好友验证,这里可加之前加过的人;
/// 14:群聊,加群好友必须是群聊
/// 17:名片分享,username需要传v1数据
/// </param>
/// <param name="groupid">来自哪个群,可空</param>
/// <returns></returns>
public abstract void AddFriend(string username, string remark, int source_type, string groupid);
///// <summary>
///// 删除好友【好友操作】
///// </summary>
///// <param name="username">删除用户的账号</param>
///// <returns></returns>
//public abstract void DeleteFriend(string username);
///// <summary>
///// 接受加好友请求【好友操作】
///// </summary>
///// <param name="encryptusername">xml消息中encryptusername</param>
///// <param name="ticket">xml消息中ticket</param>
///// <param name="scene">xml消息中scene</param>
///// <returns></returns>
//public abstract Task<bool> AcceptFriend(string username, string encryptusername, string ticket, string scene);
/// <summary>
/// 接受好友转账【好友操作】
/// </summary>
/// <param name="data">xml消息中transferid</param>
/// <returns></returns>
public abstract void AcceptFriendTransfer(string data);
/// <summary>
/// 退回好友转账【好友操作】
/// </summary>
/// <param name="transferid">xml消息中transferid</param>
/// <returns></returns>
public abstract void RefuseFriendTransfer(string transferid);
/// <summary>
/// 接受好友的进群邀请【好友操作】
/// </summary>
/// <param name="username">邀请人的账号</param>
/// <param name="inviteUrl">邀请的链接</param>
/// <returns></returns>
public abstract void AcceptFriendInviteToGroup(string username, string inviteUrl);
/// <summary>
/// 单向加好友(当不需要验证时)【好友操作】
/// </summary>
/// <param name="username">要加的好友账号</param>
/// <returns></returns>
public abstract void AddOnewayFriend(string username);
#endregion
#region
/// <summary>
/// 获取所有用户信息【基础消息】
/// </summary>
/// <returns></returns>
public abstract Task<Dictionary<string, FriendInfo>> GetFriendInfos();
///// <summary>
///// 获取所有公众号信息【基础消息】
///// </summary>
///// <returns></returns>
//public abstract Task<Dictionary<string, PublicInfo>> GetPublicInfos();
/// <summary>
/// 网络获取个人信息【基础消息】
/// </summary>
/// <param name="username">要刷新信息的用户账号</param>
/// <returns></returns>
public abstract Task<FriendBase> UpdateFriendInfo(string username);
/// <summary>
/// 网络获取群成员信息【基础消息】
/// </summary>
/// <param name="groupid">群ID</param>
/// <returns></returns>
public abstract void UpdateGroupMemberInfo(string groupid);
#endregion
#region
/// <summary>
/// 检测僵尸粉
/// 0 正常状态(不是僵尸粉)
/// 1 检测为僵尸粉(对方把我拉黑了)
/// 2 检测为僵尸粉(对方把我从他的好友列表中删除了)
/// 3 检测为僵尸粉(原因未知, 如遇到3请反馈给我)
/// </summary>
/// <param name="username">要检测的用户账号</param>
/// <returns></returns>
public abstract Task<string> CheckZombie(string username);
#endregion
#region
/// <summary>
/// 自动同意加好友申请
/// </summary>
/// <param name="isAuto">0是取消自动1自动</param>
/// <returns></returns>
public abstract void AutoAcceptFriend(bool isAuto);
/// <summary>
/// 自动接受好友转账
/// </summary>
/// <param name="isAuto">0是取消自动1自动</param>
/// <returns></returns>
public abstract void AutoAcceptFriendTransfer(bool isAuto);
/// <summary>
/// 自动加好友分享的名片
/// </summary>
/// <param name="isAuto">0是取消自动1自动</param>
/// <returns></returns>
public abstract void AutoAcceptCard(bool isAuto);
#endregion
#region
/// <summary>
/// 解密微信加密的图片(.dat)
/// </summary>
/// <param name="src_file">微信加密图片路径(.dat)</param>
/// <param name="dest_file">解密后的文件路径(.jpg)</param>
public abstract void DecryptImage(string src_file, string dest_file);
#endregion
#region
/// <summary>
/// 打开内置的浏览器
/// </summary>
/// <param name="url">要打开的地址</param>
public abstract void OpenBrowser(string url);
#endregion
#region
/// <summary>
/// 获取未读取消息数量
/// </summary>
/// <returns></returns>
public abstract Task<int> GetUnReadMsgCount();
/// <summary>
/// 设置消息为已读
/// </summary>
/// <param name="username">用户账号</param>
public abstract void SetMsgReaded(string username);
/// <summary>
/// 打开好友的聊天窗口(切换当前会话)
/// </summary>
/// <param name="username">用户账号</param>
public abstract void ToChatWindow(string username);
/// <summary>
/// 清理历史聊天记录
/// </summary>
public abstract void ClearChatHistoryMsg();
#endregion
#region
/// <summary>
/// 开启/关闭防撤回功能
/// </summary>
/// <param name="status">1是开启防撤回0是关闭</param>
/// <returns></returns>
public abstract void DisableRevoke(bool status);
#endregion
#region
///// <summary>
///// 微信二维码识别接口(小程序码,普通二维码)
///// </summary>
///// <param name="file">二维码图片地址</param>
///// <returns></returns>
//public abstract Task<ScanQrCodeInfo> ScanQrCode(string file);
#endregion
#region
///// <summary>
///// 通过手机号/微信号/QQ号查询任意微信号信息
///// </summary>
///// <param name="search">搜索的内容</param>
///// <returns></returns>
//public abstract Task<SearchFriendInfo> SearchContact(string search);
/// <summary>
/// 添加搜索到的用户
/// </summary>
/// <param name="v1">搜索到的信息v1</param>
/// <param name="v2">搜索到的信息v2</param>
/// <param name="remark">添加好友附加内容</param>
/// <param name="source_type">来源通过微信号搜索添加是3手机号是15</param>
/// <returns></returns>
public abstract void AddSearchContact(string v1, string v2, string remark, int source_type);
/// <summary>
/// 用户账号查询详细信息
/// </summary>
/// <param name="username">要查询的用户账号(wxid)</param>
/// <returns></returns>
public abstract void GerFriendDetails(string username);
/// <summary>
/// 检查Url在微信中是否有效
/// </summary>
/// <param name="url">要检查的url地址</param>
/// <returns></returns>
public abstract void CheckUrlStatus(string url);
#endregion
#region
/// <summary>
/// 发送服务端_浏览朋友圈
/// </summary>
/// <param name="max_id"></param>
/// <param name="username"></param>
/// <returns></returns>
public abstract void Ser_GetCircles(string max_id = "0", string username = "");
/// <summary>
/// 浏览朋友圈
/// </summary>
/// <param name="max_id">首页传0后续的最后一个朋友圈的object_id</param>
/// <param name="username">查看某个用户朋友圈,可为空</param>
/// <returns></returns>
public abstract Task<string> GetCircles(string max_id = "0", string username = "");
/// <summary>
/// 朋友圈点赞
/// </summary>
/// <param name="object_id">朋友圈的object_id</param>
/// <returns></returns>
public abstract void CircleLink(string object_id);
/// <summary>
/// 朋友圈评论
/// </summary>
/// <param name="object_id">朋友圈的object_id</param>
/// <param name="content">评论内容</param>
/// <returns></returns>
public abstract void CircleComment(string object_id, string content);
/// <summary>
/// 朋友圈上传本地图片
/// </summary>
/// <param name="imgData"></param>
public abstract void CircleUpLoadImage(string imgData);
/// <summary>
/// 发朋友圈
/// </summary>
/// <param name="object_desc">朋友圈xml</param>
/// <returns></returns>
public abstract void SendCircle(string object_desc);
#endregion
/// <summary>
/// 小程序自动授权登录
/// </summary>
/// <param name="appid">小程序id</param>
public abstract void AutoAuthMiniAPPLogin(string appid);
public string FindNick(string wxid)
{
try
{
if (string.IsNullOrWhiteSpace(wxid)) return string.Empty;
if (wxid.IsQun())//为群账号,就获取群昵称
{
if (!User.Groups.ContainsKey(wxid))
{
var ggi = this.GetGroupInfos().Result;//获取群信息
if (ggi != null && ggi.Count != 0)
{
if (ggi.ContainsKey(wxid))
return (ggi[wxid] as GroupInfo).nickname;
}
}
if (User.Groups.ContainsKey(wxid))
{
if (string.IsNullOrWhiteSpace(User.Groups[wxid].nickname))
{
var ggi = this.GetGroupInfos().Result;//获取群信息
if (ggi != null && ggi.Count != 0)
{
if (ggi.ContainsKey(wxid))
return (ggi[wxid] as GroupInfo).nickname;
}
}
return User.Groups[wxid].nickname;
}
}
else
{
if (!User.Friends.ContainsKey(wxid))
{
var friend = GetFriendInfo(wxid).Result;
if (friend != null)
return friend.nickname;
}
var ftmp = User.Friends.FirstOrDefault(f => f.Key == wxid).Value;
if (ftmp != null)
return ftmp.nickname;
}
}
catch (Exception ex)
{ }
return string.Empty;
}
/// <summary>
/// 获取群成员昵称
/// </summary>
/// <param name="group">群号</param>
/// <param name="wxid">需要查找的用户账号</param>
/// <returns></returns>
public string FindNick(string group, string wxid)
{
try
{
if (string.IsNullOrWhiteSpace(wxid)) return string.Empty;
var ftmp = User.Friends.FirstOrDefault(f => f.Key == wxid).Value;
if (ftmp != null)//如果好友列表中存在就直接读取
return ftmp.nickname;
else
{
if (string.IsNullOrWhiteSpace(group)) return string.Empty;
var gtmp = User.Groups.FirstOrDefault(f => f.Key == group).Value;
if (gtmp == null)
{
var gInfo = this.GetGroupMemberInfo(group).Result;
//if (gInfo != null && gInfo.FriendDic != null && gInfo.FriendDic.ContainsKey(wxid))
if (gInfo != null)
{
var g = gInfo as GroupInfo;
if (g != null && g.friends != null && g.friends.Count != 0)
{
ftmp = g.friends.FirstOrDefault(f => f.wxid == wxid);
if (ftmp != null)
{
return ftmp.nickname;
}
}
}
}
gtmp = User.Groups.FirstOrDefault(f => f.Key == group).Value;
if (gtmp != null)
{
var friendDic = gtmp.friends;
if (friendDic != null)
{
ftmp = friendDic.FirstOrDefault(f => f.wxid == wxid);
if (ftmp != null)
return ftmp.nickname;
}
}
}
}
catch (Exception ex)
{ }
return string.Empty;
}
}
}