old_flsystem/类库/Chat.Framework/WXSdk/IPAD/GrpcClient.cs

460 lines
17 KiB
C#
Raw Permalink Normal View History

2022-09-20 03:10:29 +00:00
using Chat.Framework.WXSdk.Implement;
using Grpc.Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using WechatProto;
using static WechatProto.Wechat;
namespace Chat.Framework.WXSdk.IPAD
{
public enum GrpcType : int
{
Awei = 0,
Laoyao = 1,
Huangfan = 2,
= -1
}
internal class GrpcConfig
{
public GrpcType Type { get; set; }
public string Appid { get; set; }
public string Appkey { get; set; }
/// <summary>
/// 启用SSL加密
/// </summary>
public bool EnableSSL { get; set; } = true;
/// <summary>
/// 服务器全局解密Key
/// </summary>
public byte[] RandomEncryKey { get; set; }
///// <summary>
///// 服务端地址
///// </summary>
//public string GrpcServer { get; set; }
///// <summary>
///// 备用服务器地址
///// </summary>
//public string GrpcServerBackup { get; set; }
/// <summary>
/// 版本号
/// </summary>
public string Version { get; set; }
/// <summary>
/// Grpc证书
/// </summary>
public string GrpcCredentials { get; set; }
/// <summary>
/// 机器人码
/// </summary>
public string MachineCode { get; set; }
private Metadata _authHeader;
/// <summary>
/// Grpc验证头
/// </summary>
public Metadata AuthHeader
{
get
{
if (_authHeader == null)
{
_authHeader = new Metadata();
_authHeader.Add("appid", Appid);
_authHeader.Add("appkey", Appkey);
}
return _authHeader;
}
}
/// <summary>
/// 服务器IP
/// </summary>
public List<string> Servers { get; set; }
private static Dictionary<GrpcType, GrpcConfig> grpcConfig = new Dictionary<GrpcType, GrpcConfig>();
public static GrpcConfig Get(GrpcType type, bool refresh = false)
{
//if (type == GrpcType.Huangfan)
//{
//}
////type = GrpcType.Laoyao;//TODO 这里强制用老妖的
lock (grpcConfig)
{
GrpcConfig config = grpcConfig.ContainsKey(type) ? grpcConfig[type] : null;
if (config != null && !refresh) return config;
switch (type)
{
case GrpcType.Awei:
config = new GrpcConfig()
{
Appid = "v1_meesii_CodeVip",
Appkey = "v2_d6fb34d020a209471fe7122d4a55e69c",
Servers = new List<string>() { "grpc.wxipad.com:12580" },
MachineCode = "v3_e9de924f32fae3126b42fac40b0f5b6d",
RandomEncryKey = CsharpHttpHelper.HttpExtend.RandomByte(16),
EnableSSL = true,
GrpcCredentials = @"-----BEGIN CERTIFICATE-----
MIIDqjCCApKgAwIBAgIJAOf7+/avi9foMA0GCSqGSIb3DQEBCwUAMGoxCzAJBgNV
BAYTAkNOMQswCQYDVQQIDAJ4eDELMAkGA1UEBwwCeHgxCzAJBgNVBAoMAnh4MQsw
CQYDVQQLDAJ4eDEUMBIGA1UEAwwLd2VjaGF0QHJvb3QxETAPBgkqhkiG9w0BCQEW
Anh4MB4XDTE4MDUwODAwMzE1MFoXDTI4MDUwNTAwMzE1MFowajELMAkGA1UEBhMC
Q04xCzAJBgNVBAgMAnh4MQswCQYDVQQHDAJ4eDELMAkGA1UECgwCeHgxCzAJBgNV
BAsMAnh4MRQwEgYDVQQDDAt3ZWNoYXRAcm9vdDERMA8GCSqGSIb3DQEJARYCeHgw
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNcWVlhOpXjqivCpJpVHCG
eM+Q/e83MDpqXmlT33hAFlCfUzWYYhFAHwc+xShkvuoaBwKpAr0fcHT7Kj4TLSJB
F9FwBccPp4Tv0YH0h4pzZ9nWZCMGXB5TlXAreXrcu8Qab0MPAxMKtMO0FZzQawRD
mO/S43u6tDBrhW2zgFzCUo+cRiCYRXoewuFVT4RT7eYvEu579oy4mto7YpR8GfPY
ywiTh7D/4To7nNoWbly84WB9ZSQ8HZoC1KTykqaeSGw7xUhKEoPoeKPke1ECfXB2
lSZMwKar2IU0BVlvxL55EMF8oXJozLVEZeVIZ4Wp9EFY2KaZJowgoOa1I+vcwBbd
AgMBAAGjUzBRMB0GA1UdDgQWBBR2SmMGUpTN/Dl0wcSYcPav6o01iDAfBgNVHSME
GDAWgBR2SmMGUpTN/Dl0wcSYcPav6o01iDAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
SIb3DQEBCwUAA4IBAQAdCSkska27VdLcGqK9/sraopxaX31Nseci/sJbimIHxr+q
DwAHExU5sJ1qT827n2OpF/lWMRhnJZ3ubeJ8oGA3CAKu4EiKKGA1hGOLCbEvagCc
sdBSegk050qkMssJzNaw7boZB8vek1RDK32Fuhsh4m+MUZBj6bJCdGW9K+ZMmpZl
bMwmsgqV6+EMvr+PhFHy8bOAdIs4/eOTjW7R0JwYgFArVXMrVKgiRknkhM+PBBHG
DPWO0j3855SF2X5r4jQs2PvKGJjOMuQeIgsf2GbwSQhXEhM8lGdjn9up8hm7VSXf
x8wZquXczPSdDez7tP+g9nKbxcJtGnxo8+Jntmvs
-----END CERTIFICATE-----",
Version = "7.0.3"
};
break;
case GrpcType.Laoyao:
config = new GrpcConfig()
{
Appid = "v1_LCEO_Code",
Appkey = "v2_4d5d55d6fbb6ce87b0f53019fefebb89",
Servers = new List<string>() { "111.230.216.32:12588" },
MachineCode = "v3_7af2592d5c49d94424bac95e80cb07a4",
RandomEncryKey = CsharpHttpHelper.HttpExtend.RandomByte(16),
EnableSSL = true,
GrpcCredentials = @"-----BEGIN CERTIFICATE-----
MIIDqjCCApKgAwIBAgIJAOf7+/avi9foMA0GCSqGSIb3DQEBCwUAMGoxCzAJBgNV
BAYTAkNOMQswCQYDVQQIDAJ4eDELMAkGA1UEBwwCeHgxCzAJBgNVBAoMAnh4MQsw
CQYDVQQLDAJ4eDEUMBIGA1UEAwwLd2VjaGF0QHJvb3QxETAPBgkqhkiG9w0BCQEW
Anh4MB4XDTE4MDUwODAwMzE1MFoXDTI4MDUwNTAwMzE1MFowajELMAkGA1UEBhMC
Q04xCzAJBgNVBAgMAnh4MQswCQYDVQQHDAJ4eDELMAkGA1UECgwCeHgxCzAJBgNV
BAsMAnh4MRQwEgYDVQQDDAt3ZWNoYXRAcm9vdDERMA8GCSqGSIb3DQEJARYCeHgw
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNcWVlhOpXjqivCpJpVHCG
eM+Q/e83MDpqXmlT33hAFlCfUzWYYhFAHwc+xShkvuoaBwKpAr0fcHT7Kj4TLSJB
F9FwBccPp4Tv0YH0h4pzZ9nWZCMGXB5TlXAreXrcu8Qab0MPAxMKtMO0FZzQawRD
mO/S43u6tDBrhW2zgFzCUo+cRiCYRXoewuFVT4RT7eYvEu579oy4mto7YpR8GfPY
ywiTh7D/4To7nNoWbly84WB9ZSQ8HZoC1KTykqaeSGw7xUhKEoPoeKPke1ECfXB2
lSZMwKar2IU0BVlvxL55EMF8oXJozLVEZeVIZ4Wp9EFY2KaZJowgoOa1I+vcwBbd
AgMBAAGjUzBRMB0GA1UdDgQWBBR2SmMGUpTN/Dl0wcSYcPav6o01iDAfBgNVHSME
GDAWgBR2SmMGUpTN/Dl0wcSYcPav6o01iDAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
SIb3DQEBCwUAA4IBAQAdCSkska27VdLcGqK9/sraopxaX31Nseci/sJbimIHxr+q
DwAHExU5sJ1qT827n2OpF/lWMRhnJZ3ubeJ8oGA3CAKu4EiKKGA1hGOLCbEvagCc
sdBSegk050qkMssJzNaw7boZB8vek1RDK32Fuhsh4m+MUZBj6bJCdGW9K+ZMmpZl
bMwmsgqV6+EMvr+PhFHy8bOAdIs4/eOTjW7R0JwYgFArVXMrVKgiRknkhM+PBBHG
DPWO0j3855SF2X5r4jQs2PvKGJjOMuQeIgsf2GbwSQhXEhM8lGdjn9up8hm7VSXf
x8wZquXczPSdDez7tP+g9nKbxcJtGnxo8+Jntmvs
-----END CERTIFICATE-----",
Version = "7.0.3"
};
//Console.WriteLine(config.AuthHeader);
break;
case GrpcType.Huangfan:
config = new GrpcConfig()
{
Appid = "v1_23229f55b208d33b_CodeVip",
Appkey = "v2_d72d0b8d148afb50e8a0beed37efd1b5",
Servers = new List<string>() { "47.93.227.173:12580" },
MachineCode = "v3_951b8b394d904962d981f02e5d4cee31",
RandomEncryKey = CsharpHttpHelper.HttpExtend.RandomByte(16),
GrpcCredentials = @"-----BEGIN CERTIFICATE-----
MIIDqjCCApKgAwIBAgIJAOf7+/avi9foMA0GCSqGSIb3DQEBCwUAMGoxCzAJBgNV
BAYTAkNOMQswCQYDVQQIDAJ4eDELMAkGA1UEBwwCeHgxCzAJBgNVBAoMAnh4MQsw
CQYDVQQLDAJ4eDEUMBIGA1UEAwwLd2VjaGF0QHJvb3QxETAPBgkqhkiG9w0BCQEW
Anh4MB4XDTE4MDUwODAwMzE1MFoXDTI4MDUwNTAwMzE1MFowajELMAkGA1UEBhMC
Q04xCzAJBgNVBAgMAnh4MQswCQYDVQQHDAJ4eDELMAkGA1UECgwCeHgxCzAJBgNV
BAsMAnh4MRQwEgYDVQQDDAt3ZWNoYXRAcm9vdDERMA8GCSqGSIb3DQEJARYCeHgw
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNcWVlhOpXjqivCpJpVHCG
eM+Q/e83MDpqXmlT33hAFlCfUzWYYhFAHwc+xShkvuoaBwKpAr0fcHT7Kj4TLSJB
F9FwBccPp4Tv0YH0h4pzZ9nWZCMGXB5TlXAreXrcu8Qab0MPAxMKtMO0FZzQawRD
mO/S43u6tDBrhW2zgFzCUo+cRiCYRXoewuFVT4RT7eYvEu579oy4mto7YpR8GfPY
ywiTh7D/4To7nNoWbly84WB9ZSQ8HZoC1KTykqaeSGw7xUhKEoPoeKPke1ECfXB2
lSZMwKar2IU0BVlvxL55EMF8oXJozLVEZeVIZ4Wp9EFY2KaZJowgoOa1I+vcwBbd
AgMBAAGjUzBRMB0GA1UdDgQWBBR2SmMGUpTN/Dl0wcSYcPav6o01iDAfBgNVHSME
GDAWgBR2SmMGUpTN/Dl0wcSYcPav6o01iDAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
SIb3DQEBCwUAA4IBAQAdCSkska27VdLcGqK9/sraopxaX31Nseci/sJbimIHxr+q
DwAHExU5sJ1qT827n2OpF/lWMRhnJZ3ubeJ8oGA3CAKu4EiKKGA1hGOLCbEvagCc
sdBSegk050qkMssJzNaw7boZB8vek1RDK32Fuhsh4m+MUZBj6bJCdGW9K+ZMmpZl
bMwmsgqV6+EMvr+PhFHy8bOAdIs4/eOTjW7R0JwYgFArVXMrVKgiRknkhM+PBBHG
DPWO0j3855SF2X5r4jQs2PvKGJjOMuQeIgsf2GbwSQhXEhM8lGdjn9up8hm7VSXf
x8wZquXczPSdDez7tP+g9nKbxcJtGnxo8+Jntmvs
-----END CERTIFICATE-----",
Version = "7.0.3"
};
Console.WriteLine(config.AuthHeader);
break;
default:
break;
}
if (config != null)
{
config.Type = type;
grpcConfig[type] = config;
}
return config;
}
}
}
class GrpcClient : IDisposable
{
private Channel _channel;
private WechatClient _baseClient;
/// <summary>
/// GRpc配置信息
/// </summary>
public GrpcConfig Config { get; private set; }
public GrpcClient(GrpcConfig config = null)
{
if (config != null)
{
Config = config;
}
Init();
}
public bool IsConnected
{
get
{
if (_channel != null && (_channel.State == ChannelState.Ready || _channel.State == ChannelState.Connecting || _channel.State == ChannelState.Idle))
{
return true;
}
return false;
}
}
/// <summary>
/// 初始化
/// </summary>
public void Init()
{
if (Config.Servers.Count == 0)
{
LogHelper.GetSingleObj().Error("Grpc服务器", "当前无可用的Grpc服务器");
return;
}
this.Stop();
Config.Servers = ChatClient.GetServerDataMethod("grpc_type_" + Config.Type.ToString().ToLower()).Split(',').ToList();
//if (Config.Type == GrpcType.Huangfan) Config.Servers = new string[] { "106.15.26.141:12580" }.ToList();
// Config.Servers = new string[] { "45.253.67.81:12580" }.ToList();
//switch (Config.Type)
//{
// case GrpcType.Awei:
// break;
// case GrpcType.Laoyao:
// break;
// case GrpcType.Huangfan:
// break;
// default:
// break;
//}
var channelOptions = new List<ChannelOption>
{
new ChannelOption(ChannelOptions.SslTargetNameOverride,"wechat@root"),
new ChannelOption(ChannelOptions.MaxConcurrentStreams,int.MaxValue),
new ChannelOption(ChannelOptions.MaxSendMessageLength,int.MaxValue),
new ChannelOption(ChannelOptions.MaxReceiveMessageLength,int.MaxValue)
};
if (Config.EnableSSL)
{
var grpcCredentials = new SslCredentials(Config.GrpcCredentials);
_channel = new Channel(ServerIp, grpcCredentials, channelOptions);
}
else
_channel = new Channel(ServerIp, ChannelCredentials.Insecure, channelOptions);
_baseClient = new WechatClient(_channel);
}
/// <summary>
/// 停止GRpc
/// </summary>
public void Stop()
{
if (_channel != null)
{
try
{
_channel.ShutdownAsync().Wait();
_baseClient = null;
_channel = null;
}
catch
{
// ignored
}
}
}
public DateTime LastTime { get; private set; }
/// <summary>
/// Grpc发包5次尝试
/// </summary>
/// <param name="pack"></param>
/// <returns></returns>
public Task<WechatMsg> Send(WechatMsg _pack, WXClientImpl_IPAD weixin)
{
#region 20198121:49:42
////while (_baseClient == null)
////{
//// Thread.Sleep(100);
////}
//return Task.Run(() =>
//{
// var tryTimes = 3;
//again:
// var cmd = 0;
// try
// {
// if (this._channel == null) this.Init();
// LastTime = DateTime.Now;
// cmd = pack.BaseMsg.Cmd;
// var send = pack.Clone();
// send.Token = Config.MachineCode;
// //return _baseClient.HelloWechat(send, Config.AuthHeader, DateTime.UtcNow.AddSeconds(10));
// return _baseClient.HelloWechatAsync(send, Config.AuthHeader, DateTime.UtcNow.AddSeconds(10)).ResponseAsync.Result;
// }
// catch (RpcException ex)
// {
// if (tryTimes >= 0)
// {
// tryTimes--;
// Thread.Sleep(1000);
// if (ex.StatusCode == StatusCode.Unknown || ex.StatusCode == StatusCode.DeadlineExceeded)
// {
// this.Init();
// goto again;
// }
// else if (ex.StatusCode == StatusCode.Unavailable) goto again;
// }
// LogHelper.GetSingleObj().Error("Grpc异常" + cmd, $"StatusCode ->{ex.StatusCode} Msg ->{ex.Message}");
// return null;
// }
//});
#endregion
#region
//while (_baseClient == null)
//{
// Thread.Sleep(100);
//}
WechatMsg pack = _pack;
return Task.Run<WechatMsg>(() =>
{
var tryTimes = 3;
for (int i = 0; i < tryTimes; i++)
{
if (i > 0) Thread.Sleep(1000);
var cmd = 0;
try
{
if (this._channel == null || _baseClient == null)
this.Init();
LastTime = DateTime.Now;
cmd = pack.BaseMsg.Cmd;
var send = pack.Clone();
send.Token = Config.MachineCode;
//return _baseClient.HelloWechat(send, Config.AuthHeader, DateTime.UtcNow.AddSeconds(10));
return _baseClient.HelloWechatAsync(send, Config.AuthHeader, DateTime.UtcNow.AddSeconds(10)).ResponseAsync.Result;
}
catch (RpcException ex)
{
LogHelper.GetSingleObj().Error("Grpc异常" + cmd, $"StatusCode ->{ex.StatusCode} Msg ->{ex.Message}");
if (ex.StatusCode == StatusCode.Unavailable) continue;
else if (ex.StatusCode == StatusCode.Unknown || ex.StatusCode == StatusCode.DeadlineExceeded)
{
this.Init();
continue;
}
}
catch (Exception ex)
{
LogHelper.GetSingleObj().Error("Grpc异常" + cmd, $"Msg ->{ex.InnerException}");
continue;
}
}
return null;
});
#endregion
}
public void Dispose()
{
}
/// <summary>
/// 上次获取时间
/// </summary>
private readonly DateTime _checkDate = DateTime.Now;
/// <summary>
/// Grpc服务器IP
/// </summary>
private string _serverIp;
/// <summary>
/// Grpc服务器IP
/// </summary>
public string ServerIp
{
get
{
//return "grpc.wxipad.com:12580";
//if (string.IsNullOrEmpty(ServerIp) || (DateTime.Now - _checkDate).TotalSeconds >= 300)
//{
// GetConfig();
//}
var random = new Random();
var index = random.Next(0, Config.Servers.Count);
_serverIp = Config.Servers[index];
return _serverIp;
}
}
}
}