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

python-telegram-bot报'Message'对象无'message'属性错误修复方案

报错根因

触发AttributeError: 'Message' object has no attribute 'message'的核心原因是递归调用逻辑的参数类型错误:

  1. 你的sendMessage函数返回值是bot.send_message()的执行结果,这个返回值是Telegram API返回的Message类实例,不是框架传入回调的Update对象
  2. 你在递归调用_func(bot, nextmsg, multi)时,把这个Message实例当成Update传入,第二次进入_func时执行update.message,相当于在Message对象上找不存在的message属性,直接触发报错
  3. 原代码还存在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 01:24:33