在Telegram机器人开发中,键盘按钮是提升用户交互效率的重要工具。无论是快捷指令、菜单导航,还是表单填写,合理地设置键盘按钮都能让用户体验大幅提升。本文将从零开始,详细介绍Telegram机器人键盘按钮的两种主要形式——自定义键盘(Reply Keyboard)和内联键盘(Inline Keyboard),并给出可复制的Python代码示例,帮助你快速掌握设置技巧。
一、键盘按钮是什么?两种类型一次搞懂
Telegram机器人的键盘按钮分为两大类:
- 自定义键盘(Reply Keyboard):显示在输入框下方,替代默认的字符输入键盘。用户点击按钮后,按钮的文本会被发送到聊天中,机器人收到后可以做出相应响应。适合制作快捷回复、菜单选项等。
- 内联键盘(Inline Keyboard):直接内嵌在消息内容下方,按钮可以携带回调数据(callback_data),点击后不会在聊天窗口发送消息,而是触发机器人服务端的回调处理。适合制作动态操作、网页跳转、分页浏览等。
理解两者的区别是设置键盘的第一步。接下来我们用一个实际示例,分别演示如何创建和使用。
二、准备工作:从BotFather获取机器人Token
要在Telegram中使用机器人,必须先通过官方机器人BotFather创建机器人并获得API Token。步骤如下:
- 在Telegram中搜索并打开「@BotFather」。
- 发送命令
/newbot,根据提示为机器人起一个显示名称和用户名(必须以bot结尾)。 - 创建成功后,BotFather会给你一个类似
123456789:ABCdefGhIJKlmNoPQRsTUVwxyz的Token,妥善保存。 - (可选)使用
/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_data 或 url。通过 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即可,核心逻辑相同。
最后,合理设计键盘按钮的结构和文案,能显著提升机器人的可用性。希望本文能帮助你在机器人开发路上更进一步!