using Chat.Framework.PCRobotSDK;
using Chat.Framework.Properties;
using Chat.Framework.QQSdk;
using Chat.Framework.QQSdk.Events;
using Chat.Framework.QQSdk.QPlus;
//using Chat.Framework.QQSdk.PCQQ;
using Chat.Framework.WXSdk;
using Chat.Framework.WXSdk.Events;
using Chat.Framework.WXSdk.Implement;
using Chat.Framework.WXSdk.UIForm;
using CsharpHttpHelper;
using Grant.Framework;
using Newtonsoft.Json;
using PCRobot.Pack;
using Robot.Framework;
using Robot.Framework.Entities;
using SuperSocket.SocketBase;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using UI.Framework.Forms;
namespace Chat.Framework
{
///
/// 机器人综合管理类
///
public class ChatClient
{
///
/// 消息频繁休眠时间
///
public static int MessFrequentSleepTime { get; set; } = 5;
///
/// Hook通讯秘钥
///
public static string SocketPassword { get; set; } = "";
static ChatClient()
{
try
{
QQClients = new Dictionary();
WXClient = new Dictionary();
//PCRobotPool = new PCRobotPool();
//QQPool = new QQPool();
WXSdkConfig = new WXSdkConfig();
QQEvents = new QQEventManage();
Events = new EventManage();
Grant.Framework.GrantClient.Get().GrantEvent += GrantEvent;
Wechat_HeadPack = new HeadPack_Hook();//注册微信Hook 的掉线检测包
}
catch (Exception ex)
{
}
}
///
/// 图片CDN缓存
///
public static Dictionary ImageCDNs = new Dictionary();
///
/// hook(易转发)
///
public static PCRobotPool PCRobotPool { get; private set; } = new PCRobotPool();
//public static QQPool QQPool { get; private set; }
///
/// 机器人QQ基础字典
///
public static Dictionary QQClients { get; private set; }
///
/// 机器人微信基类集合,已经登录微信机器人集合
///
public static Dictionary WXClient { get; private set; }
///
///
///
public static WXSdkConfig WXSdkConfig { get; private set; }
///
/// 微信事件管理
///
public static EventManage Events { get; private set; }
///
/// QQ事件管理
///
public static QQEventManage QQEvents { get; private set; }
//public static QQCaptchaBrowser QQBrowser;
private static HeadPack_Hook Wechat_HeadPack { get; set; }
internal static QQClient IniClient(uint qq, string pass, bool isCache = true)
{
var qClient = new QQClient(qq, pass);
if (isCache)
{
if (QQClients.ContainsKey(qq.ToString()))
{
//var qClientTmp = QQClients[qq.ToString()];
//if (qClientTmp != null && qClientTmp.User != null && qClientTmp.User.Status != QQStatus.离线)
// qClientTmp.Logout();
var qBaseTmp = QQClients[qq.ToString()];
qBaseTmp.Login();
}
QQClients[qq.ToString()] = new QQClientImpl_QQPlus(qClient);
}
return qClient;
}
private static void GrantEvent(customer customer, string message)
{
try
{
if (!string.IsNullOrEmpty(message))
{
//.WriteLog("授权异常!" + (string.IsNullOrEmpty(message) ? "" : message));
if (customer.softId == 1001)
{
var v = WXClient.Values.FirstOrDefault(f => f.Status == WxStatus.在线 && f.User.Uin.ToString() == customer.cardname);
if (v == null) return;
//【xxxxxxxxxxxxx】授权检测异常:刷新Token失败,请重新登录。
if (message.Contains("Token"))
return;
v.LoginOut();
v.ChangeStatus(WxStatus.已退出);
Events.OnEvent(new WXWriteLog(v) { Message = $"【{v.WeixinHao}】授权检测异常:" + message });
}
else if (customer.softId == 1002 && QQClients.ContainsKey(customer.cardname))
{
var qBase = QQClients[customer.cardname];
if (qBase is QQClientImpl_QQPlus)
{
var tmp = (qBase as QQClientImpl_QQPlus);
var client = tmp.QQClient;
if (client != null && client.User != null && client.User.LoginStatus == LoginStatus.Login)
{
if (message.Contains("Token"))
return;
//v.User.Status = QQStatus.离线;
client.Logout();
QQEvents.OnEvent(new QQLogEvents(tmp) { Message = $"【{customer.cardname}】授权检测异常:" + message });
}
}
}
}
}
catch (Exception)
{
}
}
private static object license_data = new object();
public delegate byte[] FindLicenseData(string method, string data, string api);
private static FindLicenseData FindLicense;
public static void BindLicenseData(FindLicenseData action)
{
if (FindLicense == null)
{
FindLicense = action;
}
}
public delegate string GetServerData(string key);
public static GetServerData GetServerDataMethod;
///
/// 查询数据中的用户信息
///
public static Func GetDBWechatFriend;
//internal static Dictionary GetLicenseData(string method, object data, string api = "api/member.ashx")
//{
// lock (license_data)
// {
// var _data = Util.HexToStr(Encoding.UTF8.GetBytes(Util.ObjectToJson(data)));
// var _rest = FindLicense.Invoke(method, _data, api);
// var _json = Encoding.UTF8.GetString(_rest);
// if (!_json.StartsWith("{")) throw new Exception(_json);
// var _dic = Util.ConvertJsonToDic(_json);
// if (_dic == null) throw new Exception(_json);
// return _dic;
// }
//}
///
/// hook协议退出微信
///
/// 要退出的微信号
public static void LoginOutWeixin(string wei_xin_hao)
{
var wx = WXClient.FirstOrDefault(f => f.Key == wei_xin_hao).Value;
if (wx != null)
{
WXClient.Remove(wei_xin_hao);
wx.LoginOut();
wx.Dispose();
wx = null;
}
var pcRobot = PCRobotPool.GetSession(wei_xin_hao);
if (pcRobot != null)
PCRobotPool.Remove(pcRobot);
}
///
/// hook协议退出调用此方法,附带提示语信息
///
/// 要退出的微信号
/// 附带退出原因(弹窗)
public static void LoginOutWeixin(string wei_xin_hao, string message)
{
var wx = WXClient.FirstOrDefault(f => f.Key == wei_xin_hao).Value;
if (wx != null)
{
WXClient.Remove(wei_xin_hao);
wx.LoginOut(message);
wx.Dispose();
wx = null;
}
var pcRobot = PCRobotPool.GetSession(wei_xin_hao);
if (pcRobot != null)
PCRobotPool.Remove(pcRobot);
}
///
/// 协议微信登录
///
///
///
///
///
///
public static string LoginWeixin(string weixinhao, string username, string userpass, string data62)
{
var v = WXClient.FirstOrDefault(f => f.Key == weixinhao).Value as WXClientImpl_IPAD;
if (v == null)
{
v = new WXClientImpl_IPAD(weixinhao);
}
if (v.Status == WxStatus.在线) return string.Empty;
if (v.Login(username, userpass, data62))
{
return string.Empty;
}
else return v.LoginErrorMessage;
}
///
/// 协议微信登录
///
///
///
///
public static bool LoginWeixin(string wei_xin_hao = "", string data = "")
{
string deviceid = string.Empty;
if (string.IsNullOrEmpty(wei_xin_hao))
{
// if (MessageBox.Show(@"对不起,由于近期个别微信有出现封号!
//为了您的账号安全,暂时不提供协议登陆!
//请下载【易转发-微信官方客户端】登陆,保障您的账号安全!
//-------------
//下载地址已复制到剪切板,请粘贴到浏览器下载
//-------------
//注意:如果您执意要通过协议登陆,请点击确定!!!", "温馨提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2) == DialogResult.Cancel)
if (BaseForm.ShowSuccessAutoClose(@"对不起,由于近期个别微信有出现封号!
为了您的账号安全,暂时不提供协议登陆!
请下载【易转发-微信官方客户端】登陆,保障您的账号安全!
-------------
下载地址已复制到剪切板,请粘贴到浏览器下载
-------------
注意:如果您执意要通过协议登陆,请点击确定!!!", new DialogResult[] { DialogResult.OK, DialogResult.Cancel }) == DialogResult.Cancel)
{
try
{
Clipboard.SetDataObject(Resources.易转发下载地址 + "?=" + new Random().Next(100, 2000));
}
catch (Exception ex)
{ }
return false;
}
else
{
var WeixinHao = new WXSdk.UIForm.SetwxhForm();
WeixinHao.ShowDialog();
if (string.IsNullOrEmpty(WeixinHao.wxh))
{
return false;
}
else
{
wei_xin_hao = WeixinHao.wxh;
deviceid = WeixinHao.deviceid;
}
}
}
var v = WXClient.FirstOrDefault(f => f.Key == wei_xin_hao).Value;
if (v != null)
{
var vx = new WXClientImpl_IPAD(wei_xin_hao);
if (!string.IsNullOrEmpty(deviceid)) vx.DeviceId = deviceid;
v = vx;
v.ShowLogin();
}
else if (data == "input_password")
{
var vx = new WXClientImpl_IPAD(wei_xin_hao);
v = vx;
vx.ShowPasswordForm();
}
else if (string.IsNullOrEmpty(data))
{
var vx = new WXClientImpl_IPAD(wei_xin_hao);
if (!string.IsNullOrEmpty(deviceid)) vx.DeviceId = deviceid;
v = vx;
v.ShowLogin();
}
else
{
v = new WXClientImpl_IPAD(wei_xin_hao, data);
v.ResetConnection();
}
return v.Status == WxStatus.在线 ? true : false;
}
///
/// PC微信设置登录
///
/// 之前登陆的设备信息
/// 之前登陆的微信账号
///
public static bool LoginPcWeixin(string device, string robotname, RobotType rType)
{
try
{
var appSs = PCRobotPool.ClientSessions.Values.Where(f => f.device == device).ToList();
if (appSs == null || appSs.Count == 0)
BaseForm.ShowSuccessAutoClose(@"未找到该设备信息
可能原因如下:
1、易转发软件非最新版(升级试试)
2、请检查易转发是否已和软件连接成功
3、易转发端软件目录变更(需要易转发端登录)");
else
{
var appS = appSs[0];
//foreach (var appS in appSs)
{
try
{
var msgid = SendServer(appS.appSession, robotname, rType);
if (!string.IsNullOrEmpty(msgid))
{
var rst = PCRobotPool.PackHist.GetResult(msgid).Result;
if (rst != null)
{
try
{
var commonResult = rst as CommonResult;
if (commonResult != null)
{
if (string.IsNullOrWhiteSpace(commonResult.Data))
throw new Exception("获取二维码异常");
var rlc = JsonConvert.DeserializeObject(commonResult.Data);
if (rlc != null)
{
if (rlc.pid == -1)
throw new Exception(rlc.b64Md5);
var codeImg = Utils.Common.ConvertBase64ToImage(rlc.cImgB64);
var form = new PCLoginForm(codeImg, rlc, robotname, appS.appSession);
form.ShowDialog();
}
}
}
catch (Exception ex)
{
BaseForm.ShowSuccessAutoClose("请求易转发:" + ex.Message);
}
}
}
}
catch (Exception ex)
{ }
}
}
}
catch (Exception ex)
{
BaseForm.ShowSuccessAutoClose("PC登录异常:" + ex.Message);
}
return false;
}
internal static string SendServer(AppSession app, string robotname, RobotType rType, string pid = "-1")
{
try
{
var cmd = PCRobotCMD.getlogincode;
var msg = new LoginCodeMsg()
{
Cmd = cmd,
RobotType = rType,
RobotUsername = robotname,
RobotUsernick = string.Empty,
Data = pid,
Key = SocketPassword
};
var json = HttpHelper.ObjectToJson(msg);
var text = PackTool.CompressString(json);
//var t = PackTool.DecompressString(text);
var need_send = $"{cmd} {text}\r\n";
app.TrySend(need_send);
return msg.MsgId;
}
catch (Exception ex)
{ }
return string.Empty;
}
internal static void UpdateWXClient(WeixinBase Client)
{
if (!WXClient.ContainsKey(Client.WeixinHao))
{
WXClient.Add(Client.WeixinHao, Client);
}
else
{
var tempClient = WXClient[Client.WeixinHao];
if (tempClient != Client)
{
tempClient.LoginOut();
}
WXClient[Client.WeixinHao] = Client;
}
Console.Write(Client.ToString());
Events.OnEvent(new WXSdk.Events.WXRefreshUser(Client));
}
#region QQ
///
/// QQ登录
///
/// QQ账号
/// QQ密码
/// 是否企业QQ
///
public static bool LoginQQ(string qqStr = "", string pass = "", bool isEQQ = false)
{
var flag = false;
QQClient qClient = null;
if (!string.IsNullOrWhiteSpace(qqStr) && !string.IsNullOrWhiteSpace(pass))
{
uint qq;
if (uint.TryParse(qqStr, out qq))
{
var q = QQClients.FirstOrDefault(f => f.Key == qqStr).Value;
if (q == null)
{
qClient = new QQClient();
new QQClientImpl_QQPlus(qClient);
//qClient.LoginStatusChanged += QClient_LoginStatusChanged;
qClient.QQProtocol = isEQQ ? "企业QQ" : "PCQQ";
qClient.User = new QQUser(qq, pass);
qClient.Login();
flag = true;
}
}
}
if (!flag)
{
var form = new QQLoginForm(qqStr);
if (form.ShowDialog() != DialogResult.OK)
return false;
qClient = form.qPlusClient.QQClient;
}
return qClient.User.LoginStatus == LoginStatus.Login;
}
//private static void QClient_LoginStatusChanged(object sender, Robot.Framework.SDK.LoginStatusChangedQQEventArgs e)
//{
// if (sender is QQClient)
// {
// var q = sender as QQClient;
// QQEvents.OnEvent(new QQLogEvents(null) { Message = $"QQ({q.User.NickName}【{q.User.QQ}】) {LoginStatus.Failed} {e.Other}" });
// if (e.LoginStatus == LoginStatus.Login)
// {
// UpdateQQClient(new QQClientImpl_QQPlus(sender as QQClient));
// q.LoginStatusChanged -= QClient_LoginStatusChanged;
// }
// else if(e.LoginStatus == LoginStatus.Failed || e.LoginStatus == LoginStatus.WrongPassword || e.LoginStatus == LoginStatus.JiHuo)
// {
// q.LoginStatusChanged -= QClient_LoginStatusChanged;
// }
// }
//}
///
/// 退出QQ
///
/// QQ
public static void LoginOutQQ(string qq)
{
if (QQClients.ContainsKey(qq))
{
var qClient = QQClients[qq];
QQClients.Remove(qq);
qClient.Logout();
qClient = null;
}
}
///
/// 更新QQ信息
///
///
internal static void UpdateQQClient(QQBase Client)
{
if (!QQClients.ContainsKey(Client.QQ.ToString()))
{
QQClients.Add(Client.QQ.ToString(), Client);
}
else
{
var qBase = QQClients[Client.QQ.ToString()];
//if (tempClient != Client)
//{
// tempClient.Logout();
//}
//QQClients[Client.User.QQ.ToString()] = Client;
if (qBase != Client)
{
qBase.Logout();
}
QQClients[Client.QQ.ToString()] = Client;
}
//Console.Write(Client.ToString());
QQEvents.OnEvent(new QQSdk.Events.QQRefreshUser(Client));
}
#endregion
public static void SetWeixinCore(string[] grpc, string[] auth)
{
// WXClientTool.grpc_info = grpc;
WXClientTool.auth_info = auth;
}
//public static Client LoginQQ(uint QQ, string pass, bool isEQQ = false)
//{
// var User = new QQUser(QQ, pass);
// User.LoginMode = QQLite.Framework.QQEnum.QQStatus.const_3;//QQ登录状态(在线|Q我吧|离开...)
// var client = new Client(User);
// //client.SetTXProtocol(isEQQ ? QQLite.Framework.QQEnum.TXProtocolType.QQEIM_1_9 : QQLite.Framework.QQEnum.TXProtocolType.QQ_6_8, true);
// client.SetTXProtocol(isEQQ ? QQLite.Framework.QQEnum.TXProtocolType.QQEIM_1_9 : QQLite.Framework.QQEnum.TXProtocolType.QQ_8_9, true);
// return client;
//}
}
}