From 4a22760bb41bf21f11897f5ea5035b5cce9bca79 Mon Sep 17 00:00:00 2001 From: HDDolby <152827224+DolbyCoder@users.noreply.github.com> Date: Fri, 18 Sep 2026 10:35:58 +0800 Subject: [PATCH] Skip requests when userid invalid (#6723) --- app/modules/indexer/parser/__init__.py | 29 ++++++++++++---- tests/test_hddolby_parser.py | 47 ++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 6 deletions(-) diff --git a/app/modules/indexer/parser/__init__.py b/app/modules/indexer/parser/__init__.py index 7f39ed2e6..5f3245938 100644 --- a/app/modules/indexer/parser/__init__.py +++ b/app/modules/indexer/parser/__init__.py @@ -183,6 +183,17 @@ class SiteParserBase(metaclass=ABCMeta): """ return size_tools.parse_size(text) + def _has_valid_userid(self) -> bool: + """ + 判断用户 ID 是否存在且有效,避免空 ID 触发站点的无效详情/做种请求。 + """ + if self.userid is None: + return False + if isinstance(self.userid, str): + user_id = self.userid.strip() + return bool(user_id) and user_id != "0" + return bool(self.userid) and self.userid != 0 + def parse(self): """ 解析站点信息 @@ -216,13 +227,16 @@ class SiteParserBase(metaclass=ABCMeta): self._parse_user_base_info(self._index_html) # 解析用户详细信息 if self._user_detail_page: - self._parse_user_detail_info( - self._get_page_content( - url=urljoin(self._base_url, self._user_detail_page), - params=self._user_detail_params, - headers=self._user_detail_headers + if not self._has_valid_userid(): + logger.warn(f"{self._site_name} 未解析到有效用户 ID,跳过用户详情页请求") + else: + self._parse_user_detail_info( + self._get_page_content( + url=urljoin(self._base_url, self._user_detail_page), + params=self._user_detail_params, + headers=self._user_detail_headers + ) ) - ) # 解析用户未读消息 if get_runtime_setting('SITE_MESSAGE'): self._pase_unread_msgs() @@ -291,6 +305,9 @@ class SiteParserBase(metaclass=ABCMeta): 解析做种页面 """ if self._torrent_seeding_page: + if not self._has_valid_userid(): + logger.warn(f"{self._site_name} 未解析到有效用户 ID,跳过做种信息请求") + return # 第一页 next_page = self._parse_user_torrent_seeding_info( self._get_page_content( diff --git a/tests/test_hddolby_parser.py b/tests/test_hddolby_parser.py index 869d4347a..b78edfb58 100644 --- a/tests/test_hddolby_parser.py +++ b/tests/test_hddolby_parser.py @@ -66,3 +66,50 @@ def test_hddolby_reads_message_body_via_nexus_when_cookie_present(monkeypatch): assert head == "测试标题" assert date == "2026-07-21 10:00:00" assert content == "测试正文" + + +def test_parser_skips_detail_and_seeding_requests_without_valid_userid(monkeypatch): + class DummyParser(HDDolbySiteUserInfo): + def _parse_site_page(self, html_text: str): + self._user_detail_page = "userdetails.php?id=" + self._user_basic_page = None + self._user_traffic_page = None + self._torrent_seeding_page = "getusertorrentlistajax.php?userid=" + + def _parse_user_base_info(self, html_text: str): + self.userid = None + + def _parse_user_traffic_info(self, html_text: str): + raise AssertionError("should not request traffic page without valid userid") + + def _parse_user_torrent_seeding_info(self, html_text: str, multi_page: bool = False): + raise AssertionError("should not request seeding list without valid userid") + + def _parse_logged_in(self, html_text): + return True + + def _parse_message_unread_links(self, html_text: str, msg_links: list): + return None + + def _parse_message_content(self, html_text): + return None, None, None + + parser = DummyParser( + site_name="高清杜比", + url="https://www.hddolby.com/", + site_cookie="", + apikey="test-api-key", + token=None, + ) + calls = [] + + def fake_get_page_content(**kwargs): + calls.append(kwargs.get("url", "")) + return "" + + monkeypatch.setattr(parser, "_get_page_content", fake_get_page_content) + + parser.parse() + + assert not any("userdetails.php?id=" in call for call in calls) + assert not any("getusertorrentlistajax.php?userid=" in call for call in calls)