From f40336b4db5f988ffcabe0e504e1387f78179a00 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 8 Mar 2026 03:03:00 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20/s=20=E7=AD=9B?= =?UTF-8?q?=E9=80=89=E6=8C=89=E9=92=AE=E6=97=A0=E5=93=8D=E5=BA=94=E5=8F=8A?= =?UTF-8?q?=E7=BF=BB=E9=A1=B5=E6=A0=87=E9=A2=98=E6=B6=88=E5=A4=B1=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:上次为 edit_text 添加 parse_mode="Markdown" 后, 云盘 URL 中的 _ 字符被 Telegram 解析为 Markdown 斜体标记, API 返回 can't parse entities 错误,被 except 静默吞掉, 导致点击筛选/翻页按钮后消息不更新。 修复1:新增 _md_escape() 函数,对 URL 中的 Markdown 特殊字符 (_、*、[、`)进行转义,确保动态 URL 内容不破坏 Markdown 解析。 修复2:翻页(search_next/previous_page)后改用 get_text_with_info() 获取文本,避免翻页后标题行消失。 --- module/search/search.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/module/search/search.py b/module/search/search.py index 2502f13..a5e7af7 100644 --- a/module/search/search.py +++ b/module/search/search.py @@ -36,6 +36,13 @@ } +def _md_escape(text: str) -> str: + """转义 Telegram Markdown v1 特殊字符(用于动态内容)""" + for ch in ("_", "*", "[", "`"): + text = text.replace(ch, f"\\{ch}") + return text + + def build_result_item_sync(count: int, item: PanSouResult) -> str: file_name = item.name file_url = item.url @@ -54,7 +61,7 @@ def build_result_item_sync(count: int, item: PanSouResult) -> str: pwd_text = f" | 密码: `{password}`" if password else "" clean_url = file_url.split("#")[0] if file_url else "" - url_text = f"\n🔗 {clean_url}" if clean_url else "" + url_text = f"\n🔗 {_md_escape(clean_url)}" if clean_url else "" return f"{count}. {emoji} `{file_name}`\n{file_size}{pwd_text}{url_text}\n\n" @@ -230,9 +237,11 @@ async def search_callback(update: Update, context: ContextTypes.DEFAULT_TYPE): return if data == "search_next_page": - text = page.next_page() + page.next_page() + text = page.get_text_with_info() elif data == "search_previous_page": - text = page.previous_page() + page.previous_page() + text = page.get_text_with_info() elif data == "search_filter_all": page.set_filter(None) text = page.get_text_with_info()