From 994826fc38bdbacbcf2ccbf73e356e644e3d0221 Mon Sep 17 00:00:00 2001 From: Bowen Date: Fri, 11 Sep 2026 20:45:50 -0700 Subject: [PATCH] =?UTF-8?q?fix(weibo):=20detail=20=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=BC=A0=E5=85=A5=E5=BE=AE=E5=8D=9A=E5=B8=96?= =?UTF-8?q?=E5=AD=90=20URL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --specified_id 的帮助文案声明支持完整 URL 或 ID,但微博分支直接把原始输入透传给 config.WEIBO_SPECIFIED_ID_LIST,导致传 URL 时详情页请求和评论接口参数都变成畸形地址。 Web UI 前端虽能识别 ID,提交给后端的仍是原始 URL,所以走的是同一条失败路径。 参照贴吧已有的 _normalize_tieba_note_id,新增 _normalize_weibo_note_id 从 weibo.com//、m.weibo.cn/detail/、m.weibo.cn/status/ 三种常见 形态中提取帖子 ID,纯 ID 保持原样。补充离线单测覆盖归一化函数与完整 CLI 解析。 Fixes #914 --- cmd_arg/arg.py | 15 ++++++++++- tests/test_cmd_arg_weibo.py | 53 +++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 tests/test_cmd_arg_weibo.py diff --git a/cmd_arg/arg.py b/cmd_arg/arg.py index 20d1d3976..e44d322ec 100644 --- a/cmd_arg/arg.py +++ b/cmd_arg/arg.py @@ -143,6 +143,17 @@ def _normalize_tieba_note_id(value: str) -> str: return match.group(1) if match else value +def _normalize_weibo_note_id(value: str) -> str: + """Accept a raw Weibo note id or a post URL. + + Handles the common post URL shapes: + https://weibo.com//, https://m.weibo.cn/detail/, https://m.weibo.cn/status/ + """ + value = value.strip() + match = re.search(r"weibo\.(?:com|cn)/(?:\d+|detail|status)/([A-Za-z0-9]+)", value) + return match.group(1) if match else value + + def _normalize_tieba_creator_url(value: str) -> str: """Accept a Tieba creator homepage URL or a portrait id.""" value = value.strip() @@ -375,7 +386,9 @@ def main( elif platform == PlatformEnum.DOUYIN: config.DY_SPECIFIED_ID_LIST = specified_id_list elif platform == PlatformEnum.WEIBO: - config.WEIBO_SPECIFIED_ID_LIST = specified_id_list + config.WEIBO_SPECIFIED_ID_LIST = [ + _normalize_weibo_note_id(item) for item in specified_id_list + ] elif platform == PlatformEnum.KUAISHOU: config.KS_SPECIFIED_ID_LIST = specified_id_list elif platform == PlatformEnum.TIEBA: diff --git a/tests/test_cmd_arg_weibo.py b/tests/test_cmd_arg_weibo.py new file mode 100644 index 000000000..79ef98ba5 --- /dev/null +++ b/tests/test_cmd_arg_weibo.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2025 relakkes@gmail.com +# +# This file is part of MediaCrawler project. +# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/tests/test_cmd_arg_weibo.py +# GitHub: https://github.com/NanmiCoder +# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1 +# +# 声明:本代码仅供学习和研究目的使用。使用者应遵守以下原则: +# 1. 不得用于任何商业用途。 +# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。 +# 3. 不得进行大规模爬取或对平台造成运营干扰。 +# 4. 应合理控制请求频率,避免给目标平台带来不必要的负担。 +# 5. 不得用于任何非法或不当的用途。 +# +# 详细许可条款请参阅项目根目录下的LICENSE文件。 +# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。 + +import config +import pytest +from cmd_arg import parse_cmd +from cmd_arg.arg import _normalize_weibo_note_id + + +@pytest.mark.parametrize( + "raw, expected", + [ + ("R3bk1ydAR", "R3bk1ydAR"), + ("4982041758140155", "4982041758140155"), + ("https://weibo.com/7798025479/R3bk1ydAR?refer_flag=1001030103_", "R3bk1ydAR"), + ("https://m.weibo.cn/detail/4982041758140155", "4982041758140155"), + ("https://m.weibo.cn/status/R3bk1ydAR", "R3bk1ydAR"), + (" https://weibo.com/7798025479/R3bk1ydAR ", "R3bk1ydAR"), + ], +) +def test_normalize_weibo_note_id(raw, expected): + assert _normalize_weibo_note_id(raw) == expected + + +@pytest.mark.asyncio +async def test_weibo_detail_cli_sets_specified_ids(): + await parse_cmd( + [ + "--platform", + "wb", + "--type", + "detail", + "--specified_id", + "https://weibo.com/7798025479/R3bk1ydAR?refer_flag=1001030103_,4982041758140155", + ] + ) + + assert config.WEIBO_SPECIFIED_ID_LIST == ["R3bk1ydAR", "4982041758140155"]