如何使用pyTelegramBotAPI实现Telegram机器人嵌套内联菜单
pyTelegramBotAPI 同消息嵌套内联菜单实现
实现效果和官方BotFather的菜单交互完全一致:所有菜单切换操作都在同一条消息内完成,点击按钮不会产生新消息,直接修改当前消息内容和按钮组。
- 前置依赖:先安装对应库,执行命令
pip install pyTelegramBotAPI - 核心实现点:不调用消息发送接口,通过
edit_message_text方法修改触发按钮点击的原消息,实现无新消息的层级切换 - 必要配置:每次处理按钮回调后必须调用
answer_callback_query,否则Telegram客户端会一直显示加载动画
最小可运行示例代码
import telebot from telebot import types # 替换为你自己申请的机器人Token BOT_TOKEN = "YOUR_BOT_TOKEN_HERE" bot = telebot.TeleBot(BOT_TOKEN) # 各层级菜单定义 def build_main_menu(): """构建主菜单""" kb = types.InlineKeyboardMarkup(row_width=1) kb.add( types.InlineKeyboardButton("进入功能分类1", callback_data="menu_1"), types.InlineKeyboardButton("进入功能分类2", callback_data="menu_2") ) return kb, "=== 主菜单 ===\n请选择功能分类:" def build_menu_1(): """构建一级菜单:功能分类1""" kb = types.InlineKeyboardMarkup(row_width=1) kb.add( types.InlineKeyboardButton("进入子功能1-1", callback_data="menu_1_1"), types.InlineKeyboardButton("返回主菜单", callback_data="main") ) return kb, "=== 功能分类1 ===\n请选择子功能:" def build_menu_1_1(): """构建二级菜单:子功能1-1""" kb = types.InlineKeyboardMarkup(row_width=1) kb.add( types.InlineKeyboardButton("返回上一级", callback_data="menu_1"), types.InlineKeyboardButton("返回主菜单", callback_data="main") ) return kb, "=== 子功能1-1 ===\n当前为最深层级菜单" def build_menu_2(): """构建一级菜单:功能分类2""" kb = types.InlineKeyboardMarkup(row_width=1) kb.add( types.InlineKeyboardButton("返回主菜单", callback_data="main") ) return kb, "=== 功能分类2 ===\n当前分类暂无子功能" # 指令处理 @bot.message_handler(commands=["start"]) def send_welcome(message): kb, text = build_main_menu() bot.send_message(message.chat.id, text, reply_markup=kb) # 按钮回调统一处理 @bot.callback_query_handler(func=lambda call: True) def handle_menu_switch(call): # 根据回调数据匹配对应菜单 menu_map = { "main": build_main_menu, "menu_1": build_menu_1, "menu_1_1": build_menu_1_1, "menu_2": build_menu_2 } if call.data not in menu_map: bot.answer_callback_query(call.id) return kb, text = menu_map[call.data]() # 核心操作:编辑原消息,不发送新消息 bot.edit_message_text( chat_id=call.message.chat.id, message_id=call.message.id, text=text, reply_markup=kb ) # 关闭客户端加载状态 bot.answer_callback_query(call.id) if __name__ == "__main__": bot.infinity_polling()
扩展说明
- 新增菜单层级只需要新增对应的菜单构建函数,分配全局唯一的
callback_data,再加入回调匹配的menu_map即可,支持任意深度的嵌套 - 可以根据需求调整按钮排列宽度、增加功能按钮(比如触发特定操作、弹出提示、跳转链接等)
- 如果需要在菜单中传递参数,可以在
callback_data中按约定格式拼接数据(注意Telegram对callback_data有64字节长度限制)
内容的提问来源于stack exchange,提问作者dokichan
相关产品推荐
相关产品推荐

