优化
This commit is contained in:
@@ -40,6 +40,7 @@ namespace BarrageGrab
|
||||
PollingInterval = int.Parse(AppSettings["pollingInterval"].Trim());
|
||||
DisableLivePageScriptCache = bool.Parse(AppSettings["disableLivePageScriptCache"].Trim());
|
||||
WebRoomIds = AppSettings["webRoomIds"].Trim().Split(',').Where(w => !string.IsNullOrWhiteSpace(w)).ToArray();
|
||||
LiveCompanPath = AppSettings["liveCompanPath"].Trim();
|
||||
|
||||
ConfigComPort();
|
||||
ConfigFilter();
|
||||
@@ -243,5 +244,10 @@ namespace BarrageGrab
|
||||
/// 是否启用串口过滤器脚本
|
||||
/// </summary>
|
||||
public bool UseComPortFilter { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 直播伴侣文件位置
|
||||
/// </summary>
|
||||
public string LiveCompanPath { get; set; } = string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,8 +28,27 @@ namespace BarrageGrab
|
||||
{
|
||||
//获取快捷方式的目标路径
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -41,7 +60,7 @@ namespace BarrageGrab
|
||||
var exePath = GetExePath();
|
||||
if (string.IsNullOrEmpty(exePath))
|
||||
{
|
||||
Logger.LogWarn("未找到直播伴侣的exe文件,跳过环境设置");
|
||||
Logger.LogWarn("未找到直播伴侣.exe文件,跳过环境设置");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -192,5 +192,132 @@ namespace BarrageGrab
|
||||
var cookieCollection = dic.ToCookies(domain);
|
||||
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 System.Security.Cryptography.X509Certificates;
|
||||
using System.Security.Cryptography;
|
||||
using HtmlDocument = HtmlAgilityPack.HtmlDocument;
|
||||
using System.Net.Http;
|
||||
using System.Text;
|
||||
using BrotliSharpLib;
|
||||
using System.IO.Compression;
|
||||
|
||||
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)
|
||||
{
|
||||
string uri = e.HttpClient.Request.RequestUri.ToString();
|
||||
@@ -333,7 +343,7 @@ namespace BarrageGrab.Proxy
|
||||
});
|
||||
liveRoomInjectScript = scriptContext + liveRoomInjectScript;
|
||||
var html = await e.GetResponseBodyAsString();
|
||||
var doc = new HtmlAgilityPack.HtmlDocument();
|
||||
var doc = new HtmlDocument();
|
||||
doc.LoadHtml(html);
|
||||
|
||||
if (!liveRoomInjectScript.IsNullOrWhiteSpace())
|
||||
@@ -370,7 +380,6 @@ namespace BarrageGrab.Proxy
|
||||
AppRuntime.RoomCaches.AddRoomInfoCache(roominfo);
|
||||
}
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
@@ -394,26 +403,10 @@ namespace BarrageGrab.Proxy
|
||||
//给script标签 src加上时间戳避免缓存
|
||||
if (AppSetting.Current.DisableLivePageScriptCache)
|
||||
{
|
||||
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;
|
||||
if (src.Contains("?"))
|
||||
{
|
||||
src += "&_t=" + ticks;
|
||||
}
|
||||
else
|
||||
{
|
||||
src += "?_t=" + ticks;
|
||||
}
|
||||
script.Attributes["src"].Value = src;
|
||||
ScriptAddTocks(doc);
|
||||
}
|
||||
|
||||
html = doc.DocumentNode.OuterHtml;
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
@@ -537,6 +562,12 @@ namespace BarrageGrab.Proxy
|
||||
string url = e.HttpClient.Request.RequestUri.ToString();
|
||||
string hostname = e.HttpClient.Request.RequestUri.Host;
|
||||
|
||||
e.DecryptSsl = CheckHost(hostname);
|
||||
}
|
||||
|
||||
//检测域名白名单
|
||||
protected override bool CheckHost(string hostname)
|
||||
{
|
||||
//需要解析SSL的域名 放在这里,全开会导致性能问题,应只解析业务需要的域名
|
||||
var decryptSsls = new string[]
|
||||
{
|
||||
@@ -547,24 +578,11 @@ namespace BarrageGrab.Proxy
|
||||
|
||||
if (decryptSsls.Contains(hostname))
|
||||
{
|
||||
e.DecryptSsl = true;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!CheckHost(hostname))
|
||||
{
|
||||
e.DecryptSsl = false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
//检测域名白名单
|
||||
protected override bool CheckHost(string host)
|
||||
{
|
||||
host = host.Trim().ToLower();
|
||||
var succ = base.CheckHost(host);
|
||||
return succ || host == SCRIPT_HOST || host == LIVE_HOST;
|
||||
hostname = hostname.Trim().ToLower();
|
||||
return base.CheckHost(hostname);
|
||||
}
|
||||
|
||||
//WebSocket 流读取
|
||||
|
||||
@@ -201,7 +201,7 @@ namespace BarrageGrab
|
||||
private void PrintMsg(Msg msg, PackMsgType barType)
|
||||
{
|
||||
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}]";
|
||||
|
||||
if (msg.User != null)
|
||||
|
||||
Reference in New Issue
Block a user