将代理内核换为 Titanium.Web.Proxy ,解决了高内存,高cpu 占用的问题

This commit is contained in:
小白猿
2023-03-04 14:52:04 +08:00
parent dc5dddc3d6
commit 1190e3c031
12 changed files with 456 additions and 11 deletions
+3
View File
@@ -3,6 +3,9 @@
## ##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
FiddlerCore4
# User-specific files # User-specific files
*.rsuser *.rsuser
*.suo *.suo
+8 -1
View File
@@ -11,12 +11,14 @@ namespace BarrageGrab
{ {
private static readonly Appsetting ins = new Appsetting(); private static readonly Appsetting ins = new Appsetting();
public static Appsetting Instanse { get => Get(); }
public Appsetting() public Appsetting()
{ {
FilterProcess = AppSettings["filterProcess"].Trim().Split(','); FilterProcess = AppSettings["filterProcess"].Trim().Split(',');
WsProt = int.Parse(AppSettings["wsListenPort"]); WsProt = int.Parse(AppSettings["wsListenPort"]);
PrintBarrage = AppSettings["printBarrage"] == "on"; PrintBarrage = AppSettings["printBarrage"].ToLower() == "true";
ProxyPort = int.Parse(AppSettings["proxPort"]);
} }
public static Appsetting Get() public static Appsetting Get()
@@ -38,5 +40,10 @@ namespace BarrageGrab
/// 控制台打印消息开关 /// 控制台打印消息开关
/// </summary> /// </summary>
public bool PrintBarrage { get; private set; } public bool PrintBarrage { get; private set; }
/// <summary>
/// 代理端口
/// </summary>
public int ProxyPort { get; private set; } = 8827;
} }
} }
+1 -1
View File
@@ -132,7 +132,7 @@
/// <summary> /// <summary>
/// 抖币价格 /// 抖币价格
/// </summary> /// </summary>
public int GiamondCount { get; set; } public int DiamondCount { get; set; }
} }
/// <summary> /// <summary>
+116
View File
@@ -0,0 +1,116 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
using ColorConsole;
using Fiddler;
using Microsoft.Win32;
namespace BarrageGrab.Proxy
{
/// <summary>
/// FiddlerCore 代理程序
/// </summary>
[Obsolete("由于框架存在内存泄漏,已弃用,请使用TitaniumProxy)", false)]
internal class FiddlerProxy : SystemProxy
{
bool disposed = false;
ConsoleWriter console = new ConsoleWriter();
public FiddlerProxy()
{
InitFiddler();
}
//初始化Fiddler
private void InitFiddler()
{
//这个名字随便
FiddlerApplication.SetAppDisplayName("FiddlerCore");
FiddlerApplication.OnWebSocketMessage += FiddlerApplication_OnWebSocketMessage;
//FiddlerApplication.OnReadResponseBuffer += OnReadResponseBuffer;
//设置pac规则,匹配douyin且排除douyincdn的host走代理,其余的直连
FiddlerApplication.Prefs.SetStringPref("fiddler.proxy.pacfile.text", $"if (/douyin(?!cdn)/.test(host)) {{return 'PROXY 127.0.0.1:{base.ProxyPort}' }} return 'DIRECT'");
X509Certificate2 oRootCert;
if (null == CertMaker.GetRootCertificate())
{
CertMaker.createRootCert();
oRootCert = CertMaker.GetRootCertificate();
X509Store certStore = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
certStore.Open(OpenFlags.ReadWrite);
try
{
certStore.Add(oRootCert);
}
finally
{
certStore.Close();
}
}
else
{
oRootCert = CertMaker.GetRootCertificate();
}
//信任证书
CertMaker.trustRootCert();
FiddlerApplication.oDefaultClientCertificate = oRootCert;
//忽略服务器证书错误
CONFIG.IgnoreServerCertErrors = true;
CONFIG.bEnableIPv6 = false;
//CONFIG.bCaptureCONNECT = true;
//CONFIG.bUseEventLogForExceptions = false;
//CONFIG.bAutoProxyLogon = false;
//CONFIG.bMITM_HTTPS = false;
////CONFIG.SetNoDecryptList("*");
}
private void FiddlerApplication_OnWebSocketMessage(object sender, WebSocketMessageEventArgs e)
{
var msg = e.oWSM;
FieldInfo field = msg.GetType().GetField("_wsOwner", BindingFlags.NonPublic | BindingFlags.Instance);
WebSocket obj = (WebSocket)field.GetValue(msg);
field = obj.GetType().GetField("oCP", BindingFlags.NonPublic | BindingFlags.Instance);
var sessionField = obj.GetType().GetField("_mySession", BindingFlags.NonPublic | BindingFlags.Instance);
ClientPipe ocp = (ClientPipe)field.GetValue(obj);
Session session = (Session)sessionField.GetValue(obj);
this.SendWebSocketData(new WsMessageEventArgs()
{
Payload = msg.PayloadData,
ProcessID = ocp.LocalProcessID,
ProcessName = ocp.LocalProcessName,
HostName = session.hostname,
});
}
public override void Start()
{
FiddlerApplication.Startup(Appsetting.Instanse.ProxyPort, FiddlerCoreStartupFlags.Default);
console.WriteLine("Fiddler代理已启动", ConsoleColor.Green);
}
public override void Dispose()
{
if (disposed) return;
FiddlerApplication.Shutdown();
CloseSystemProxy();
console.WriteLine("Fiddler代理已关闭");
disposed = true;
}
}
}
+40
View File
@@ -0,0 +1,40 @@
using System;
using Fiddler;
using System.Reflection;
namespace BarrageGrab.Proxy
{
internal interface ISystemProxy : IDisposable
{
event EventHandler<WsMessageEventArgs> OnWebSocketData;
/// <summary>
/// 开始监听
/// </summary>
void Start();
}
public class WsMessageEventArgs
{
/// <summary>
/// 消息体
/// </summary>
public byte[] Payload { get; set; }
/// <summary>
/// 进程ID
/// </summary>
public int ProcessID { get; set; }
/// <summary>
/// 进程名
/// </summary>
public string ProcessName { get; set; }
/// <summary>
/// 域名
/// </summary>
public string HostName { get; set; }
}
}
+103
View File
@@ -0,0 +1,103 @@
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/
/// <summary>
/// 接收到websocket消息事件
/// </summary>
public event EventHandler<WsMessageEventArgs> OnWebSocketData;
/// <summary>
/// 代理端口
/// </summary>
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}");
}
/// <summary>
/// 关闭系统代理
/// </summary>
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}");
}
}
}
+129
View File
@@ -0,0 +1,129 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Security;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Win32;
using Titanium.Web.Proxy;
using Titanium.Web.Proxy.EventArguments;
using Titanium.Web.Proxy.Http;
using Titanium.Web.Proxy.Models;
using Titanium.Web.Proxy.StreamExtended.Network;
namespace BarrageGrab.Proxy
{
internal class TitaniumProxy : SystemProxy
{
ProxyServer proxyServer = null;
ExplicitProxyEndPoint explicitEndPoint = null;
public TitaniumProxy()
{
//注册系统代理
//RegisterSystemProxy();
proxyServer = new ProxyServer();
//var cert = EnsureCertificate("localhost");
proxyServer.ReuseSocket = false;
proxyServer.EnableConnectionPool = true;
proxyServer.ForwardToUpstreamGateway = true;
proxyServer.CertificateManager.SaveFakeCertificates = true;
proxyServer.ServerCertificateValidationCallback += ProxyServer_ServerCertificateValidationCallback; ;
proxyServer.BeforeResponse += ProxyServer_BeforeResponse;
explicitEndPoint = new ExplicitProxyEndPoint(IPAddress.Any,ProxyPort, true);
explicitEndPoint.BeforeTunnelConnectRequest += ExplicitEndPoint_BeforeTunnelConnectRequest;
proxyServer.AddEndPoint(explicitEndPoint);
}
private Task ProxyServer_ServerCertificateValidationCallback(object sender, CertificateValidationEventArgs e)
{
// set IsValid to true/false based on Certificate Errors
if (e.SslPolicyErrors == SslPolicyErrors.None)
{
e.IsValid = true;
}
return Task.CompletedTask;
}
private async Task ProxyServer_BeforeResponse(object sender, SessionEventArgs e)
{
string hostname = e.HttpClient.Request.RequestUri.Host;
if (!barrageWsHostNames.Contains(hostname)) return;
if (e.HttpClient.ConnectRequest?.TunnelType == TunnelType.Websocket)
{
e.DataReceived += WebSocket_DataReceived;
}
}
//List<string> hostlist = new List<string>();
private async Task ExplicitEndPoint_BeforeTunnelConnectRequest(object sender, TunnelConnectSessionEventArgs e)
{
string hostname = e.HttpClient.Request.RequestUri.Host;
if (!barrageWsHostNames.Contains(hostname))
{
e.DecryptSsl = false;
}
}
private async void WebSocket_DataReceived(object sender, DataEventArgs e)
{
var args = (SessionEventArgs)sender;
string hostname = args.HttpClient.Request.RequestUri.Host;
var processid = args.HttpClient.ProcessId.Value;
var frames = args.WebSocketDecoderReceive.Decode(e.Buffer, e.Offset, e.Count).ToList();
//Console.WriteLine(frames.Count);
foreach (var frame in frames)
{
//Console.WriteLine(frame.GetText());
base.SendWebSocketData(new WsMessageEventArgs()
{
ProcessID = processid,
HostName = hostname,
Payload = frame.Data.ToArray(),
ProcessName = base.GetProcessName(processid)
});
}
//Console.WriteLine("获取到弹幕信息:" + hostname);
}
/// <summary>
/// 释放资源,关闭系统代理
/// </summary>
override public void Dispose()
{
proxyServer.Stop();
proxyServer.Dispose();
CloseSystemProxy();
}
/// <summary>
/// 启动监听
/// </summary>
override public void Start()
{
proxyServer.Start();
proxyServer.SetAsSystemHttpProxy(explicitEndPoint);
proxyServer.SetAsSystemHttpsProxy(explicitEndPoint);
}
}
}
+7 -3
View File
@@ -8,6 +8,7 @@ using System.Threading.Tasks;
using BarrageGrab.ProtoEntity; using BarrageGrab.ProtoEntity;
using ProtoBuf; using ProtoBuf;
using ColorConsole; using ColorConsole;
using BarrageGrab.Proxy;
namespace BarrageGrab namespace BarrageGrab
{ {
@@ -16,7 +17,8 @@ namespace BarrageGrab
/// </summary> /// </summary>
public class WssBarrageGrab : IDisposable public class WssBarrageGrab : IDisposable
{ {
FiddlerProxy proxy = new FiddlerProxy(); //ISystemProxy proxy = new FiddlerProxy();
ISystemProxy proxy = new TitaniumProxy();
Appsetting appsetting = Appsetting.Get(); Appsetting appsetting = Appsetting.Get();
ConsoleWriter console = new ConsoleWriter(); ConsoleWriter console = new ConsoleWriter();
@@ -94,13 +96,14 @@ namespace BarrageGrab
return outBuffer.ToArray(); return outBuffer.ToArray();
} }
private void Proxy_OnWebSocketData(object sender, FiddlerProxy.WsMessageEventArgs e) private void Proxy_OnWebSocketData(object sender, WsMessageEventArgs e)
{ {
if (!appsetting.FilterProcess.Contains(e.ProcessName)) return; if (!appsetting.FilterProcess.Contains(e.ProcessName)) return;
var buff = e.Message.PayloadData; var buff = e.Payload;
if (buff.Length == 0) return; if (buff.Length == 0) return;
if (buff[0] != 0x08) return; if (buff[0] != 0x08) return;
try try
{ {
var enty = Serializer.Deserialize<WssResponse>(new ReadOnlyMemory<byte>(buff)); var enty = Serializer.Deserialize<WssResponse>(new ReadOnlyMemory<byte>(buff));
@@ -109,6 +112,7 @@ namespace BarrageGrab
//检测包格式 //检测包格式
if (!enty.Headers.Any(a => a.Key == "compress_type" && a.Value == "gzip")) return; if (!enty.Headers.Any(a => a.Key == "compress_type" && a.Value == "gzip")) return;
//解压gzip //解压gzip
var odata = enty.Payload; var odata = enty.Payload;
var decomp = Decompress(odata); var decomp = Decompress(odata);
+1 -1
View File
@@ -96,7 +96,7 @@ namespace BarrageGrab
{ {
RoomId = e.Common.roomId, RoomId = e.Common.roomId,
Content = e.Common.Describe, Content = e.Common.Describe,
GiamondCount = e.Gift.diamondCount, DiamondCount = e.Gift.diamondCount,
GiftCount = e.repeatCount, GiftCount = e.repeatCount,
GiftId = e.giftId, GiftId = e.giftId,
GiftName = e.Gift.Name, GiftName = e.Gift.Name,
+24 -4
View File
@@ -50,18 +50,24 @@
<Reference Include="BCMakeCert, Version=2.0.7.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="BCMakeCert, Version=2.0.7.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\FiddlerCore.4.6.2.0\lib\net40\BCMakeCert.dll</HintPath> <HintPath>..\packages\FiddlerCore.4.6.2.0\lib\net40\BCMakeCert.dll</HintPath>
</Reference> </Reference>
<Reference Include="BouncyCastle.Crypto, Version=1.8.8.0, Culture=neutral, PublicKeyToken=0e99375e54769942, processorArchitecture=MSIL">
<HintPath>..\packages\Portable.BouncyCastle.1.8.8\lib\net40\BouncyCastle.Crypto.dll</HintPath>
</Reference>
<Reference Include="BrotliSharpLib, Version=0.3.2.0, Culture=neutral, PublicKeyToken=3f4e2a1cd615fcb7, processorArchitecture=MSIL">
<HintPath>..\packages\BrotliSharpLib.0.3.3\lib\net451\BrotliSharpLib.dll</HintPath>
</Reference>
<Reference Include="CertMaker, Version=4.5.0.1, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="CertMaker, Version=4.5.0.1, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\FiddlerCore.4.6.2.0\lib\net40\CertMaker.dll</HintPath> <HintPath>..\packages\FiddlerCore.4.6.2.0\lib\net40\CertMaker.dll</HintPath>
</Reference> </Reference>
<Reference Include="ColorConsole, Version=1.0.1.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="ColorConsole, Version=1.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\ColorConsole.1.0.1\lib\net40\ColorConsole.dll</HintPath> <HintPath>..\packages\ColorConsole.1.0.1\lib\net40\ColorConsole.dll</HintPath>
</Reference> </Reference>
<Reference Include="FiddlerCore4, Version=4.6.2.0, Culture=neutral, PublicKeyToken=67cb91587178ac5a, processorArchitecture=MSIL">
<HintPath>..\packages\FiddlerCore.4.6.2.0\lib\net40\FiddlerCore4.dll</HintPath>
</Reference>
<Reference Include="Fleck, Version=1.2.0.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="Fleck, Version=1.2.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Fleck.1.2.0\lib\net45\Fleck.dll</HintPath> <HintPath>..\packages\Fleck.1.2.0\lib\net45\Fleck.dll</HintPath>
</Reference> </Reference>
<Reference Include="Microsoft.Win32.Registry, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Win32.Registry.5.0.0\lib\net461\Microsoft.Win32.Registry.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath> <HintPath>..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference> </Reference>
@@ -90,19 +96,33 @@
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> <Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath> <HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference> </Reference>
<Reference Include="System.Security.AccessControl, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.AccessControl.5.0.0\lib\net461\System.Security.AccessControl.dll</HintPath>
</Reference>
<Reference Include="System.Security.Principal.Windows, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Principal.Windows.5.0.0\lib\net461\System.Security.Principal.Windows.dll</HintPath>
</Reference>
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.Xml.Linq" /> <Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" /> <Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.Net.Http" /> <Reference Include="System.Net.Http" />
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="Titanium.Web.Proxy, Version=1.0.1.0, Culture=neutral, PublicKeyToken=8e41e1f1c790d7cf, processorArchitecture=MSIL">
<HintPath>..\packages\Titanium.Web.Proxy.3.2.0\lib\net461\Titanium.Web.Proxy.dll</HintPath>
</Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="Appsetting.cs" /> <Compile Include="Appsetting.cs" />
<Compile Include="Proxy\ISystemProxy.cs" />
<Compile Include="JsonEntity\BarrageMessages.cs" /> <Compile Include="JsonEntity\BarrageMessages.cs" />
<Compile Include="Program.cs" /> <Compile Include="Program.cs" />
<Compile Include="Proxy\SystemProxy.cs" />
<Compile Include="Proxy\TitaniumProxy.cs" />
<Compile Include="WssBarrageGrab.cs" /> <Compile Include="WssBarrageGrab.cs" />
<Compile Include="FiddlerProxy.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="ProtoEntity\Messages.cs" /> <Compile Include="ProtoEntity\Messages.cs" />
<Compile Include="ProtoEntity\Wss.cs" /> <Compile Include="ProtoEntity\Wss.cs" />
+7
View File
@@ -1,9 +1,12 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="BrotliSharpLib" version="0.3.3" targetFramework="net48" />
<package id="ColorConsole" version="1.0.1" targetFramework="net48" /> <package id="ColorConsole" version="1.0.1" targetFramework="net48" />
<package id="FiddlerCore" version="4.6.2.0" targetFramework="net48" /> <package id="FiddlerCore" version="4.6.2.0" targetFramework="net48" />
<package id="Fleck" version="1.2.0" targetFramework="net48" /> <package id="Fleck" version="1.2.0" targetFramework="net48" />
<package id="Microsoft.Win32.Registry" version="5.0.0" targetFramework="net48" />
<package id="Newtonsoft.Json" version="13.0.1" targetFramework="net48" /> <package id="Newtonsoft.Json" version="13.0.1" targetFramework="net48" />
<package id="Portable.BouncyCastle" version="1.8.8" targetFramework="net48" />
<package id="protobuf-net" version="3.1.22" targetFramework="net48" /> <package id="protobuf-net" version="3.1.22" targetFramework="net48" />
<package id="protobuf-net.Core" version="3.1.22" targetFramework="net48" /> <package id="protobuf-net.Core" version="3.1.22" targetFramework="net48" />
<package id="System.Buffers" version="4.5.1" targetFramework="net48" /> <package id="System.Buffers" version="4.5.1" targetFramework="net48" />
@@ -11,4 +14,8 @@
<package id="System.Memory" version="4.5.4" targetFramework="net48" /> <package id="System.Memory" version="4.5.4" targetFramework="net48" />
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net48" /> <package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net48" />
<package id="System.Runtime.CompilerServices.Unsafe" version="4.5.3" targetFramework="net48" /> <package id="System.Runtime.CompilerServices.Unsafe" version="4.5.3" targetFramework="net48" />
<package id="System.Security.AccessControl" version="5.0.0" targetFramework="net48" />
<package id="System.Security.Principal.Windows" version="5.0.0" targetFramework="net48" />
<package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net48" />
<package id="Titanium.Web.Proxy" version="3.2.0" targetFramework="net48" />
</packages> </packages>
+16
View File
@@ -5,16 +5,32 @@ VisualStudioVersion = 17.2.32408.312
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WssBarrageService", "BarrageGrab\WssBarrageService.csproj", "{A07BB1DA-D5C2-4EEA-9F3F-E42AADB9C1D6}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WssBarrageService", "BarrageGrab\WssBarrageService.csproj", "{A07BB1DA-D5C2-4EEA-9F3F-E42AADB9C1D6}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FiddlerCore4", "FiddlerCore4\FiddlerCore4.csproj", "{6E137484-17DC-4AB2-A1BB-2E6E050A9F54}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU Release|Any CPU = Release|Any CPU
Release|x86 = Release|x86
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{A07BB1DA-D5C2-4EEA-9F3F-E42AADB9C1D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A07BB1DA-D5C2-4EEA-9F3F-E42AADB9C1D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A07BB1DA-D5C2-4EEA-9F3F-E42AADB9C1D6}.Debug|Any CPU.Build.0 = Debug|Any CPU {A07BB1DA-D5C2-4EEA-9F3F-E42AADB9C1D6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A07BB1DA-D5C2-4EEA-9F3F-E42AADB9C1D6}.Debug|x86.ActiveCfg = Debug|Any CPU
{A07BB1DA-D5C2-4EEA-9F3F-E42AADB9C1D6}.Debug|x86.Build.0 = Debug|Any CPU
{A07BB1DA-D5C2-4EEA-9F3F-E42AADB9C1D6}.Release|Any CPU.ActiveCfg = Release|Any CPU {A07BB1DA-D5C2-4EEA-9F3F-E42AADB9C1D6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A07BB1DA-D5C2-4EEA-9F3F-E42AADB9C1D6}.Release|Any CPU.Build.0 = Release|Any CPU {A07BB1DA-D5C2-4EEA-9F3F-E42AADB9C1D6}.Release|Any CPU.Build.0 = Release|Any CPU
{A07BB1DA-D5C2-4EEA-9F3F-E42AADB9C1D6}.Release|x86.ActiveCfg = Release|Any CPU
{A07BB1DA-D5C2-4EEA-9F3F-E42AADB9C1D6}.Release|x86.Build.0 = Release|Any CPU
{6E137484-17DC-4AB2-A1BB-2E6E050A9F54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6E137484-17DC-4AB2-A1BB-2E6E050A9F54}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6E137484-17DC-4AB2-A1BB-2E6E050A9F54}.Debug|x86.ActiveCfg = Debug|Any CPU
{6E137484-17DC-4AB2-A1BB-2E6E050A9F54}.Debug|x86.Build.0 = Debug|Any CPU
{6E137484-17DC-4AB2-A1BB-2E6E050A9F54}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6E137484-17DC-4AB2-A1BB-2E6E050A9F54}.Release|Any CPU.Build.0 = Release|Any CPU
{6E137484-17DC-4AB2-A1BB-2E6E050A9F54}.Release|x86.ActiveCfg = Release|Any CPU
{6E137484-17DC-4AB2-A1BB-2E6E050A9F54}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE