你在使用Telegram机器人时,是否希望它能像官方Bot那样,在消息下方显示一排可点击的按钮?这些按钮能让用户一键完成操作,无需手动输入指令。很多新手在尝试给机器人添加按钮时,往往会卡在不知道用什么工具、代码写错、或按钮点击后无反应等问题上。下面我将一步步教你如何通过BotFather和简单的Python代码,为你的机器人添加自定义按钮。

准备条件:注册机器人并获取Token

在给机器人添加按钮前,你必须已经拥有一个属于自己的机器人,并拿到它的API Token。

具体操作说明:

1. 打开Telegram,在搜索框输入 BotFather(官方机器人管理工具),点击进入对话。

2. 发送命令 /newbot,按提示依次输入你想要的机器人名称(如“我的按钮机器人”)和用户名(必须以 bot结尾,例如 MyButtonBot)。

3. 创建成功后,BotFather会返回一段类似 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11的字符串,这就是你的 API Token,请务必复制保存好。

注意事项/小提示:

  • 用户名必须唯一,如果提示已存在,换一个组合再试。
  • Token是机器人的唯一凭证,不要泄露给他人,否则别人可以控制你的机器人。
  • 如果丢失Token,可以在BotFather中发送 /mybots,选择你的机器人,再点击 API Token重新获取。

备用方案:

  • 如果无法访问BotFather,可请已在Telegram的朋友帮你创建机器人,再分享Token给你。
  • 也可以使用第三方机器人管理面板(如 @BotListBot),但安全性不如官方BotFather。

核心操作:使用InlineKeyboardMarkup创建内联按钮

按钮分为两种:内联按钮(InlineKeyboardButton,点击后不回传消息,可跳转链接或触发回调)和键盘按钮(ReplyKeyboardMarkup,显示在输入框上方)。本教程以内联按钮为例,这是最常用、功能最丰富的按钮类型。

具体操作说明:

1. 安装Python库 python-telegram-bot(如果你用Python开发)。在终端运行:pip install python-telegram-bot==13.15(版本号请根据官方文档选择稳定版)。

2. 创建一个新的Python文件(如 button_bot.py),写入以下基础代码框架:

`python

from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update

from telegram.ext import Updater, CommandHandler, CallbackQueryHandler, CallbackContext

# 定义按钮点击后的处理函数

def button_callback(update: Update, context: CallbackContext):

query = update.callback_query

query.answer() # 必须调用,否则按钮会一直转圈

query.edit_message_text(text=f"你点击了按钮: {query.data}")

# 定义命令 /start 的响应

def start(update: Update, context: CallbackContext):

keyboard = [

[InlineKeyboardButton("选项一", callback_data='option1'),

InlineKeyboardButton("选项二", callback_data='option2')],

[InlineKeyboardButton("访问官网", url='https://example.com')]

]

reply_markup = InlineKeyboardMarkup(keyboard)

update.message.reply_text('请选择一个选项:', reply_markup=reply_markup)

# 主程序

def main():

updater = Updater("YOUR_TOKEN_HERE", use_context=True)

dp = updater.dispatcher

dp.add_handler(CommandHandler('start', start))

dp.add_handler(CallbackQueryHandler(button_callback))

updater.start_polling()

updater.idle()

if __name__ == '__main__':

main()

`

3. 将代码中的 YOUR_TOKEN_HERE替换为你之前获取的Token。

4. 运行脚本:python button_bot.py,然后在Telegram中给你的机器人发送 /start命令,即可看到按钮出现。

注意事项/小提示:

  • callback_data用于识别用户点击了哪个按钮,长度限制为 64字节,不要写太长文本。
  • url按钮不需要 callback_data,点击后会直接跳转浏览器。
  • 如果按钮点击后无反应,先检查 query.answer()是否被调用,这是必须步骤。

备用方案:

  • 如果不想写代码,可以使用第三方无代码平台如 ManybotChatfuel,它们提供图形化界面添加按钮,但功能有限且需要将机器人授权给第三方。
  • 也可以使用 Telegram Bot API直接发送HTTP请求(如用curl或Postman),但手动构造JSON较繁琐。

验证结果:测试按钮功能是否正常

添加按钮后,必须通过实际点击来验证每个按钮是否达到预期效果。

