所以我构建了一个Telegram bot,它可以接收以下命令:
/list
/info 123
这很好用,因为我可以捕获/info
并将其他参数作为int传递。但遗憾的是,Telegram客户端并未将/info 123
视为完整命令,而只是/info
部分。有没有办法让它将整个命令识别为命令?
我试过Markdown-it it:[/info 123](/info 123)
,但没有快乐。这可能吗?
答案 0 :(得分:7)
我已经用同样的问题联系了@BotSupport,他/他/它迅速回应了以下答案:
嗨,目前无法突出显示命令的参数。无论如何,如果您使用正确的自定义键盘,您可以找到解决方法;) - @BotSupport
自定义键盘可能是某人的选择,但不适合我。我所采用的解决方案是将命令命名为/info123
。当僵尸程序收到所有/
命令时,我会检查收到的命令是否以info
开头,如果是,则删除info
部分。我将剩余的字符串/ int转换为参数,并将其传递给相关的命令。
答案 1 :(得分:2)
您可以使用RegexHandler()进行此操作。
这是一个示例
def info(bot, update):
id = update.message.text.replace('/info_', '')
update.message.reply_text(id, parse_mode='Markdown')
def main():
updater = Updater(TOKEN)
updater.dispatcher.add_handler(RegexHandler('^(/info_[\d]+)$', info))
updater.start_polling()
用法
命令/info_120
将返回120
并且/info_007
将返回007
答案 2 :(得分:1)
如果您的意思是将123
作为命令info
的参数传递,如果您碰巧使用python-telegram-bot,那么这就是您的操作方法:
dispatcher.add_handler(CommandHandler('hello', SayHello, pass_args=True))
根据文档:pass_args
确定是否应将处理程序作为名为args
的关键字参数传递给命令的参数传递。它将包含一个字符串列表,这是在单个或连续的空格字符上拆分命令后的文本。默认值为False。
答案 3 :(得分:0)
这是从用户输入创建kwarg的基本方法。
不幸的是,它确实要求用户注意可用作参数的字段,但是如果在用户不提供任何可检测到的kwarg样式消息时可以提供有用的响应,则可能会带来更好的体验。 / p>
正如我所说,这是一个非常基本的想法,并且可能会通过可用的正则表达式过滤器更快地实现。当检查“讨厌”用户的输入时,这将更加可靠。
该脚本依赖于命令前的||
分隔符,如图所示,它将修剪掉任何多余的字符,例如换行和空格
您可以删除commit
的多余支票,因为它是为了告诉bot您想要将输入明确保存到数据库中。
def parse_kwargs(update):
commit = False
kwargs = {}
if update.message:
for args in update.message.text.split('||')[1:]:
for kw_pair in args.split(','):
key, value = kw_pair.split('=')
if key.strip() != 'commit':
kwargs[key.strip()] = value.strip()
elif key.strip() == 'commit' and value.strip().lower() == 'true':
commit = True
return kwargs, commit
答案 4 :(得分:0)
要获取命令的参数,您甚至不需要像Moein那样使用pass_args
,只需从context.args
看一下Github page就可以得到它。因此,您可以根据需要传递任意数量的参数,您将获得一个参数列表!这是来自Github的示例。
def start_callback(update, context):
user_says = " ".join(context.args)
update.message.reply_text("You said: " + user_says)
...
dispatcher.add_handler(CommandHandler("start", start_callback))