python-telegram-bot获取callback query并调用带新按钮函数的方法
python-telegram-bot 回调获取及二级按钮实现方案
核心逻辑说明
- 回调数据通过
update.callback_query.data字段获取,收到回调后必须先调用callback_query.answer()响应Telegram服务器,避免按钮出现加载超时 - 可以通过编辑原消息/发送新消息两种方式,触发新的带自定义inline按钮的界面
完整实现代码
以下代码适配
python-telegram-bot v20+版本
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup from telegram.ext import ApplicationBuilder, ContextTypes, CommandHandler, CallbackQueryHandler # 初始菜单函数(你原有的基础代码) async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: """发送初始带inline按钮的消息""" keyboard = [ [ InlineKeyboardButton("Option 1", callback_data='1'), InlineKeyboardButton("Option 2", callback_data='2'), ] ] reply_markup = InlineKeyboardMarkup(keyboard) await update.message.reply_text('请选择选项:', reply_markup=reply_markup) # 你需要调用的第二个带自定义inline按钮的函数 async def show_second_menu(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: """生成第二级自定义inline按钮菜单""" second_keyboard = [ [ InlineKeyboardButton("二级选项A", callback_data='a'), InlineKeyboardButton("二级选项B", callback_data='b'), ], [InlineKeyboardButton("返回上级", callback_data='back')] ] reply_markup = InlineKeyboardMarkup(second_keyboard) # 这里选择编辑原消息替换原有按钮,也可以用await update.callback_query.message.reply_text发送新消息 await update.callback_query.edit_message_text( text="你已进入二级菜单,请选择:", reply_markup=reply_markup ) # 回调处理核心函数 async def button_callback(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: """处理所有inline按钮的回调请求""" query = update.callback_query # 必须先响应回调,否则按钮会一直转圈 await query.answer() # 获取回调数据 callback_data = query.data # 根据不同的回调数据做分支处理 if callback_data in ['1', '2']: # 触发回调后调用二级菜单函数 await show_second_menu(update, context) elif callback_data == 'back': # 点击返回则重新加载初始菜单 await start(update, context) def main() -> None: # 替换成你自己的机器人TOKEN application = ApplicationBuilder().token("YOUR_BOT_TOKEN").build() # 注册命令处理器 application.add_handler(CommandHandler("start", start)) # 注册回调查询处理器 application.add_handler(CallbackQueryHandler(button_callback)) # 启动机器人 application.run_polling() if __name__ == '__main__': main()
注意事项
- 如果你使用的是v13及更早的同步版本,需要去掉所有
async/await关键字,用CallbackContext替代ContextTypes.DEFAULT_TYPE即可 - 如果不需要保留原消息,直接发送新的带按钮消息,把
show_second_menu里的edit_message_text换成query.message.reply_text即可
内容的提问来源于stack exchange,提问作者James Demisse
相关产品推荐
相关产品推荐

