From 9a862ad71dc3c355c1263e4ee3d400ea4027e4e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=85=E6=B5=A9=E4=B8=9C?= <1083092844@qq.com> Date: Wed, 2 Apr 2025 12:08:01 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BB=95=E8=BF=87=E6=97=A0?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E6=A3=80=E6=B5=8B=E5=A4=B1=E6=95=88=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BarrageGrab/ObjectExtension.cs | 72 ++++++++++++++++++++++++++++++ BarrageGrab/Proxy/TitaniumProxy.cs | 23 ++++++---- 2 files changed, 86 insertions(+), 9 deletions(-) diff --git a/BarrageGrab/ObjectExtension.cs b/BarrageGrab/ObjectExtension.cs index a6f76ea..9bf9569 100644 --- a/BarrageGrab/ObjectExtension.cs +++ b/BarrageGrab/ObjectExtension.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using System.Web; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using static ProtoBuf.Serializer; namespace BarrageGrab { @@ -359,4 +360,75 @@ namespace BarrageGrab } } + + /// + /// 模式匹配相关扩展方法 + /// + public static class PatternMatchExtensions + { + /// + /// 判断是否匹配任意一个通配符 + /// + /// 要匹配的字符串 + /// 通配符表达式数组 + /// 是否匹配 + public static bool WildcardMatchAny(this string str, params string[] patterns) + { + return patterns.Any(x => x.WildcardMatch(str)); + } + + /// + /// 判断是否匹配通配符 + /// + /// 通配符表达式 + /// 要匹配的字符串 + /// 是否忽略大小写 + /// 是否匹配 + public static bool WildcardMatch(this string wildcard, string s, bool ignoreCase = false) + { + return wildcard.WildcardMatch(s, 0, 0, ignoreCase); + } + + // 递归匹配通配符 + private static bool WildcardMatch(this string wildcard, string s, int wildcardIndex, int sIndex, bool ignoreCase) + { + while (wildcardIndex != wildcard.Length) + { + char c = wildcard[wildcardIndex]; + switch (c) + { + case '*': + if (wildcardIndex == wildcard.Length - 1) + { + return true; + } + + return Enumerable.Range(sIndex, s.Length - sIndex).Any((int i) => wildcard.WildcardMatch(s, wildcardIndex + 1, i, ignoreCase)); + default: + { + char c2 = (ignoreCase ? char.ToLower(c) : c); + if (s.Length == sIndex) + { + return false; + } + + char c3 = (ignoreCase ? char.ToLower(s[sIndex]) : s[sIndex]); + if (c2 != c3) + { + return false; + } + + break; + } + case '?': + break; + } + + wildcardIndex++; + sIndex++; + } + + return sIndex == s.Length; + } + } } diff --git a/BarrageGrab/Proxy/TitaniumProxy.cs b/BarrageGrab/Proxy/TitaniumProxy.cs index 40c6b85..11ae57a 100644 --- a/BarrageGrab/Proxy/TitaniumProxy.cs +++ b/BarrageGrab/Proxy/TitaniumProxy.cs @@ -37,7 +37,7 @@ namespace BarrageGrab.Proxy List rinfoRequestings = new List(); const string SCRIPT_HOST = "lf-cdn-tos.bytescm.com"; - const string LIVE_HOST = "live.douyin.com"; + const string LIVE_HOST = "live.douyin.com"; const string DOUYIN_HOST = "www.douyin.com"; const string USER_INFO_PATH = "/webcast/user/me/"; const string BARRAGE_POOL_PATH = "/webcast/im/fetch"; @@ -548,21 +548,20 @@ namespace BarrageGrab.Proxy if (!contentType.Trim().ToLower().Contains("application/javascript")) return; if (e.HttpClient.Response.StatusCode != 200) return; + //https://lf-webcast-platform.bytetos.com/obj/webcast-platform-cdn/webcast/douyin_live/chunks/island_a74ce.b55095a0.js //判断响应内容是否为js application/javascript - if (hostname == SCRIPT_HOST - //这俩个进程不需要注入 - && processName != "直播伴侣" && processName != "douyin" + if (processName != "直播伴侣" && processName != "douyin" && fileName.StartsWith("island") ) { var js = await e.GetResponseBodyAsString(); - var reg2 = new Regex(@"if\(!\((?\d,\w{1,2})\.DJ\)\(\)&&"); - var match = reg2.Match(js); + var reg = new Regex(@"if\(!\(\d{1,},\w{1,}\.DJ\)\(\).+\w{1,}\.includes\(""live""\)\)\)\{"); + var match = reg.Match(js); if (match.Success) { - js = reg2.Replace(js, "if(false &&"); + js = reg.Replace(js, "if(false){"); e.SetResponseBodyString(js); - Logger.PrintColor($"已成功绕过页面无操作检测\n", ConsoleColor.Green); + Logger.PrintColor($"已成功绕过JS页面无操作检测 {urlNoQuery}\n", ConsoleColor.Green); } } @@ -627,9 +626,15 @@ namespace BarrageGrab.Proxy SCRIPT_HOST, LIVE_HOST, WEBCAST_AMEMV_HOST , //直播伴侣开播请求地址 - }; + "*-webcast-platform.bytetos.com" //新的脚本地址 + }; if (decryptSsls.Contains(hostname)) + { + return true; + } + + if (hostname.WildcardMatchAny(decryptSsls)) { return true; }