使用pyTelegramBotAPI开发Telegram机器人时如何分离命令与消息其余内容
pyTelegramBotAPI 分离命令与参数的实现方案
针对/set first_name, last_name这类带参数的命令,有三种常用的实现方式可以分离/set命令与后续内容:
1. 空格分割法
最通用的简单方案,按第一个空格将整段消息分割为命令和参数两部分:
full_text = message.text.strip() # maxsplit=1 保证参数部分的空格不会被分割 parts = full_text.split(maxsplit=1) command = parts[0] # 输出为 /set params = parts[1] if len(parts) > 1 else "" # 输出为 first_name, last_name,无参数时为空字符串
如果只需要移除命令部分,直接取params即可。
2. 前缀替换法
适合明确触发的是/set命令的场景,还可以兼容命令带机器人后缀的情况(比如/set@your_bot_name):
full_text = message.text.strip() bot_username = bot.get_me().username # 依次移除命令前缀和可能存在的机器人后缀,再去除首尾空格 params = full_text.removeprefix("/set").removeprefix(f"@{bot_username}").strip()
如果使用Python 3.9以下版本,没有removeprefix方法,可以用切片实现:
full_text = message.text.strip() if full_text.startswith("/set"): params = full_text[4:].strip() # 处理带机器人后缀的情况 if params.startswith("@"): params = params.split(maxsplit=1)[1].strip() if " " in params else ""
3. 内置实体识别法
利用Telegram消息自带的命令实体识别,准确性最高,不会误判消息正文中其他位置出现的/set字符串:
full_text = message.text.strip() params = "" if message.entities: for entity in message.entities: if entity.type == "bot_command": command = full_text[entity.offset : entity.offset + entity.length] # 匹配/set命令和带机器人后缀的/set命令 if command == "/set" or command.startswith("/set@"): # 截取命令结束位置之后的所有内容作为参数 params = full_text[entity.offset + entity.length :].strip() break
单命令固定场景用替换法最便捷,通用多命令场景用分割法开发效率最高,需要高精度识别命令的场景用实体法最稳妥。
内容的提问来源于stack exchange,提问作者Wardah Aftab
相关产品推荐
相关产品推荐

