在Telegram的聊天中,我们经常看到一些消息下方带着可点击的按钮,点击后可以打开网页或触发特定动作。这种「带按钮的消息」并非普通用户可以直接发送,而是通过机器人(Bot)创建并推送的。对于社群管理者、内容运营者或技术爱好者来说,掌握这一功能可以显著提升消息的互动性与转化率。本文将从零开始,带你完成从创建机器人到发布带按钮消息的全过程,即使你不懂编程也能理解每一步的原理。
一、带按钮消息的基础:内联键盘与回复键盘
Telegram 机器人支持两种按钮交互形式:
- 内联键盘(Inline Keyboard):附加在消息正文下方的按钮区,点击按钮后不发送消息,而是触发回调或打开链接。这是最常用的按钮类型,适合做菜单、快捷操作等。
- 回复键盘(Reply Keyboard):显示在输入栏下方的虚拟键盘,用于快速回复预设文案。它更偏向于简化用户输入,而非交互动作。
本文重点讲解内联键盘,因为它能实现更丰富的交互场景,且视觉上更接近“带按钮的消息”。
二、准备工作:使用 BotFather 创建机器人
要发送带按钮的消息,首先需要一个机器人账号。Telegram 官方提供的 @BotFather 可以帮你完成创建。
- 在 Telegram 中搜索并打开 @BotFather,点击 START 开始对话。
- 发送指令
/newbot,BofFather 会要求你为机器人设置一个显示名称和用户名。 - 名称可以随意填写,例如 交互小助手;用户名必须以
bot结尾,例如my_interactive_bot。 - 创建成功后,BotFather 会返回一个 Token(API密钥),类似
123456:ABC-DEF1234...。请妥善保存,它是控制机器人的唯一凭证。
如果你不熟悉命令行操作,可以先用一个支持 Bot API 的图形化客户端(如 BotFather 本身的测试工具),或直接使用下方示例中的编程方式。
三、通过 HTTP API 发送第一条带内联按钮的消息
Telegram Bot API 提供了 sendMessage 方法,通过附加 reply_markup 参数即可定义内联键盘。这里我们使用 Python 与 curl 两种方式演示。
3.1 Python 示例
import requests
# 替换成你的 Bot Token
TOKEN = "123456:ABC-DEF1234"
chat_id = "@your_target_channel" # 可以是群组、频道或个人ID
url = f"https://api.telegram.org/bot/sendMessage"
payload = {
"chat_id": chat_id,
"text": "欢迎使用我们的服务!",
"reply_markup": {
"inline_keyboard": [
[
{"text": "访问官网", "url": "https://new-telegram.com.cn"},
{"text": "联系客服", "url": "https://t.me/support"}
]
]
}
}
response = requests.post(url, json=payload)
print(response.status_code)
print(response.text)
3.2 curl 示例(用于快速测试)
curl -X POST "https://api.telegram.org/bot<TOKEN>/sendMessage" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "@your_target_channel",
"text": "点击下方按钮",
"reply_markup": {
"inline_keyboard": [
[{"text": "打开网站", "url": "https://new-telegram.com.cn"}]
]
}
}'
运行脚本后,你会在指定对话中收到带有一个或两个按钮的消息。按钮的文本和链接都可以自定义。
四、按钮类型详解:URL按钮与回调按钮
在上面的例子中,我们使用了 url 字段,这类按钮称为 URL按钮,点击后直接打开浏览器跳转。另一种常用类型是 回调按钮(callback_data),点击后不会打开外部链接,而是向机器人发送一个回调数据,触发服务端逻辑。
URL按钮适用场景:推广网页、引导注册、跳转官方频道等。
回调按钮适用场景:菜单操作、投票、分页加载、状态切换等。
回调按钮的定义方式如下:
{
"inline_keyboard": [
[
{"text": "喜欢", "callback_data": "like"},
{"text": "不喜欢", "callback_data": "dislike"}
]
]
}
注意,callback_data 长度不能超过 64 字节,且只能由字母、数字、下划线等基本字符组成。
五、处理回调按钮的交互:Webhook 或长轮询
当用户点击回调按钮时,Telegram 会将更新发送到你的服务器(或本地程序)。你需要在代码中响应的 callback_query,并使用 answerCallbackQuery 方法返回提示。
简单示例(使用 python-telegram-bot 框架):
from telegram import Update
from telegram.ext import Application, CallbackQueryHandler, CommandHandler
async def button_callback(update: Update, context):
query = update.callback_query
await query.answer() # 必须响应,否则按钮会一直转圈
data = query.data
if data == "like":
await query.message.reply_text("感谢你的喜欢!")
elif data == "dislike":
await query.message.reply_text("我们会改进的。")
async def start(update: Update, context):
await update.message.reply_text("请选择:", reply_markup={
"inline_keyboard": [
[{"text": "喜欢", "callback_data": "like"},
{"text": "不喜欢", "callback_data": "dislike"}]
]
})
app = Application.builder().token("YOUR_TOKEN").build()
app.add_handler(CommandHandler("start", start))
app.add_handler(CallbackQueryHandler(button_callback))
app.run_polling()
如果只用 API 而不使用框架,也可以设置 Webhook 让 Telegram 将更新推送给你。无论哪种方法,核心是解析 callback_query 并执行对应的动作。
六、进阶技巧:多行布局、动态按钮与消息编辑
6.1 多行布局
内联键盘的 inline_keyboard 是一个二维数组。每个内部数组表示一行,每行可以放置多个按钮。例如:
"inline_keyboard": [
[{"text": "A", "callback_data": "a"}, {"text": "B", "callback_data": "b"}],
[{"text": "C", "callback_data": "c"}]
]
这样第一行有两个按钮,第二行有一个按钮。
6.2 动态按钮
你可以根据用户状态动态生成按钮,例如分页浏览、按需加载。只需要在发送请求前构建 Python 列表即可。
6.3 编辑已有消息
当用户点击按钮后,你可以使用 editMessageText 改变消息内容或按钮布局,实现菜单切换效果。例如:
await query.message.edit_text("新内容", reply_markup=new_keyboard)
七、常见错误与故障排查
- 按钮不显示:检查
reply_markup是否拼写错误,JSON 格式是否正确。 - 点击按钮后无反应:回调按钮必须通过
answerCallbackQuery响应,否则客户端会一直显示加载。 - 提示“Bot token invalid”:确认 Token 是否正确,以及是否在创建后复制了多余字符。
- 无法在频道里发送:如果频道开启了“评论”权限,可能需要机器人有相应权限;个人对话则无限制。
- callback_data 超长:务必控制在 64 字节以内。
总结
制作带按钮的消息并非难事,核心掌握三步:创建机器人、构造 inline_keyboard 参数、发送请求。无论你是想打造频道互动菜单,还是构建完整的 Bot 服务,学会这一技能都会让消息更专业、更高效。建议你先在小号或测试群中尝试,再逐步应用到真实场景。
如果你对 Bot API 有更多疑问,欢迎参考官方文档或关注本站后续教程。