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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 11:54:09