611 lines
22 KiB
C#
611 lines
22 KiB
C#
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;
|
||
}
|
||
|
||
|
||
|
||
}
|
||
}
|