Telegram机器人设置键盘按钮全指南:自定义键盘与内联键盘实战

全面讲解Telegram机器人键盘按钮的设置方法,涵盖自定义键盘(Reply Keyboard)和内联键盘(Inline Keyboard)的创建步骤、代码示例、适用场景与实用技巧,帮助开发者快速构建交互友好、操作便捷的机器人。

阅读提示建议先浏览文章结构,再按需深入阅读具体段落。

在Telegram机器人开发中,键盘按钮是提升用户交互效率的重要工具。无论是快捷指令、菜单导航,还是表单填写,合理地设置键盘按钮都能让用户体验大幅提升。本文将从零开始,详细介绍Telegram机器人键盘按钮的两种主要形式——自定义键盘(Reply Keyboard)和内联键盘(Inline Keyboard),并给出可复制的Python代码示例,帮助你快速掌握设置技巧。

一、键盘按钮是什么?两种类型一次搞懂

Telegram机器人的键盘按钮分为两大类:

  • 自定义键盘(Reply Keyboard):显示在输入框下方,替代默认的字符输入键盘。用户点击按钮后,按钮的文本会被发送到聊天中,机器人收到后可以做出相应响应。适合制作快捷回复、菜单选项等。
  • 内联键盘(Inline Keyboard):直接内嵌在消息内容下方,按钮可以携带回调数据(callback_data),点击后不会在聊天窗口发送消息,而是触发机器人服务端的回调处理。适合制作动态操作、网页跳转、分页浏览等。

理解两者的区别是设置键盘的第一步。接下来我们用一个实际示例,分别演示如何创建和使用。

二、准备工作:从BotFather获取机器人Token

要在Telegram中使用机器人,必须先通过官方机器人BotFather创建机器人并获得API Token。步骤如下:

  1. 在Telegram中搜索并打开「@BotFather」。
  2. 发送命令 /newbot,根据提示为机器人起一个显示名称和用户名(必须以 bot 结尾)。
  3. 创建成功后,BotFather会给你一个类似 123456789:ABCdefGhIJKlmNoPQRsTUVwxyz 的Token,妥善保存。
  4. (可选)使用 /setcommands 为机器人设置命令列表,比如:
    start - 启动机器人
    menu - 显示功能菜单

获得Token后,我们就可以开始编写代码了。

三、自定义键盘(Reply Keyboard)设置实战

自定义键盘适用于让用户快速输入预设文字。例如,一个“课程查询”机器人,可以显示“今日课程”“作业通知”等按钮。下面以Python开发为例,使用 python-telegram-bot 库。

3.1 安装依赖库

pip install python-telegram-bot==20.6

3.2 创建并发送自定义键盘

from telegram import Update, ReplyKeyboardMarkup
from telegram.ext import Application, CommandHandler, ContextTypes, MessageHandler, filters

TOKEN = "你的机器人Token"

# 定义/start命令的响应
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    # 设置键盘按钮:两列布局
    keyboard = [
        ["今日课程", "作业通知"],
        ["成绩查询", "联系老师"],
        ["帮助"]
    ]
    reply_markup = ReplyKeyboardMarkup(
        keyboard,
        resize_keyboard=True,   # 让按钮自动适应屏幕宽度
        one_time_keyboard=True  # 点击后键盘收起(可选)
    )
    await update.message.reply_text("欢迎使用课程助手!请选择功能:", reply_markup=reply_markup)

# 处理用户点击按钮后发送的文本消息
async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
    text = update.message.text
    if text == "今日课程":
        await update.message.reply_text("今天有:数学、英语、编程")
    elif text == "作业通知":
        await update.message.reply_text("今晚需完成数学作业第5题")
    else:
        await update.message.reply_text(f"你发送了:")

def main():
    app = Application.builder().token(TOKEN).build()
    app.add_handler(CommandHandler("start", start))
    app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
    app.run_polling()

if __name__ == "__main__":
    main()

运行代码后,私聊你的机器人并发送 /start,输入框下方会出现一组按钮。点击“今日课程”按钮,消息内容就会发送给机器人,并得到对应回复。

四、内联键盘(Inline Keyboard)设置实战

内联键盘适合需要处理点击事件的场景,比如点赞、翻页、打开网页等。每个按钮可以带有 callback_dataurl。通过 CallbackQueryHandler 处理点击事件。

4.1 创建内联键盘

from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update
from telegram.ext import Application, CallbackQueryHandler, CommandHandler, ContextTypes

TOKEN = "你的机器人Token"

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    # 内联键盘第一行:一个按钮
    button1 = InlineKeyboardButton("点赞", callback_data="like")
    button2 = InlineKeyboardButton("打开官网", url="https://example.com")
    # 第二行:一个按钮
    button3 = InlineKeyboardButton("下一页", callback_data="next")
    
    keyboard = [[button1, button2], [button3]]
    reply_markup = InlineKeyboardMarkup(keyboard)
    await update.message.reply_text("点击下方按钮操作:", reply_markup=reply_markup)

