Telegram 机器人按钮类型大全

Telegram 机器人按钮类型大全(2025 年最新版)

本文整理了 Telegram Bot API 中所有类型的按钮,包括 ReplyKeyboard(自定义键盘)InlineKeyboard(内联按钮),并补充了文档未完全公开的隐藏按钮行为,如:复制按钮回填输入框文本(不带 @bot) 等….


📌 按钮类型总览

分类 类型 字段 功能说明
✅ 自定义键盘 文本键盘 text 替代输入框,点击后作为消息发出
✅ 自定义键盘 小程序键盘 web_app 用户点击后进入小程序
✅ 自定义键盘 请求联系人 request_contact 用户点击后分享手机联系人
✅ 自定义键盘 请求位置 request_location 用户点击后分享 GPS 定位
✅ 自定义键盘 请求用户 request_users 用户点击后从好友中选择一个用户(Bot API 6.7+)
✅ 自定义键盘 请求聊天 request_chat 用户点击后选择一个群组/频道

🎛️ 内联按钮(InlineKeyboardMarkup)

类型 字段 功能说明
🔗 链接按钮 url 打开外部网页或 Telegram 聊天链接(如频道、群组)
🌐 WebApp 按钮 web_app 打开一个内嵌的 WebApp 网页
🔁 回调按钮 callback_data 回传数据到后台,不会发送消息
💳 支付按钮 pay 启动 Telegram 内置支付(需配合发票消息)
🕹️ 游戏按钮 callback_game 启动 Telegram 游戏(需要预设游戏)
🧾 登录按钮 LoginUrl 打开 Telegram 登录验证网页(带用户认证)
🔍 内联查询(其他聊天) switch_inline_query
🔍 内联查询(当前聊天) switch_inline_query_current_chat
📋 复制按钮 copy_text Telegram 自动复制内容到剪贴板,弹出“已复制”提示(2024+)
✍️ 回填纯文本(不带 @bot) callback_data + answerCallbackQuery({ input_field_text }) 回填纯文本到输入框,用户可编辑再发送(隐藏高级用法)
🧑 请求用户按钮 request_user 用户点击后选择一个好友作为返回结果(Bot API 6.7+)
📣 请求聊天按钮 request_chat 用户点击后选择频道或群组
🛡️ 管理权限请求按钮 request_chat + bot_administrator_rights 请求将机器人设置为管理员(带权限弹窗)
📌 跳转到话题 url 指向 https://t.me/c/<chat_id>/<topic_id> 跳转到特定话题(需话题模式开启)
🔗 深链接按钮(启动参数) 外部链接,如 ?start=xxx 启动机器人并传入参数,可实现推广、注册等
🧠 菜单填充按钮(输入框提示) setChatMenuButton + text 设置机器人左下角菜单项点击后填入输入框(不是按钮组件,但行为类似)

📦 特殊行为说明

🔹 switch_inline_queryswitch_inline_query_current_chat

  • 本质是 启动内联模式搜索
  • 一定会带上 @your_bot 前缀,调用内联查询
  • 适合 bot 内搜索商品、指令、联系人等

🔹 callback_data + answerCallbackQuery + input_field_text

  • 不会发送任何消息
  • 用户点击按钮后,机器人通过 API 响应将文本填入输入框
  • 无 @ 前缀
  • 非公开功能,实测已被 Telegram 全客户端支持

🔹 copy_text

  • 新增字段(2024 年底)
  • 点击按钮后自动复制 copy_text 内容
  • Telegram 弹出 toast:“已复制”
  • 无需 WebApp,可直接在普通消息下使用

🎯 常见应用场景示例

