This commit is contained in:
Muihd
2024-09-28 15:39:00 +08:00
parent 723d87163f
commit e1d83befb4
5 changed files with 210 additions and 40 deletions
+6
View File
@@ -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;
} }
} }
+20 -1
View File
@@ -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;
} }
+128 -1
View File
@@ -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)
});
}
} }
} }
+55 -37
View File
@@ -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 流读取
+1 -1
View File
@@ -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)