如何让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
相关产品推荐
相关产品推荐

