Python Telegram Bot中MarkdownV2解析模式下含下划线用户名报错问题
问题解决方法
原因
Telegram的MarkdownV2解析模式中,下划线_是斜体标记的特殊字符。当用户名包含_时,未转义的_会被识别为斜体开始标记,因找不到对应的结束标记而触发解析错误。
解决方案
方案1:转义MarkdownV2特殊字符
编写辅助函数,对MarkdownV2要求转义的所有特殊字符进行转义处理:
def escape_markdown_v2(text): # MarkdownV2需转义的特殊字符列表 special_chars = r'_*[]()~`>#+-=|{}.!' return ''.join(f'\\{c}' if c in special_chars else c for c in text)
构造消息文本时,用该函数处理用户名及其他可能含特殊字符的动态内容:
# 转义所有动态内容 escaped_username = escape_markdown_v2(update.effective_user.username) escaped_key = escape_markdown_v2(context.user_data['key']) escaped_mod = escape_markdown_v2(context.user_data['mod']) escaped_code = escape_markdown_v2(context.user_data['code']) await context.bot.send_message( chat_id=CHANEL_ID, text= f"{escaped_key}\n\nCode: `{escaped_code}`\n\nMod: {escaped_mod}\n\nby: @{escaped_username}", parse_mode='MarkdownV2' )
方案2:改用HTML解析模式
如果仅需要代码块支持点击复制,HTML的<code>标签同样能实现该效果,且特殊字符处理逻辑更简单。可直接使用Telegram官方提供的escape_html工具函数:
from telegram.utils.helpers import escape_html # 转义所有动态内容 escaped_key = escape_html(context.user_data['key']) escaped_code = escape_html(context.user_data['code']) escaped_mod = escape_html(context.user_data['mod']) escaped_username = escape_html(update.effective_user.username) await context.bot.send_message( chat_id=CHANEL_ID, text= f"{escaped_key}\n\nCode: <code>{escaped_code}</code>\n\nMod: {escaped_mod}\n\nby: @{escaped_username}", parse_mode='HTML' )
内容的提问来源于stack exchange,提问作者Taha F
相关产品推荐
相关产品推荐

