在Telegram生态中,机器人(Bot)是提升效率、实现自动化的重要工具,而自定义命令则是与机器人交互最直接、最常用的方式。通过合理设置自定义命令,你可以让机器人快速响应特定指令,完成查询、管理、通知等任务,大幅减少重复操作。然而,许多用户对如何创建和管理自定义命令并不熟悉,甚至误以为命令只能使用官方预设。本文将带你从头掌握Telegram机器人自定义命令的完整知识,从最基础的BotFather设置到代码中的高级处理,一次全部讲透。
一、什么是Telegram机器人自定义命令?
自定义命令是指以斜杠/开头、由机器人开发者预先定义并注册的指令。例如,常见的/start、/help,或者你自己设定的/check、/report。当用户在聊天中输入这些命令时,机器人会收到相应的Update消息,并执行对应的逻辑。
自定义命令的核心价值在于:
- 快速触发:无需输入完整句子,一个斜杠命令即可唤起特定功能。
- 直观易记:简短、有意义的命令比复杂操作更易被用户接受。
- 自动获取参数:可在命令后附加参数,让命令更灵活。
二、准备工作:创建机器人和获取Token
在设置自定义命令之前,你需要拥有一个机器人。如果还没有,请按以下步骤操作:
- 在Telegram中搜索@BotFather(官方机器人之父)。
- 发送
/newbot,按提示为机器人起名和设置用户名(必须以bot结尾)。 - 创建成功后,BotFather会返回一个HTTP API Token,类似
123456:ABC-DEF...。这个令牌是机器人API的通行证,务必妥善保存。
如果你已有机器人,但忘记Token,可以在BotFather中发送/mybots,选择对应机器人后点击API Token查看。
三、使用BotFather设置自定义命令
设置命令的最标准方式是通过BotFather的/setcommands指令。这样做的好处是:用户在与机器人聊天时,输入/即可看到命令列表和说明,非常友好。
实操步骤:
- 向BotFather发送
/setcommands,然后选择目标机器人。 - 输入命令列表,格式为:
command1 - 描述1
command2 - 描述2
...
例如:
start - 开始使用
help - 帮助信息
status - 查看当前状态
注意:
- 命令必须为小写字母、数字或下划线,不能包含空格。
- 描述与命令之间用
-分隔(短横线两侧有空格)。 - 也可以使用
/setcommands后直接发送JSON格式的数组,但普通格式即可满足多数需求。
设置完成后,用户在聊天框中输入/,就会看到你定义的命令及描述。值得注意的是,Telegram官方规定命令本身只能使用拉丁字符,但描述可以使用中文,用户理解起来没有问题。
四、在代码中处理自定义命令
光设置命令列表还不够,真正要执行需要编写代码。以最流行的Python库python-telegram-bot为例,处理命令非常简单。
首先安装库:
pip install python-telegram-bot
示例代码:
from telegram.ext import Application, CommandHandler, ContextTypes
from telegram import Update
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text("欢迎使用自定义命令教程机器人!")
async def status(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text("系统运行正常。")
def main():
app = Application.builder().token("YOUR_TOKEN").build()
app.add_handler(CommandHandler("start", start))
app.add_handler(CommandHandler("status", status))
app.run_polling()
if __name__ == "__main__":
main()
要点说明:
Application是机器人应用的核心,通过builder()配置Token。CommandHandler将命令名称与回调函数绑定。- 回调函数需要定义为
async,并接收update和context两个参数。
这样,当用户发送/start或/status时,机器人就会自动触发对应函数并回复消息。
五、进阶技巧:命令参数与权限控制
1. 接收命令参数
在很多场景中,命令需要携带参数,比如/subscribe 123。通过context.args可以获取所有参数(以空格分隔的列表)。
async def subscribe(update: Update, context: ContextTypes.DEFAULT_TYPE):
args = context.args
if args:
await update.message.reply_text(f"已订阅参数:")
else:
await update.message.reply_text("请提供参数,如:/subscribe 123")
也可以直接解析update.message.text,但建议使用context.args,更省心。
2. 权限控制
有些命令只允许群组管理员使用,或者只允许特定用户。你可以在回调函数中检查用户身份。
from telegram import ChatMember
async def admin_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
user = update.effective_user
chat = update.effective_chat
member = await chat.get_member(user.id)
if member.status in (ChatMember.ADMINISTRATOR, ChatMember.OWNER):
await update.message.reply_text("你有管理员权限,可以执行此命令。")
else:
await update.message.reply_text("抱歉,仅管理员可使用此命令。")
这里使用了chat.get_member()获取成员信息,并根据状态判断权限。还可以用更精确的权限检查,比如BotCommandScope来按场合显示命令,但那是更复杂的主题。
六、常见问题与解决方案
Q1:为什么我设置了命令列表,但机器人没反应?
可能原因:代码中没有注册对应的CommandHandler;或Token错误;或机器人未运行。请逐一检查。
Q2:命令支持中文吗?
Telegram API规定命令必须由字母、数字和下划线组成,且不区分大小写(但官方推荐小写)。因此命令本身不支持中文,但命令描述可以写中文,用户看到的菜单说明就是中文。
Q3:如何删除命令?
向BotFather发送/setcommands,选择机器人,然后输入delete(或直接清空列表)即可移除全部命令。也可以只保留要保留的命令,覆盖列表。
Q4:能否在不同的聊天中显示不同的命令?
可以。使用BotFather的/setcommands时,选择机器人后,Telegram会询问作用域,可选默认、群组、频道或私聊。但代码层面需要配置BotCommandScope,属于进阶用法。
总结
自定义命令是Telegram机器人的基础也是核心功能,掌握它可以让你迅速构建出实用、高效的交互工具。本文从BotFather设置命令列表,到Python代码实现处理,再到参数和权限控制,给出了完整的操作路线。希望你能动手实践,根据自己的需求打造属于你的机器人命令。如果遇到问题,欢迎在评论区留言交流。