Scripts目录不再必要存在,并移除 livePage.js; 调整项目结构

This commit is contained in:
梅浩东
2025-04-14 16:18:49 +08:00
parent 15bbe3bead
commit 1b747146f9
15 changed files with 80 additions and 106 deletions
+1 -1
View File
@@ -11,7 +11,7 @@
<!--系统代理端口-->
<add key="proxyPort" value="8827" />
<!--是否启用系统代理,若设置为false 则需要在程序手动指定代理地址 -->
<add key="usedProxy" value="true" />
<add key="sysProxy" value="true" />
<!--上游代理地址,例如开启了系统代理,但是需要将其他无关请求转发到VPN工具中,例如:127.0.0.1:11223,不要带http://-->
<add key="upstreamProxy" value="" />
<!--在控制台输出弹幕-->
+1 -1
View File
@@ -29,7 +29,7 @@ namespace BarrageGrab
LogFilter = Enum.GetValues(typeof(PackMsgType)).Cast<int>().Where(w => w > 0).ToArray();
FilterHostName = bool.Parse(AppSettings["filterHostName"].Trim());
HostNameFilter = AppSettings["hostNameFilter"].Trim().Split(',').Where(w => !string.IsNullOrWhiteSpace(w)).ToArray();
UsedProxy = bool.Parse(AppSettings["usedProxy"].Trim());
UsedProxy = bool.Parse(AppSettings["sysProxy"].Trim());
ListenAny = bool.Parse(AppSettings["listenAny"].Trim());
UpstreamProxy = AppSettings["upstreamProxy"].Trim();
HideConsole = bool.Parse(AppSettings["hideConsole"].Trim());
+1 -1
View File
@@ -53,7 +53,7 @@ namespace BarrageGrab
public static string GetJsFile(string fileName)
{
var path = Path.Combine(AppContext.BaseDirectory, "Scripts", "engine", fileName);
if (!File.Exists(path)) throw new FileNotFoundException("不存在的文件", path);
if (!File.Exists(path)) return null;
return File.ReadAllText(path, Encoding.UTF8);
}
+1
View File
@@ -19,6 +19,7 @@ namespace BarrageGrab
static bool formExited = false;
static WinApi.ControlCtrlDelegate controlCtr = ControlCtrlHandle;
static Mutex mutex = new Mutex(false, "DyBarrageGrab");
static void Main(string[] args)
{
if (!mutex.WaitOne(TimeSpan.Zero, true))
+4 -21
View File
@@ -308,7 +308,7 @@ namespace BarrageGrab.Proxy
{
lock (rinfoRequestings) rinfoRequestings.Add(webroomid);
//查询后会自动缓存
DyServer.GetRoomInfoForApi(webroomid, cookie).ContinueWith(t =>
DyApiHelper.GetRoomInfoForApi(webroomid, cookie).ContinueWith(t =>
{
var rinfo = t.Result;
//限制只尝试一次
@@ -333,22 +333,6 @@ namespace BarrageGrab.Proxy
}
}
/// <summary>
/// 获取配置的注入的js
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
private string GetInjectScript(string name)
{
//获取exe所在目录路径
var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Scripts", "inject", name + ".js");
if (File.Exists(path))
{
return File.ReadAllText(path);
}
return null;
}
// Hook 直播页面
private async Task HookPageAsync(SessionEventArgs e)
{
@@ -377,8 +361,7 @@ namespace BarrageGrab.Proxy
{
string webrid = liveRoomMactch.Groups[1].Value;
//获取直播页注入js
string liveRoomInjectScript = GetInjectScript("livePage");
string liveRoomInjectScript = EmbResource.GetFileContent("livePage.js");
//注入上下文变量;
var scriptContext = BuildContext(new Dictionary<string, string>()
{
@@ -435,7 +418,7 @@ namespace BarrageGrab.Proxy
script.InnerHtml = liveRoomInjectScript;
body.AppendChild(script);
html = doc.DocumentNode.OuterHtml;
Logger.PrintColor($"直播页{urlNoQuery},用户脚本已成功注入!\n", ConsoleColor.Green);
Logger.LogTrace($"直播页{urlNoQuery},用户脚本已成功注入!\n");
}
}
catch (Exception ex)
@@ -459,7 +442,7 @@ namespace BarrageGrab.Proxy
if (liveHomeMatch.Success)
{
//获取直播页注入js
string liveHoomInjectScript = GetInjectScript("livePage");
string liveHoomInjectScript = EmbResource.GetFileContent("livePage.js");
//注入上下文变量;
var scriptContext = BuildContext(new Dictionary<string, string>()
-26
View File
@@ -6,35 +6,9 @@
* 正则: @".*:\/\/live.douyin\.com\/\d+"
**/
/*注入脚本 定时触发全局keydown,避免直播流被无操作阻断*/
// 创建一个虚拟的按键事件
const simulatedEvent = new KeyboardEvent('keydown', {
key: 'Virtual_Alt',
keyCode: 18, //alt
bubbles: true,
cancelable: true
});
// 获取要分派事件的目标元素,例如文档的根元素
const targetElement = document.documentElement;
// 设置定时器,每隔60秒模拟一次按键事件
setInterval(() => {
targetElement.dispatchEvent(simulatedEvent);
}, 1000 * 60);
// 订阅 keydown 事件 (Debug)
targetElement.addEventListener('keydown', event => {
if (event.key == "Virtual_Alt") {
console.log('[防挂机处理] 按下了', event.key);
}
});
/*禁止关闭 Websocket*/
WebSocket.prototype.close = function () { return; }
/*判断是否自动关闭 */
//获取路由参数
function getQueryString(name) {
@@ -25,7 +25,13 @@ namespace BarrageGrab
if (AppSetting.Current.UseComPortFilter)
{
jsEngine = JsEngine.CreateNewEngine();
var jsFile = JsEngine.GetJsFile("comPortFilter.js");
if (jsFile.IsNullOrWhiteSpace())
{
jsFile = EmbResource.GetFileContent("comPortFilter.js");
}
try
{
jsEngine.Execute(jsFile);
@@ -176,6 +176,7 @@ namespace BarrageGrab
return obj.GetType().GetProperty(propertyName) != null;
}
//创建消息对象
private T CreateMsg<T>(dynamic msg) where T : Msg, new()
{
var roomid = msg.Common.roomId.ToString();
@@ -580,29 +581,7 @@ namespace BarrageGrab
try
{
var cmdPack = JsonConvert.DeserializeObject<Command>(message);
if (cmdPack == null) return;
switch (cmdPack.Cmd)
{
case CommandCode.Close:
this.Dispose();
break;
case CommandCode.EnableProxy:
{
var enable = (bool)cmdPack.Data;
if (enable)
this.grab.Proxy.RegisterSystemProxy();
else
this.grab.Proxy.CloseSystemProxy();
break;
}
case CommandCode.DisplayConsole:
{
var display = (bool)cmdPack.Data;
AppRuntime.DisplayConsole(display);
break;
}
}
if (cmdPack == null) return;
}
catch (Exception) { }
};
@@ -15,7 +15,7 @@ namespace BarrageGrab
/// <summary>
/// 抖音服务
/// </summary>
internal class DyServer
internal class DyApiHelper
{
/// <summary>
/// 获取直播礼物列表
+50
View File
@@ -0,0 +1,50 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace BarrageGrab
{
/// <summary>
/// 资源文件
/// </summary>
public static class EmbResource
{
static Dictionary<string,string> cache = new Dictionary<string, string>();
/// <summary>
/// 获取 嵌入式资源文件内容
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public static string GetFileContent(string fileName)
{
if(cache.ContainsKey(fileName))
{
return cache[fileName];
}
Assembly assembly = Assembly.GetExecutingAssembly();
//读取嵌入式资源文件
var resourceName = assembly.GetManifestResourceNames().FirstOrDefault(s => s.EndsWith(fileName));
if (resourceName == null)
{
throw new Exception($"{fileName} 嵌入式资源不存在");
}
using (Stream stream = assembly.GetManifestResourceStream(resourceName))
{
using (StreamReader reader = new StreamReader(stream,Encoding.UTF8))
{
var text = reader.ReadToEnd();
cache.Add(fileName, text);
return text;
}
}
}
}
}
@@ -28,8 +28,6 @@ namespace BarrageGrab
internal static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint mode);
[DllImport("kernel32.dll", SetLastError = true)]
internal static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint mode);
///If the function fails, the return value is NULL.</returns>
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
+9 -12
View File
@@ -218,8 +218,9 @@
<ItemGroup>
<Compile Include="AppRuntime.cs" />
<Compile Include="AppSetting.cs" />
<Compile Include="ComPortServer.cs" />
<Compile Include="DyServer.cs" />
<Compile Include="Server\ComPortServer.cs" />
<Compile Include="Utility\DyApiHelper.cs" />
<Compile Include="Utility\EmbResource.cs" />
<Compile Include="Forms\FormView.cs">
<SubType>Form</SubType>
</Compile>
@@ -234,7 +235,7 @@
<DependentUpon>RoomDetail.cs</DependentUpon>
</Compile>
<Compile Include="JsEngine.cs" />
<Compile Include="LiveCompanHelper.cs" />
<Compile Include="Utility\LiveCompanHelper.cs" />
<Compile Include="Logger.cs" />
<Compile Include="Modles\BusinessExecption.cs" />
<Compile Include="Modles\JsonEntity\BarrageMessages.cs" />
@@ -251,10 +252,10 @@
<Compile Include="Program.cs" />
<Compile Include="Proxy\SystemProxy.cs" />
<Compile Include="Proxy\TitaniumProxy.cs" />
<Compile Include="WinApi.cs" />
<Compile Include="WssBarrageGrab.cs" />
<Compile Include="Utility\WinApi.cs" />
<Compile Include="Server\WssBarrageGrab.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="WsBarrageServer.cs" />
<Compile Include="Server\WsBarrageServer.cs" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
@@ -266,12 +267,8 @@
</ItemGroup>
<ItemGroup>
<Content Include="FodyWeavers.xml" />
<Content Include="Scripts\engine\comPortFilter.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Scripts\inject\livePage.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<EmbeddedResource Include="Scripts\engine\comPortFilter.js" />
<EmbeddedResource Include="Scripts\inject\livePage.js" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include=".NETFramework,Version=v4.8">
+4 -18
View File
@@ -16,8 +16,12 @@
+ 如果好用,请<a href="#user-content-支持一下">捐赠</a>个仨瓜俩枣,白某谢过各位老板
## ⛳近期更新
2025-04-14 v2.7.9
1. **[重要优化]** 大幅降低了程序包的体积
2. `nlog.config` 改为内嵌
2025-04-09 v2.7.8
1. 修复页面无操作检测拦截失效的问题,因为更新了脚本
2. 修复弹幕日志因主播昵称的特殊字符导致无法写入的问题
@@ -58,24 +62,6 @@
2. **[破坏性更新]** `WebRoomid` 和 `Roomid` 改为String类型
3. 之前直播伴侣开播会导致`WebRoomid`为-1,现会抓取直播伴侣开播响应信息,并填充`WebRoomid`,但直播伴侣的`WebRoomid`设定为主播**抖音号**,需要根据进程名做判断,使用请注意
2024-03-10 v2.7.2
1. [**重要更新**] 支持设置为轮询模式监听(见配置项**forcePolling**,直播伴侣尚未支持),比起ws更稳定,适合长时间监听
2. 支持进入直播间画面自动暂停
3. 优化礼物连击判定规则,可区分出可连击的礼物,进一步避免礼物数量推送不准确的问题,并新增字段:
1. Combo 礼物是否可连击
2. ImgUrl 礼物图像地址
3. ToUser 送礼目标
4. roomId过滤改为 WebRoomid 过滤(仅支持已经被缓存的直播间,对直播伴侣可能无效)
5. 添加“关闭代理.bat” 批处理脚本,见根目录或者上方文件,便于无法上网时双击执行
6. 更多介绍请查看底下新增配置项
2023-11-23 v2.7.0
1. 修复了因抖音版本升级导致的WebRoomId获取不到的问题,并更近了正则表达式尽量兼容后续的变更
2. 添加了winfrom窗体,功能有限,默认隐藏
3. 支持了控制台隐藏,推送器弹幕类型过滤,日志弹幕类型过滤,弹幕文件日志 (见<a href="#tag1">配置文件</a>)
4. 支持了更多的ws命令,见 [Command.cs](./BarrageGrab/Modles/JsonEntity/Command.cs)
## 🖼️控制台截图