old_flsystem/PCRobot/PCWechat/Routine/WechatRoutineBase.cs

611 lines
22 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using 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;
}
}
}