优化
This commit is contained in:
@@ -40,6 +40,7 @@ namespace BarrageGrab
|
|||||||
PollingInterval = int.Parse(AppSettings["pollingInterval"].Trim());
|
PollingInterval = int.Parse(AppSettings["pollingInterval"].Trim());
|
||||||
DisableLivePageScriptCache = bool.Parse(AppSettings["disableLivePageScriptCache"].Trim());
|
DisableLivePageScriptCache = bool.Parse(AppSettings["disableLivePageScriptCache"].Trim());
|
||||||
WebRoomIds = AppSettings["webRoomIds"].Trim().Split(',').Where(w => !string.IsNullOrWhiteSpace(w)).ToArray();
|
WebRoomIds = AppSettings["webRoomIds"].Trim().Split(',').Where(w => !string.IsNullOrWhiteSpace(w)).ToArray();
|
||||||
|
LiveCompanPath = AppSettings["liveCompanPath"].Trim();
|
||||||
|
|
||||||
ConfigComPort();
|
ConfigComPort();
|
||||||
ConfigFilter();
|
ConfigFilter();
|
||||||
@@ -243,5 +244,10 @@ namespace BarrageGrab
|
|||||||
/// 是否启用串口过滤器脚本
|
/// 是否启用串口过滤器脚本
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool UseComPortFilter { get; set; }
|
public bool UseComPortFilter { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 直播伴侣文件位置
|
||||||
|
/// </summary>
|
||||||
|
public string LiveCompanPath { get; set; } = string.Empty;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,8 +28,27 @@ namespace BarrageGrab
|
|||||||
{
|
{
|
||||||
//获取快捷方式的目标路径
|
//获取快捷方式的目标路径
|
||||||
exePath = GetInkTargetPath(shortcutPath);
|
exePath = GetInkTargetPath(shortcutPath);
|
||||||
|
if (!File.Exists(exePath))
|
||||||
|
{
|
||||||
|
exePath = "";
|
||||||
|
Logger.LogWarn($"直播伴侣.lnk 所指向的exe文件位置 {exePath} 无效");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Logger.LogInfo("未找到直播伴侣的桌面快捷方式");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//再从配置文件读取
|
||||||
|
if (exePath.IsNullOrWhiteSpace())
|
||||||
|
{
|
||||||
|
exePath = AppSetting.Current.LiveCompanPath;
|
||||||
|
if(!exePath.IsNullOrWhiteSpace() && !File.Exists(exePath))
|
||||||
|
{
|
||||||
|
Logger.LogWarn($"所配置的 {exePath} 不存在");
|
||||||
|
exePath = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
return exePath;
|
return exePath;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,7 +60,7 @@ namespace BarrageGrab
|
|||||||
var exePath = GetExePath();
|
var exePath = GetExePath();
|
||||||
if (string.IsNullOrEmpty(exePath))
|
if (string.IsNullOrEmpty(exePath))
|
||||||
{
|
{
|
||||||
Logger.LogWarn("未找到直播伴侣的exe文件,跳过环境设置");
|
Logger.LogWarn("未找到直播伴侣.exe文件,跳过环境设置");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -191,6 +191,133 @@ namespace BarrageGrab
|
|||||||
if (cookies == null) return;
|
if (cookies == null) return;
|
||||||
var cookieCollection = dic.ToCookies(domain);
|
var cookieCollection = dic.ToCookies(domain);
|
||||||
cookies.Add(cookieCollection);
|
cookies.Add(cookieCollection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 将字典转为查询参数
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="dic"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static string ToQueryParam(this IDictionary<string, string> dic, bool encode = true)
|
||||||
|
{
|
||||||
|
if (dic == null || dic.Count == 0)
|
||||||
|
return string.Empty;
|
||||||
|
|
||||||
|
var queryParams = dic.Select(kvp => kvp.Key + "=" + (encode ? WebUtility.UrlEncode(kvp.Value) : kvp.Value));
|
||||||
|
return string.Join("&", queryParams);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 赋值字典,没有则添加,有则覆盖
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TKey"></typeparam>
|
||||||
|
/// <typeparam name="TValue"></typeparam>
|
||||||
|
/// <param name="dic"></param>
|
||||||
|
/// <param name="key"></param>
|
||||||
|
/// <param name="value"></param>
|
||||||
|
public static void Set<TKey, TValue>(this IDictionary<TKey, TValue> dic, TKey key, TValue value)
|
||||||
|
{
|
||||||
|
if (dic.ContainsKey(key))
|
||||||
|
{
|
||||||
|
dic[key] = value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dic.Add(key, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 赋值字典,没有则添加,有则覆盖
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TKey"></typeparam>
|
||||||
|
/// <typeparam name="TValue"></typeparam>
|
||||||
|
/// <param name="dic"></param>
|
||||||
|
/// <param name="kv"></param>
|
||||||
|
public static void Set<TKey, TValue>(this IDictionary<TKey, TValue> dic, KeyValuePair<TKey, TValue> kv)
|
||||||
|
{
|
||||||
|
dic.Set(kv.Key, kv.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取Uri查询参数
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="uri"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
/// <exception cref="ArgumentNullException"></exception>
|
||||||
|
public static IDictionary<string, string> GetQueryParams(this UriBuilder uri)
|
||||||
|
{
|
||||||
|
if (uri == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(uri));
|
||||||
|
}
|
||||||
|
|
||||||
|
var queryParams = uri.Query.TrimStart('?');
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(queryParams))
|
||||||
|
{
|
||||||
|
return new Dictionary<string, string>();
|
||||||
|
}
|
||||||
|
|
||||||
|
return queryParams
|
||||||
|
.Split('&')
|
||||||
|
.Select(param => param.Split('='))
|
||||||
|
.ToDictionary(
|
||||||
|
keyValuePair => Uri.UnescapeDataString(keyValuePair[0]),
|
||||||
|
keyValuePair => Uri.UnescapeDataString(keyValuePair.Length > 1 ? keyValuePair[1] : ""));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="uri"></param>
|
||||||
|
/// <param name="vals"></param>
|
||||||
|
public static void AddQueryParam(this UriBuilder uri, IEnumerable<KeyValuePair<string, string>> vals)
|
||||||
|
{
|
||||||
|
if (uri == null) return;
|
||||||
|
var dic = uri.GetQueryParams();
|
||||||
|
foreach (var item in vals)
|
||||||
|
{
|
||||||
|
dic.Set(item);
|
||||||
|
}
|
||||||
|
uri.Query = dic.ToQueryParam();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 删除一个query项
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="uri"></param>
|
||||||
|
/// <param name="key"></param>
|
||||||
|
public static void RemoveQueryParam(this UriBuilder uri, string key)
|
||||||
|
{
|
||||||
|
if (uri == null) return;
|
||||||
|
var dic = uri.GetQueryParams();
|
||||||
|
dic.Remove(key);
|
||||||
|
if (dic.Count > 0)
|
||||||
|
{
|
||||||
|
uri.Query = "?" + dic.ToQueryParam();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
uri.Query = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 添加参数
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="uri"></param>
|
||||||
|
/// <param name="key"></param>
|
||||||
|
/// <param name="value"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static void AddQueryParam(this UriBuilder uri, string key, string value)
|
||||||
|
{
|
||||||
|
if (uri == null) return;
|
||||||
|
uri.AddQueryParam(new[] {
|
||||||
|
new KeyValuePair<string, string>(key,value)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,11 @@ using Titanium.Web.Proxy.Models;
|
|||||||
using Titanium.Web.Proxy.StreamExtended.Network;
|
using Titanium.Web.Proxy.StreamExtended.Network;
|
||||||
using System.Security.Cryptography.X509Certificates;
|
using System.Security.Cryptography.X509Certificates;
|
||||||
using System.Security.Cryptography;
|
using System.Security.Cryptography;
|
||||||
|
using HtmlDocument = HtmlAgilityPack.HtmlDocument;
|
||||||
|
using System.Net.Http;
|
||||||
|
using System.Text;
|
||||||
|
using BrotliSharpLib;
|
||||||
|
using System.IO.Compression;
|
||||||
|
|
||||||
namespace BarrageGrab.Proxy
|
namespace BarrageGrab.Proxy
|
||||||
{
|
{
|
||||||
@@ -180,6 +185,11 @@ namespace BarrageGrab.Proxy
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private bool CheckBrowser(string processName)
|
||||||
|
{
|
||||||
|
return AppSetting.Current.ProcessFilter.Contains(processName) && processName!="直播伴侣" && processName!= "douyin";
|
||||||
|
}
|
||||||
|
|
||||||
private async Task ProxyServer_BeforeResponse(object sender, SessionEventArgs e)
|
private async Task ProxyServer_BeforeResponse(object sender, SessionEventArgs e)
|
||||||
{
|
{
|
||||||
string uri = e.HttpClient.Request.RequestUri.ToString();
|
string uri = e.HttpClient.Request.RequestUri.ToString();
|
||||||
@@ -333,7 +343,7 @@ namespace BarrageGrab.Proxy
|
|||||||
});
|
});
|
||||||
liveRoomInjectScript = scriptContext + liveRoomInjectScript;
|
liveRoomInjectScript = scriptContext + liveRoomInjectScript;
|
||||||
var html = await e.GetResponseBodyAsString();
|
var html = await e.GetResponseBodyAsString();
|
||||||
var doc = new HtmlAgilityPack.HtmlDocument();
|
var doc = new HtmlDocument();
|
||||||
doc.LoadHtml(html);
|
doc.LoadHtml(html);
|
||||||
|
|
||||||
if (!liveRoomInjectScript.IsNullOrWhiteSpace())
|
if (!liveRoomInjectScript.IsNullOrWhiteSpace())
|
||||||
@@ -370,7 +380,6 @@ namespace BarrageGrab.Proxy
|
|||||||
AppRuntime.RoomCaches.AddRoomInfoCache(roominfo);
|
AppRuntime.RoomCaches.AddRoomInfoCache(roominfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -394,27 +403,11 @@ namespace BarrageGrab.Proxy
|
|||||||
//给script标签 src加上时间戳避免缓存
|
//给script标签 src加上时间戳避免缓存
|
||||||
if (AppSetting.Current.DisableLivePageScriptCache)
|
if (AppSetting.Current.DisableLivePageScriptCache)
|
||||||
{
|
{
|
||||||
var scripts = doc.DocumentNode.SelectNodes("//script[@src]");
|
ScriptAddTocks(doc);
|
||||||
if (scripts != null)
|
|
||||||
{
|
|
||||||
var ticks = DateTime.Now.Ticks;
|
|
||||||
foreach (var script in scripts)
|
|
||||||
{
|
|
||||||
var src = script.Attributes["src"].Value;
|
|
||||||
if (src.Contains("?"))
|
|
||||||
{
|
|
||||||
src += "&_t=" + ticks;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
src += "?_t=" + ticks;
|
|
||||||
}
|
|
||||||
script.Attributes["src"].Value = src;
|
|
||||||
}
|
|
||||||
html = doc.DocumentNode.OuterHtml;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
html = doc.DocumentNode.OuterHtml;
|
||||||
|
|
||||||
e.SetResponseBodyString(html);
|
e.SetResponseBodyString(html);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -454,6 +447,38 @@ namespace BarrageGrab.Proxy
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//给部分脚本加上时间戳避免缓存
|
||||||
|
private void ScriptAddTocks(HtmlDocument doc)
|
||||||
|
{
|
||||||
|
var scripts = doc.DocumentNode.SelectNodes("//script[@src]");
|
||||||
|
if (scripts != null)
|
||||||
|
{
|
||||||
|
var ticks = DateTime.Now.Ticks;
|
||||||
|
foreach (var script in scripts)
|
||||||
|
{
|
||||||
|
var src = script.Attributes["src"].Value;
|
||||||
|
|
||||||
|
var srcUri = new Uri(src);
|
||||||
|
if (!CheckHost(srcUri.Host)) continue;
|
||||||
|
|
||||||
|
var fileName = Path.GetFileName(src.Split('?')[0]);
|
||||||
|
//目前只需要用到相关这些js
|
||||||
|
if (!fileName.StartsWith("island") && !src.Contains(LIVE_SCRIPT_PATH)) continue;
|
||||||
|
|
||||||
|
if (src.Contains("?"))
|
||||||
|
{
|
||||||
|
src += "&_t=" + ticks;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
src += "?_t=" + ticks;
|
||||||
|
}
|
||||||
|
script.Attributes["src"].Value = src;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//生成注入上下文
|
//生成注入上下文
|
||||||
private string BuildContext(IDictionary<string, string> constVals)
|
private string BuildContext(IDictionary<string, string> constVals)
|
||||||
{
|
{
|
||||||
@@ -537,6 +562,12 @@ namespace BarrageGrab.Proxy
|
|||||||
string url = e.HttpClient.Request.RequestUri.ToString();
|
string url = e.HttpClient.Request.RequestUri.ToString();
|
||||||
string hostname = e.HttpClient.Request.RequestUri.Host;
|
string hostname = e.HttpClient.Request.RequestUri.Host;
|
||||||
|
|
||||||
|
e.DecryptSsl = CheckHost(hostname);
|
||||||
|
}
|
||||||
|
|
||||||
|
//检测域名白名单
|
||||||
|
protected override bool CheckHost(string hostname)
|
||||||
|
{
|
||||||
//需要解析SSL的域名 放在这里,全开会导致性能问题,应只解析业务需要的域名
|
//需要解析SSL的域名 放在这里,全开会导致性能问题,应只解析业务需要的域名
|
||||||
var decryptSsls = new string[]
|
var decryptSsls = new string[]
|
||||||
{
|
{
|
||||||
@@ -547,24 +578,11 @@ namespace BarrageGrab.Proxy
|
|||||||
|
|
||||||
if (decryptSsls.Contains(hostname))
|
if (decryptSsls.Contains(hostname))
|
||||||
{
|
{
|
||||||
e.DecryptSsl = true;
|
return true;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!CheckHost(hostname))
|
|
||||||
{
|
|
||||||
e.DecryptSsl = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//检测域名白名单
|
hostname = hostname.Trim().ToLower();
|
||||||
protected override bool CheckHost(string host)
|
return base.CheckHost(hostname);
|
||||||
{
|
|
||||||
host = host.Trim().ToLower();
|
|
||||||
var succ = base.CheckHost(host);
|
|
||||||
return succ || host == SCRIPT_HOST || host == LIVE_HOST;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//WebSocket 流读取
|
//WebSocket 流读取
|
||||||
|
|||||||
@@ -201,7 +201,7 @@ namespace BarrageGrab
|
|||||||
private void PrintMsg(Msg msg, PackMsgType barType)
|
private void PrintMsg(Msg msg, PackMsgType barType)
|
||||||
{
|
{
|
||||||
var rinfo = AppRuntime.RoomCaches.GetCachedWebRoomInfo(msg.RoomId.ToString());
|
var rinfo = AppRuntime.RoomCaches.GetCachedWebRoomInfo(msg.RoomId.ToString());
|
||||||
var roomName = (rinfo?.Owner?.Nickname ?? ("直播间" + (msg.WebRoomId.IsNullOrWhiteSpace() ? msg.RoomId.ToString() : msg.WebRoomId)));
|
var roomName = (rinfo?.Owner?.Nickname ?? ((msg.WebRoomId.IsNullOrWhiteSpace() ? msg.RoomId.ToString() : msg.WebRoomId)));
|
||||||
var text = $"{DateTime.Now.ToString("HH:mm:ss")} [{roomName}] [{barType}]";
|
var text = $"{DateTime.Now.ToString("HH:mm:ss")} [{roomName}] [{barType}]";
|
||||||
|
|
||||||
if (msg.User != null)
|
if (msg.User != null)
|
||||||
|
|||||||
Reference in New Issue
Block a user