using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Win32;
using System.Diagnostics;
namespace BarrageGrab.Proxy
{
internal abstract class SystemProxy : ISystemProxy
{
//弹幕服务域名
protected string[] barrageWsHostNames = new string[]
{
"webcast3-ws-web-hl.douyin.com",
"webcast3-ws-web-lf.douyin.com",
"frontier-im.douyin.com"
};
//https://live.douyin.com/webcast/gift/list/
///
/// 接收到websocket消息事件
///
public event EventHandler OnWebSocketData;
///
/// 代理端口
///
public int ProxyPort { get => Appsetting.Instanse.ProxyPort; }
public abstract void Dispose();
public abstract void Start();
protected void SendWebSocketData(WsMessageEventArgs args)
{
OnWebSocketData?.Invoke(this, args);
}
protected string GetProcessName(int processID)
{
var process = Process.GetProcessById(processID);
if (process != null)
{
return process.ProcessName;
}
return $"<{processID}>";
}
// 生成自签名证书
protected X509Certificate2 EnsureCertificate(string subjectName)
{
// 添加证书到证书存储
var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);
//判断证书是否已经存在
var certificates = store.Certificates.Find(X509FindType.FindBySubjectName, subjectName, false);
if (certificates.Count > 0)
{
return certificates[0];
}
// 创建证书请求
var request = new CertificateRequest($"CN={subjectName}", RSA.Create(2048), HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
// 添加扩展属性
request.CertificateExtensions.Add(new X509BasicConstraintsExtension(false, false, 0, false));
request.CertificateExtensions.Add(new X509KeyUsageExtension(X509KeyUsageFlags.KeyEncipherment | X509KeyUsageFlags.DigitalSignature, false));
request.CertificateExtensions.Add(new X509SubjectKeyIdentifierExtension(request.PublicKey, false));
// 用自己的私钥签名并生成证书
var certificate = request.CreateSelfSigned(DateTimeOffset.Now.AddDays(-1), DateTimeOffset.Now.AddDays(365));
store.Add(certificate);
store.Close();
return certificate;
}
//注册系统代理
protected void RegisterSystemProxy()
{
RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true);
registry.SetValue("ProxyEnable", 1);
registry.SetValue("ProxyServer", $"http=localhost:{ProxyPort};https=localhost:{ProxyPort}");
}
///
/// 关闭系统代理
///
protected void CloseSystemProxy()
{
RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true);
registry.SetValue("ProxyEnable", 0);
registry.SetValue("ProxyServer", $"http=localhost:{ProxyPort};https=localhost:{ProxyPort}");
}
}
}