From 28b0bd71056053eb8b2a678a0223cd4e23ae5e8a Mon Sep 17 00:00:00 2001 From: XuanRan_Nyan <31968665+xxxxuanran@users.noreply.github.com> Date: Mon, 9 Mar 2026 14:13:25 +0800 Subject: [PATCH] =?UTF-8?q?fix(Huya):=20`WEB=5FROOM=5FDATA=5FREGEX`=20?= =?UTF-8?q?=E6=AD=A3=E5=88=99=E9=94=99=E8=AF=AF=E5=8C=B9=E9=85=8D=20html?= =?UTF-8?q?=20=E8=BD=AC=E4=B9=89=20(#1606)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- biliup/plugins/__init__.py | 24 ++++++++++++++++++++++-- biliup/plugins/huya.py | 4 ++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/biliup/plugins/__init__.py b/biliup/plugins/__init__.py index e391b23..fc351fe 100644 --- a/biliup/plugins/__init__.py +++ b/biliup/plugins/__init__.py @@ -1,4 +1,5 @@ import logging +import html import re import hashlib import time @@ -17,6 +18,7 @@ from typing import ( logger = logging.getLogger('biliup') +_DECODER = json.JSONDecoder() def match1(text, *patterns): if len(patterns) == 1: @@ -48,11 +50,29 @@ def random_user_agent(device: str = 'desktop') -> str: return f'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{chrome_version}.0.0.0 Safari/537.36' +def deep_unescape(obj: Any) -> Any: + if isinstance(obj, dict): + return {k: deep_unescape(v) for k, v in obj.items()} + if isinstance(obj, list): + return [deep_unescape(i) for i in obj] + if isinstance(obj, str): + return html.unescape(obj) + return obj + + def json_loads(text: Union[str, None]) -> Dict[str, Any]: if not text: - raise ValueError("Invalid JSON: None") + raise ValueError("Invalid JSON: None or Empty") + try: - return json.loads(text) + data, _ = _DECODER.raw_decode(text) + except (json.JSONDecodeError, TypeError) as e: + logger.debug(f"Invalid JSON at position {getattr(e, 'pos', 'unknown')}, raw text: {text}") + else: + return data + + try: + return json.loads(html.unescape(text)) except json.JSONDecodeError as e: raise ValueError(f"Invalid JSON: {text}") from e diff --git a/biliup/plugins/huya.py b/biliup/plugins/huya.py index 3bbc196..eec4a8c 100644 --- a/biliup/plugins/huya.py +++ b/biliup/plugins/huya.py @@ -29,7 +29,7 @@ HUYA_MOBILE_BASE_URL = "https://m.huya.com" HUYA_MP_BASE_URL = "https://mp.huya.com" HUYA_WUP_BASE_URL = "https://wup.huya.com" HUYA_WUP_YST_URL = "https://snmhuya.yst.aisee.tv" -HUYA_WEB_ROOM_DATA_REGEX = r"var TT_ROOM_DATA = (.*?);" +HUYA_WEB_ROOM_DATA_REGEX = r"var\s+TT_ROOM_DATA\s*=\s*(.*);" # DOT 默认不匹配换行 rotl64 = lambda t: ((t & 0xFFFFFFFF) << 8 | (t & 0xFFFFFFFF) >> 24) & 0xFFFFFFFF | (t & ~0xFFFFFFFF) @@ -516,7 +516,7 @@ class UAGenerator: hyapp_version += f".{random.randint(3000, 5000)}" ua = f"{hyapp_platform}&{hyapp_version}&{hyapp_channel}" - + # Add android_api_level for android platforms if platform in {PLATFORM.HUYA_ADR, PLATFORM.TV_HUYA_NFTV}: android_api_level = random.randint(28, 36)