Python开发Telegram机器人如何将普通文本映射为带斜杠命令?
问题解决方法
报错根因
你新增的MessageHandler类本身没有内置command属性,只有CommandHandler实例才携带该属性。报错是因为你后续代码中存在遍历所有handler读取command属性的逻辑,遍历到MessageHandler时就会触发属性不存在的异常。
解决方案
- 第一步:优化正则匹配规则,覆盖大小写、别名场景,同时导入
re模块支持忽略大小写匹配
你要实现yes、Y、Yes、YES都触发/yes的逻辑,正则规则调整为:Filters.regex(r'^(yes|Y)$', re.IGNORECASE) - 第二步:解决
MessageHandler无command属性的问题,二选一即可:- 手动给
MessageHandler实例新增command属性,和对应CommandHandler的command值保持一致 - 调整你代码中遍历handler读取
command的逻辑,先判断handler类型,只有isinstance(handler, CommandHandler)为真时才读取command属性
- 手动给
- 第三步:调整键盘按钮文本,去掉斜杠即可实现不带斜杠的命令按钮
完整可运行代码示例
import re from typing import List, Union from telegram import KeyboardButton from telegram.ext import CommandHandler, MessageHandler, Filters # 调整后的键盘,直接用不带斜杠的展示文本 self._keyboard: List[List[Union[str, KeyboardButton]]] = [ ['Yes', 'No', 'Sure'], ['Absolutely', 'All right'] ] # 构造普通文本匹配的handler,手动加command属性 yes_msg_handler = MessageHandler(Filters.regex(r'^(yes|Y)$', re.IGNORECASE), self._yes) yes_msg_handler.command = 'yes' no_msg_handler = MessageHandler(Filters.regex(r'^(no|N)$', re.IGNORECASE), self._no) no_msg_handler.command = 'no' sure_msg_handler = MessageHandler(Filters.regex(r'^sure$', re.IGNORECASE), self._sure) sure_msg_handler.command = 'sure' absolutely_msg_handler = MessageHandler(Filters.regex(r'^absolutely$', re.IGNORECASE), self._absolutely) absolutely_msg_handler.command = 'absolutely' allright_msg_handler = MessageHandler(Filters.regex(r'^allright$', re.IGNORECASE), self._allright) allright_msg_handler.command = 'allright' handles = [ CommandHandler('yes', self._yes), CommandHandler('no', self._no), CommandHandler('sure', self._sure), CommandHandler('absolutely', self._absolutely), CommandHandler('allright', self._allright), # 加入普通文本匹配handler yes_msg_handler, no_msg_handler, sure_msg_handler, absolutely_msg_handler, allright_msg_handler ]
内容的提问来源于stack exchange,提问作者jamreg
相关产品推荐
相关产品推荐

