You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 17:42:16