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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 22:06:24