diff --git a/XianyuAutoAsync.py b/XianyuAutoAsync.py index d7fce6b..52132f2 100644 --- a/XianyuAutoAsync.py +++ b/XianyuAutoAsync.py @@ -38,6 +38,7 @@ from utils.notification_dispatcher import ( guess_verification_type, render_notification_template, ) +from utils.item_pagination import normalize_item_list_page_size MANUAL_VERIFICATION_CONTEXTS = { @@ -17779,6 +17780,11 @@ class XianyuLive: logger.error("获取商品信息失败,重试次数过多") return {"error": "获取商品信息失败,重试次数过多"} + requested_page_size = page_size + page_size = normalize_item_list_page_size(page_size) + if str(requested_page_size) != str(page_size): + logger.warning(f"商品列表每页数量已限制为 {page_size}: requested={requested_page_size}") + # 确保session已创建 if not self.session: await self.create_session() @@ -17945,6 +17951,7 @@ class XianyuLive: Returns: dict: 包含所有商品信息的字典 """ + page_size = normalize_item_list_page_size(page_size) all_items = [] page_number = 1 total_saved = 0 diff --git a/reply_server.py b/reply_server.py index 46f9f85..633affa 100644 --- a/reply_server.py +++ b/reply_server.py @@ -35,6 +35,7 @@ from utils.qr_login import qr_login_manager from utils.qr_login_lite import qrcode_login_lite from utils.xianyu_utils import trans_cookies from utils.image_utils import image_manager +from utils.item_pagination import MAX_ITEM_LIST_PAGE_SIZE from utils.product_sku import ProductSkuValidationError, normalize_sku_config from utils.time_utils import ( LOCAL_TIMEZONE, @@ -10261,7 +10262,7 @@ async def _sync_items_after_publish( try: page_sync_result = await xianyu_instance.get_item_list_info( page_number=1, - page_size=100, + page_size=MAX_ITEM_LIST_PAGE_SIZE, sync_item_details=True, ) @@ -10270,7 +10271,7 @@ async def _sync_items_after_publish( if published_item_id and not item_synced: fallback_result = await xianyu_instance.get_all_items( - page_size=100, + page_size=MAX_ITEM_LIST_PAGE_SIZE, max_pages=3, sync_item_details=True, ) diff --git a/tests/test_item_pagination.py b/tests/test_item_pagination.py new file mode 100644 index 0000000..489b48d --- /dev/null +++ b/tests/test_item_pagination.py @@ -0,0 +1,25 @@ +import unittest + +from utils.item_pagination import ( + DEFAULT_ITEM_LIST_PAGE_SIZE, + MAX_ITEM_LIST_PAGE_SIZE, + normalize_item_list_page_size, +) + + +class ItemPaginationTests(unittest.TestCase): + def test_keeps_supported_page_size(self): + self.assertEqual(normalize_item_list_page_size(10), 10) + self.assertEqual(normalize_item_list_page_size("20"), 20) + + def test_caps_page_size_at_goofish_limit(self): + self.assertEqual(MAX_ITEM_LIST_PAGE_SIZE, 20) + self.assertEqual(normalize_item_list_page_size(100), 20) + + def test_normalizes_invalid_page_size(self): + self.assertEqual(normalize_item_list_page_size(0), 1) + self.assertEqual(normalize_item_list_page_size("invalid"), DEFAULT_ITEM_LIST_PAGE_SIZE) + + +if __name__ == "__main__": + unittest.main() diff --git a/utils/item_pagination.py b/utils/item_pagination.py new file mode 100644 index 0000000..d0ca77f --- /dev/null +++ b/utils/item_pagination.py @@ -0,0 +1,15 @@ +from typing import Any + + +DEFAULT_ITEM_LIST_PAGE_SIZE = 20 +MAX_ITEM_LIST_PAGE_SIZE = 20 + + +def normalize_item_list_page_size(value: Any) -> int: + """将商品列表分页大小限制在闲鱼网页端接口允许的范围内。""" + try: + page_size = int(value) + except (TypeError, ValueError): + page_size = DEFAULT_ITEM_LIST_PAGE_SIZE + + return min(max(page_size, 1), MAX_ITEM_LIST_PAGE_SIZE)