具体操作说明:

1. 在Telegram中打开与机器人的对话,发送 /start命令,观察消息下方是否出现两行按钮:第一行“选项一”和“选项二”,第二行“访问官网”。

2. 点击“选项一”,检查机器人回复的消息是否变为“你点击了按钮: option1”;点击“选项二”同理。

3. 点击“访问官网”,检查是否在Telegram内置浏览器中打开了 https://example.com页面。

注意事项/小提示:

  • 内联按钮点击后,按钮本身不会消失,但消息内容会被 edit_message_text修改。如果你不希望修改消息,可以用 query.message.reply_text回复新消息。
  • 如果按钮点击后显示“加载中”然后无反应,可能是 CallbackQueryHandler未正确注册,检查代码中 dp.add_handler的顺序。
  • 测试时建议使用两个不同的Telegram账号(或一个账号的多个设备),避免自己点击自己机器人的回调出现奇怪问题。

备用方案:

  • 如果按钮未显示,检查Token是否正确,以及代码中 reply_markup参数是否传递给了 reply_textsend_message
  • 可以使用Telegram官方测试工具 @BotFather/setinline命令开启内联模式,但内联按钮与内联模式无关,不要混淆。

备用处理:按钮无响应或报错的排查方法

当按钮点击后出现错误或完全无响应时,需要系统排查。

具体操作说明:

1. 检查Python控制台输出的错误日志。常见错误包括:

- telegram.error.BadRequest: Message can't be edited:说明你尝试编辑的消息已经不存在或已被删除。

- telegram.error.TimedOut:网络连接问题,检查服务器是否能访问 api.telegram.org

2. 确认 callback_data是否唯一且不包含特殊字符(如中文或空格),建议只用英文、数字和下划线。

3. 检查机器人是否被用户屏蔽,或被群组管理员限制(在群组中机器人需要管理员权限才能发送按钮消息)。

注意事项/小提示:

  • 如果按钮点击后出现“该机器人已停止”提示,说明你的代码进程已崩溃,检查是否有语法错误或依赖库版本冲突。
  • 使用 python-telegram-bot时,版本差异较大(如v13与v20),请确保代码与库版本匹配。v20及以上版本使用 Application类替代 Updater,语法有变化。
  • 如果按钮数量过多(超过8个),建议分页或使用 InlineKeyboardButtonrow_width参数控制每行数量。

备用方案:

  • 如果代码完全无法运行,可以尝试使用最简单的测试脚本:直接通过浏览器访问 https://api.telegram.org/bot<你的Token>/sendMessage?chat_id=<你的用户ID>&text=测试&reply_markup={"inline_keyboard":[[{"text":"按钮","callback_data":"test"}]]},手动发送带按钮的消息验证API是否正常。
  • 如果依然失败,可能是Token被泄露导致机器人被他人滥用,立即在BotFather中生成新Token。

常见问题补充

问:按钮可以添加多个页面或动态内容吗?

答:可以。通过 callback_data携带状态信息,在 button_callback中根据 query.data更新键盘布局。例如,点击“下一页”时重新生成新的 InlineKeyboardMarkup并调用 query.edit_message_reply_markup

问:为什么我的按钮在手机上显示正常,在电脑端显示不全?

答:Telegram桌面端和移动端的按钮渲染略有差异。建议每行按钮不超过3个,且文本尽量简短(不超过20个字符)。如果按钮文字过长,会自动换行,影响美观。

问:按钮点击后可以发送图片或文件吗?

答:可以。在 button_callback中调用 query.message.reply_photo(photo=open('image.jpg','rb'))context.bot.send_document(chat_id=query.message.chat_id, document=open('file.pdf','rb'))。但注意,不能直接通过按钮触发文件发送,必须通过回调函数主动发送。

问:如何让按钮只出现一次,点击后消失?

答:在 button_callback中调用 query.edit_message_reply_markup(reply_markup=None)即可清除按钮。或者直接删除消息:query.message.delete()

总结:给Telegram机器人添加按钮的核心在于使用 InlineKeyboardMarkup构建按钮列表,并通过 CallbackQueryHandler处理点击回调;牢记 query.answer()是必须调用的步骤,否则按钮会卡死。