async def button_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()  # 必须响应,否则客户端会一直在loading
    data = query.data
    if data == "like":
        await query.edit_message_text(text="你点了一个赞!")  # 原地修改消息
    elif data == "next":
        await query.edit_message_text(text="这是第二页", reply_markup=build_page_2())

def build_page_2():
    button = InlineKeyboardButton("上一页", callback_data="prev")
    return InlineKeyboardMarkup([[button]])

def main():
    app = Application.builder().token(TOKEN).build()
    app.add_handler(CommandHandler("start", start))
    app.add_handler(CallbackQueryHandler(button_callback))
    app.run_polling()

if __name__ == "__main__":
    main()

4.2 内联键盘的常用回调处理

  • query.data:获取按钮的 callback_data 值。
  • edit_message_text:编辑原消息,可用来实现分页、切换状态等。
  • edit_message_reply_markup:仅更新键盘,保留正文。

内联键盘特别适合需要动态反馈的场景,比如电商商品切换、文章翻页等。

五、完整示例:做一个带菜单和分页的机器人

将上述知识综合起来,实现一个简单的“帮助中心”机器人,提供内联菜单和分页查看常见问题。

import re
from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update, ReplyKeyboardMarkup
from telegram.ext import Application, CommandHandler, CallbackQueryHandler, MessageHandler, filters, ContextTypes

TOKEN = '你的Token'

# 模拟数据
faq_list = [
    "问题1:如何修改键盘?",
    "问题2:如何添加按钮?",
    "问题3:如何实现分页?",
    "问题4:如何设置权限?"
]

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    # 自定义键盘菜单
    keyboard = [["帮助中心", "联系我们"] , ["退出"]]
    await update.message.reply_text("欢迎!请选择操作:", reply_markup=ReplyKeyboardMarkup(keyboard, resize_keyboard=True))

async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
    text = update.message.text
    if text == "帮助中心":
        await show_faq_page(update.message, 0)  # 第一页
    else:
        await update.message.reply_text("无效操作")

async def show_faq_page(message, page):
    # 每页显示1条
    faq = faq_list[page]
    keyboard = []
    if page > 0:
        keyboard.append(InlineKeyboardButton("上一页", callback_data=f"prev_"))
    if page < len(faq_list)-1:
        keyboard.append(InlineKeyboardButton("下一页", callback_data=f"next_"))
    reply_markup = InlineKeyboardMarkup([keyboard])
    await message.reply_text(f"FAQ({page+1}/{len(faq_list)})\n", reply_markup=reply_markup)

async def callback_handler(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    data = query.data
    match = re.match(r"(prev|next)_(\d+)", data)
    if match:
        action, page_str = match.groups()
        page = int(page_str)
        if action == "next":
            page += 1
        else:
            page -= 1
        # 编辑原消息显示新内容
        faq = faq_list[page]
        keyboard = []
        if page > 0:
            keyboard.append(InlineKeyboardButton("上一页", callback_data=f"prev_"))
        if page < len(faq_list)-1:
            keyboard.append(InlineKeyboardButton("下一页", callback_data=f"next_"))
        reply_markup = InlineKeyboardMarkup([keyboard])
        await query.edit_message_text(text=f"FAQ({page+1}/{len(faq_list)})\n", reply_markup=reply_markup)

def main():
    app = Application.builder().token(TOKEN).build()
    app.add_handler(CommandHandler('start', start))
    app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
    app.add_handler(CallbackQueryHandler(callback_handler))
    app.run_polling()

if __name__ == '__main__':
    main()

这里用了re来解析回调数据,也可以使用更简单的JSON格式,但注意Telegram callback_data有64字节长度限制,简单字符串更安全。

六、实用建议与常见坑

  • 自定义键盘按钮数量:Telegram官方建议每行最多4个按钮,行数不限,但过多会占用屏幕空间,建议精简。
  • 按钮文本过长:自定义键盘按钮的文本就是发送的消息,过长会使聊天记录混乱。
  • 内联键盘callback_data长度:最多64字节,不要放太多复杂数据,可以只存ID,再在服务端查询。
  • 必须回调answer:处理callback_query时,一定先调用query.answer(),否则客户端按钮会一直转圈。
  • 按钮权限:机器人只能接收用户主动发送的消息,无法主动向用户发消息(除非双方有会话),键盘按钮同样遵守此规则。
  • 删除自定义键盘:如果发送了新键盘,旧键盘会自动替换;也可以用ReplyKeyboardRemove移除键盘。

七、总结

通过本文的讲解,你应该已经掌握了Telegram机器人键盘按钮的核心设置方法。自定义键盘适合快速输入,内联键盘适合交互操作,两者结合可以创造丰富的机器人体验。文中给出的Python示例可以直接运行,你也可以根据业务需求进行二次开发。如果你需要其他语言(如Node.js、Java)的实现,参考官方API即可,核心逻辑相同。

最后,合理设计键盘按钮的结构和文案,能显著提升机器人的可用性。希望本文能帮助你在机器人开发路上更进一步!

FAQ

下载与安装

常见问题