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

如何让Telegram的InlineKeyboardButton触发指令并解决AttributeError报错

问题原因
  • 你用聊天框输入/next指令触发函数时,消息对象存储在update.message中,可以正常调用reply_text发送消息
  • 点击内联按钮触发的是回调事件,此时update.message为None,对应的消息对象存储在update.callback_query.message里,直接调用原next函数自然会抛出属性不存在的错误
修复方法

修改next函数,让它自动适配两种触发场景,不需要改动现有调用逻辑,即可同时支持指令输入和按钮点击触发:

from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Updater, CommandHandler, CallbackQueryHandler

def start(update, context):
    context.user_data["step"] = 0  # 初始化步骤计数器
    update.message.reply_text(
        f"你好,当前是第 {context.user_data['step']} 步。",
        reply_markup=menu_keyboard(),
    )

def next(update, context):
    # 自动判断触发场景,获取正确的消息对象
    msg = update.message if update.message else update.callback_query.message
    context.user_data["step"] += 1
    msg.reply_text("已前进!")
    msg.reply_text(
        f"当前是第 {context.user_data['step']} 步。", reply_markup=menu_keyboard()
    )

def menu_keyboard():
    keyboard = [[InlineKeyboardButton("➡️ 下一步", callback_data="next")]]
    return InlineKeyboardMarkup(keyboard)

def button(update, context):
    query = update.callback_query
    query.answer()
    if query.data == "next":
        next(update, context)

def main():
    updater = Updater("你的机器人TOKEN", use_context=True)
    dp = updater.dispatcher
    dp.add_handler(CommandHandler("start", start))
    dp.add_handler(CommandHandler("next", next))
    dp.add_handler(CallbackQueryHandler(button))
    updater.start_polling()
    updater.idle()

if __name__ == '__main__':
    main()

如果不需要修改按钮和提示文本的中文翻译,也可以保留你原有的英文文案,只替换next函数里获取消息对象的逻辑即可。

内容的提问来源于stack exchange,提问作者asaintamand

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:24:04