使用python-telegram-bot获取机器人名称时解析实体报错求助
解决python-telegram-bot中"Can't parse entities: unexpected end of name token"错误
问题背景
使用python-telegram-bot开发机器人时,触发info命令返回包含机器人名称的信息文本,出现以下错误:
2022-07-25 08:51:40,319 - bot - ERROR - Can't parse entities: unexpected end of name token at byte offset 126
错误原因
该错误源于Telegram默认启用的MarkdownV2消息解析机制:文本中的@符号会被识别为用户名实体的起始标记,但你使用的宽体Unicode特殊字符、未转义的格式内容,导致解析器无法正确识别实体的结束位置,最终抛出"unexpected end of name token"异常。
解决方案
提供两种可行的修复方式:
方法1:禁用消息解析模式
直接指定parse_mode=None,让Telegram跳过实体解析,直接显示原始文本。
假设你的sendImgz函数内部调用了bot.send_photo,需确保传递parse_mode参数:
# 先修改sendImgz函数,添加parse_mode参数 def sendImgz(img, caption, bot, message, reply_markup=None, parse_mode=None): bot.send_photo( chat_id=message.chat.id, photo=img, caption=caption, reply_markup=reply_markup, parse_mode=parse_mode ) # 调用时传入parse_mode=None sendImgz(img, info_string, context.bot, update.message, reply_markup, parse_mode=None)
方法2:转义特殊字符
如果需要保留Markdown格式,使用python-telegram-bot提供的工具函数转义所有特殊字符:
# 导入转义工具 from telegram.utils.helpers import escape_markdown def info(update, context): user = update.message.from_user # 对包含@的用户名和机器人名称进行转义 info_string = f''' 𝙷𝚒 @{escape_markdown(user.username, version=2)} ✯ 𝙼𝚈 𝙽𝙰𝙼𝙴: {escape_markdown(context.bot.name, version=2)} ✯ 𝙻𝙸𝙱𝚁𝙰𝚁𝚈: 𝙿𝚈𝚃𝙷𝙾𝙽-𝚃𝙴𝙻𝙴𝙶𝚁𝙰𝙼-𝙱𝙾𝚃 ✯ 𝙻𝙰𝙽𝙶𝚄𝙰𝙶𝙴: 𝙿𝚈𝚃𝙷𝙾𝙽 𝟹 ✯ 𝙳𝙰𝚃𝙰 𝙱𝙰𝚂𝙴: 𝙼𝙾𝙽𝙶𝙾 𝙳𝙱 ✯ 𝙱𝙾𝚃 𝚂𝙴𝚁𝚅𝙴𝚁: 𝙷𝙴𝚁𝙾𝙺𝚄 ✯ 𝙱𝚄𝙸𝙻𝙳 𝚂𝚃𝙰𝚃𝚄𝚂: v2.0 ''' img = 'https://telegra.ru.com/p/e74261e8x916320db94d2b30b241cddf245e669a64b26be2' buttonu = ButtonMaker() buttonu.sbutton("Mirror Group", 'aebx') reply_markup = InlineKeyboardMarkup(buttonu.build_menu(1)) sendImgz(img, info_string, context.bot, update.message, reply_markup)
注意指定version=2以匹配Telegram的MarkdownV2解析规则。
验证
修改后重新运行机器人,触发info命令即可正常显示包含机器人名称的信息文本,不再出现解析错误。
内容的提问来源于stack exchange,提问作者Aaron P Saji
相关产品推荐
相关产品推荐

