python-telegram-bot报'Message'对象无'message'属性错误修复方案
报错根因
触发AttributeError: 'Message' object has no attribute 'message'的核心原因是递归调用逻辑的参数类型错误:
- 你的
sendMessage函数返回值是bot.send_message()的执行结果,这个返回值是Telegram API返回的Message类实例,不是框架传入回调的Update对象 - 你在递归调用
_func(bot, nextmsg, multi)时,把这个Message实例当成Update传入,第二次进入_func时执行update.message,相当于在Message对象上找不存在的message属性,直接触发报错 - 原代码还存在3个附加bug:构造nextmsg时引用了未定义的
message变量、注册handler时变量名mycommand__handler多写了一个下划线、parse_mode参数值HTMl拼写错误。
修复方案
不要用动态类伪造Update对象传递参数,直接把发送消息需要的核心参数(聊天id、基准回复id、消息内容、剩余发送次数)单独拆分传递,从根源避免类型不匹配问题:
- 重构
sendMessage函数,去掉对Update对象的依赖,直接传入chat_id和reply_to_msg_id两个必填参数 - 调整
_func递归逻辑,每次发送完成后直接用上一条已发消息的id计算下一条回复的id,不需要构造假的Update对象 - 增加空文本判断,避免用户发送贴纸、图片等无文本消息时触发报错
- 修正所有拼写类笔误
修正后完整代码
import time from telegram import Update from telegram.error import RetryAfter # 请提前导入你项目中已有的 LOGGER、BotCommands、CustomFilters、CommandHandler、dispatcher 依赖 def sendMessage(text: str, bot, chat_id: int, reply_to_msg_id: int): try: return bot.send_message( chat_id=chat_id, reply_to_message_id=reply_to_msg_id, text=text, allow_sending_without_reply=True, parse_mode='HTML', disable_web_page_preview=True ) except RetryAfter as r: LOGGER.warning(str(r)) time.sleep(r.retry_after * 1.5) return sendMessage(text, bot, chat_id, reply_to_msg_id) except Exception as e: LOGGER.error(str(e)) def _func(bot, chat_id: int, base_msg_id: int, msg_lines: list, send_idx: int, total_send: int): # 所有消息发送完成后终止递归 if send_idx >= total_send: return # 组装当前待发送内容,可根据自己的业务逻辑调整 current_content = msg_lines[send_idx] if send_idx < len(msg_lines) else f"这是第{send_idx+1}条连续回复" # 第一条回复用户触发的指令消息,后续回复机器人上一条发出的消息,实现串接效果 reply_id = base_msg_id if send_idx == 0 else base_msg_id + send_idx sent_msg = sendMessage(current_content, bot, chat_id, reply_id) time.sleep(4) # 递归发送下一条 _func(bot, chat_id, base_msg_id, msg_lines, send_idx + 1, total_send) def mycommand(update: Update, context): # 拦截无文本的触发场景,避免报错 if not update.message or not update.message.text: return msg_lines = update.message.text.split('\n') # 这里修改为你需要连续发送的消息总条数 total_send_count = 3 _func( bot=context.bot, chat_id=update.effective_chat.id, base_msg_id=update.message.message_id, msg_lines=msg_lines, send_idx=0, total_send=total_send_count ) mycommand_handler = CommandHandler( BotCommands.MyCommandCommand, mycommand, filters=CustomFilters.authorized_chat | CustomFilters.authorized_user, run_async=True ) # 修正原代码双下划线的拼写错误 dispatcher.add_handler(mycommand_handler)
效果说明
代码修复后,用户触发指令时,机器人会先回复用户的指令消息,之后每隔4秒发送一条后续消息,所有消息按回复关系串成连续对话,不会再触发AttributeError报错。
内容的提问来源于stack exchange,提问作者Gautham
相关产品推荐
相关产品推荐

