Telegram机器人是提升效率与互动体验的利器,而内联键(Inline Keyboard)更是机器人交互的核心功能之一。它允许机器人在消息下方嵌入可点击的按钮,用户点击后无需输入文字即可触发特定操作,如打开网页、切换选项、确认命令等。本文将基于官方Bot API,手把手教你如何设置内联键,让你的机器人从“聊天机器”升级为“交互终端”。
什么是Telegram内联键?
内联键(Inline Keyboard)是附着在消息底部的自定义按钮,通过InlineKeyboardMarkup对象实现。与自定义键盘(Reply Keyboard)不同,内联键始终显示在消息内,不占用输入栏,也不会随聊天上下滚动,因此更适合用于菜单选择、结果展示、分页导航等场景。
每个按钮可以绑定两种行为之一:
- 回调数据(Callback Data):点击后向机器人发送一个回调查询(Callback Query),机器人可在后台处理,无需在聊天中显示为一条消息。
- URL链接:点击后直接在Telegram内或浏览器中打开指定网页。
此外,还有切换内联查询(Switch Inline Query)等进阶类型,本文先聚焦前两者。
设置内联键前的准备
要使用内联键,你首先需要拥有一个Telegram机器人。若还没有,请按以下步骤创建:
- 在Telegram中搜索@BotFather(官方机器人管理工具)。
- 发送
/newbot命令,按照提示设置机器人的显示名称和用户名(用户名需以bot结尾)。 - 创建完成后,BotFather会返回一个HTTP API Token,格式为
123456789:ABCdef...,这是调用API的密钥,请妥善保存。
接下来,你还需要一个开发环境。以下示例使用Python(python-telegram-bot库)和Node.js(node-telegram-bot-api库),你也可以使用其他语言,核心逻辑相同。
使用Bot API发送内联键
设置内联键的核心是在sendMessage方法中传递reply_markup参数,其值为InlineKeyboardMarkup对象。下面以Python为例演示如何发送带内联键的文字消息:
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Updater, CommandHandler
TOKEN = "YOUR_BOT_TOKEN"
def start(update, context):
# 创建两个按钮:一个回调按钮,一个URL按钮
keyboard = [
[
InlineKeyboardButton("点击我", callback_data='btn1'),
InlineKeyboardButton("打开官网", url='https://onine-telegram.com')
]
]
reply_markup = InlineKeyboardMarkup(keyboard)
# 发送消息并附加键盘
update.message.reply_text('欢迎使用内联键示例:', reply_markup=reply_markup)
updater = Updater(TOKEN, use_context=True)
updater.dispatcher.add_handler(CommandHandler('start', start))
updater.start_polling()
updater.idle()
上述代码中,keyboard是一个二维数组,每行代表一个水平排列的按钮组。按钮使用InlineKeyboardButton创建,必须指定text(按钮文字),并且callback_data和url二选一(也可以留空作为占位,但一般不推荐)。
如果你使用Node.js,对应代码如下:
const TelegramBot = require('node-telegram-bot-api');
const TOKEN = 'YOUR_BOT_TOKEN';
const bot = new TelegramBot(TOKEN, { polling: true });
bot.onText(/\/start/, (msg) => {
const chatId = msg.chat.id;
const keyboard = {
inline_keyboard: [
[
{ text: '点击我', callback_data: 'btn1' },
{ text: '打开官网', url: 'https://onine-telegram.com' }
]
]
};
bot.sendMessage(chatId, '欢迎使用内联键示例:', {
reply_markup: keyboard
});
});
内联键按钮类型详解
根据InlineKeyboardButton的字段,按钮主要分为以下几类:
- 回调按钮(callback_data):点击后触发回调查询,需在代码中处理。适合动态交互。
- URL按钮(url):点击后跳转到指定网址,无需机器人响应。适合链接外部资源。
- 切换内联查询按钮(switch_inline_query):点击后用户的输入框自动填充指定内容,用于发起内联模式查询。
- 登录按钮(login_url):用于实现Telegram登录授权(需提供商支持)。
- 支付按钮(pay):需配合Bot Payments API使用,实现商品购买。
实际开发中,回调按钮使用最频繁。一个按钮可以设置callback_data,字符串长度通常限制在64字节以内(官方文档未强制,但建议保持简短)。
处理回调查询(Callback Query)
当用户点击带callback_data的按钮时,Telegram会向你的机器人发送一个callback_query更新。你需要在代码中捕获并处理,否则用户点击后按钮会一直处于加载状态(手动停止后恢复正常)。
以Python为例,处理回调查询的代码如下:
from telegram.ext import CallbackQueryHandler
def button_handler(update, context):
query = update.callback_query
# 必须回执(answer),否则按钮一直转圈
query.answer()
# 获取按钮携带的数据
data = query.data
# 根据数据执行相应操作
if data == 'btn1':
# 编辑原消息并修改键盘(可选)
query.edit_message_text('你点击了按钮1!')
else:
query.edit_message_text('未知操作')
updater.dispatcher.add_handler(CallbackQueryHandler(button_handler))
Node.js示例:
bot.on('callback_query', (callbackQuery) => {
const msg = callbackQuery.message;
const data = callbackQuery.data;
// 回执通知Telegram已收到
bot.answerCallbackQuery(callbackQuery.id);
if (data === 'btn1') {
bot.editMessageText('你点击了按钮1!', {
chat_id: msg.chat.id,
message_id: msg.message_id
});
}
});
注意:answerCallbackQuery是必须调用的,它用于通知Telegram机器人已接收处理,同时可以弹出提示文字(可选)。在Python中query.answer()相当于自动调用回执。
内联键的实用技巧
动态更新键盘
利用editMessageReplyMarkup或editMessageText可以实现键盘的动态变化,例如点击“下一页”时更换按钮数据,实现分页效果。
多行和分组
通过二维数组控制按钮布局。例如:
keyboard = [
[InlineKeyboardButton('1', callback_data='1'), InlineKeyboardButton('2', callback_data='2')],
[InlineKeyboardButton('3', callback_data='3')]
]
按钮大小写与表情
按钮文字支持Unicode表情,但请确保长度适中,避免在窄屏手机上被截断。
防止重复点击
在回调处理中,可以通过记录用户状态或使用query.answer的text参数显示“处理中”提示,避免用户重复触发。
常见问题
以下整理了几个开发者常遇到的问题:
- 内联键不显示? 检查是否在
reply_markup中设置了inline_keyboard,且消息是由机器人发送(不是频道匿名消息)。 - 点击按钮无反应? 确认已正确处理
callback_query事件,并调用回执。 - 能否在内联键中加入图片? 内联键是附加在消息上的,消息可以是图片(使用
sendPhoto),并传递reply_markup,同样支持。 - 内联键数量有限制吗? 一行最多8个按钮,整个键盘最多100个。
总结
通过本文,你已掌握Telegram机器人内联键的核心设置方法:创建按钮、附加到消息、处理回调。内联键是打造高效、友好人机交互的关键工具,无论是菜单导航、投票选择、还是分页浏览,都能显著提升用户体验。建议结合官方Bot API文档,在实践中尝试更多玩法。
如果你在Telegram开发中遇到其他问题,欢迎在本站“常见问题”栏目中搜索更多解决方案。