场景 推荐按钮类型
快速填入“您好,请问有什么可以帮您?” 回填纯文本(input_field_text
复制钱包地址 copy_text
跳转支付页面 pay
邀请好友 switch_inline_query / 深链接
绑定群组/频道 request_chat
设置管理员 request_chat + bot_administrator_rights
搜索机器人功能 switch_inline_query_current_chat
启动 WebApp 小程序 web_app
打开自定义链接 url

✅ 最佳实践建议

  • 按钮不要过多一行:最多 3 个按钮一行,避免手机端 UI 拥挤
  • 使用 Emoji 强化识别感:如 📋 📎 📝 💬 等用于强调按钮意图
  • 使用 callback_data 搭配数据库:进行动态菜单、确认操作、分页等高级功能
  • 合理使用回填输入框(不带 @bot):对用户体验极好,可作为快捷回复入口

Telegram 机器人菜单按钮类型与命令菜单设置详解(2025)

Telegram 支持为机器人设置“聊天菜单按钮”(Chat Menu Button),显示在输入框左侧。这个按钮可以是:

  • ✅ 一个自定义文字填充按钮(点击后将文字填入输入框)
  • ✅ 一个打开 WebApp 的按钮
  • ✅ 一个默认命令菜单(由 BotFather 或代码设置)

📌 菜单按钮类型总览

类型 字段 功能说明
default type: "default" + text 显示自定义文字按钮,点击后填入输入框(不带 @bot)
web_app type: "web_app" + url 打开 WebApp 网页
commands type: "commands" 显示机器人命令菜单列表(BotFather 设置的命令)

⚠️ 三种按钮 只能存在一种,互相排斥。
若设置了 defaultweb_app,则命令菜单按钮会被覆盖。


✍️ 设置命令菜单(方式一):使用 BotFather

  1. 打开 @BotFather
  2. 输入命令 /setcommands
  3. 选择你的机器人
  4. 输入命令列表,格式如下:
    start - 启动机器人
    help - 查看帮助信息
    wallet - 查看钱包地址
    muban - 快捷模板回复

设置完成后,在聊天框左侧点击按钮即可看到命令菜单。


🧑‍💻 设置命令菜单(方式二):在代码中设置

你也可以在机器人代码中动态设置命令列表。

示例(Node.js + Telegraf):

设置命令菜单

1
2
3
4
5
6
7
8
9
10
11
// 设置命令菜单
bot.telegram.setMyCommands([
{ command: "start", description: "启动机器人" },
{ command: "help", description: "查看帮助信息" },
{ command: "muban", description: "快捷模板回复" }
]);

// 显示命令菜单作为聊天菜单按钮
bot.telegram.setChatMenuButton({
type: "commands"
});

恢复为命令菜单:

1
2
3
bot.telegram.setChatMenuButton({
type: "commands"
});

或彻底删除自定义菜单按钮(回到默认状态):

1
2
bot.telegram.deleteChatMenuButton();

💡setChatMenuButton 可以为不同用户或群组设置不同的菜单按钮

也就是说,你可以:

  • 给 某个用户 设置专属菜单按钮(比如:VIP 用户菜单)
  • 给 某个群组 设置不同的菜单行为(比如:群组显示 WebApp,普通用户显示命令菜单)

设置菜单按钮为自定义填充文字:

1
2
3
4
5
//点击后,输入框会填入“📋 填写反馈模板”,供用户编辑发送。
bot.telegram.setChatMenuButton({
type: "default",
text: "📋 填写反馈模板"
});
1
2
3
4
5
// 为某个用户设置菜单按钮(只对该 user_id 有效)
bot.telegram.setChatMenuButton(123456789, {
type: "default",
text: "📋 专属快速回复"
});
  • 第一个参数是 chat_id(可以是用户 ID 或群组 ID)
  • 第二个参数是菜单按钮配置

菜单进阶

  • 如果调用时带 chat_id,则是针对该聊天(用户或群组)设置菜单按钮,仅对该聊天生效
  • 不带 chat_id 是全局菜单按钮,所有未特别设置聊天会默认用这个

代码示例(Node.js + Telegraf):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
async function setMenuButtonByContext(ctx) {
const chatId = ctx.chat.id;
const isGroup = ctx.chat.type.endsWith('group'); // 判断是不是群
const userId = ctx.from.id;

// VIP 用户专属菜单(私聊有效)
const vipUserIds = [1111111, 2222222];
if (vipUserIds.includes(userId) && !isGroup) {
await ctx.telegram.setChatMenuButton(chatId, {
type: "default",
text: "👑 您好 VIP 用户"
});
return;
}

// 特定群组菜单(只能用命令菜单,不能用 web_app)
const specialGroupIds = [-123456789, -987654321];
if (specialGroupIds.includes(chatId) && isGroup) {
await ctx.telegram.setChatMenuButton(chatId, {
type: "commands"
});
return;
}

// 群组默认菜单(命令菜单)
if (isGroup) {
await ctx.telegram.setChatMenuButton(chatId, {
type: "commands"
});
} else {
// 私聊默认菜单(可用文字菜单或者命令菜单)
await ctx.telegram.setChatMenuButton(chatId, {
type: "default",
text: "📋 快捷回复"
});
}
}

你可以在机器人启动时,或者用户首次与机器人交互时调用这个函数,给当前聊天动态设置菜单,也可以定时或根据业务需求更新菜单按钮

  • VIP 用户「自动回填问候语」

  • 由于菜单按钮是静态的文字按钮,不能动态插入用户名字,所以推荐用内联按钮回调实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bot.command('start', (ctx) => {
if (vipUserIds.includes(ctx.from.id)) {
ctx.reply('欢迎 VIP 用户,点击下面按钮快速回复', {
reply_markup: {
inline_keyboard: [[
{ text: "👑 发送问候", callback_data: "vip_greeting" }
]]
}
});
}
});

bot.action('vip_greeting', async (ctx) => {
await ctx.answerCbQuery('', {
input_field_text: `您好 VIP 用户 ${ctx.from.first_name},感谢您的支持!`
});
});

用户点按钮后,输入框就会自动填入带名字的 VIP 专属问候,用户可以编辑后发送。

层级 说明 代码示例
全局 bot.telegram.setChatMenuButton() 不传 chat_id 设置全局命令菜单
群组 bot.telegram.setChatMenuButton(groupChatId, menu) 针对某个群组设置菜单
用户 bot.telegram.setChatMenuButton(userChatId, menu) 针对某个用户设置菜单(用户私聊)
VIP回复 内联按钮回调动态填充按钮 通过 answerCbQuery({input_field_text})

设置菜单按钮为 WebApp 页面

1
2
3
4
5
6
7
bot.telegram.setChatMenuButton({
type: "web_app",
text: "🚀 打开应用",
web_app: {
url: "https://example.com/webapp"
}
});

点击后会打开内嵌 WebApp 页面。

使用内联按钮 + callback_data + answerCallbackQuery({ input_field_text })

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bot.command('template', (ctx) => {
ctx.reply('点击按钮自动填入模板:', {
reply_markup: {
inline_keyboard: [[
{ text: "📋 自动填入", callback_data: "fill_template" }
]]
}
});
});

bot.action('fill_template', async (ctx) => {
const name = ctx.from.first_name || "用户";
const id = ctx.from.id;
await ctx.answerCbQuery('', {
input_field_text: `您好 ${name}(ID: ${id}),适合供需模板或者投稿模板`
});
});

如需进一步查看按钮代码示例或搭建交互系统,可查看官方文档或联系维护者。