Telegram 我如何让我的机器人用参数响应?
因此,我构建了一个电报机器人,它可以接收以下命令:Telegram 我如何让我的机器人用参数响应?,telegram,telegram-bot,Telegram,Telegram Bot,因此,我构建了一个电报机器人,它可以接收以下命令: /list /info 123 这非常有效,因为我可以捕获/info并将附加参数作为int传递。但是,不幸的是,电报客户端并不把/info 123看作是一个完整的命令,而只是/info部分。有没有办法让它将整个命令识别为命令 我试着记下它:[/info 123](/info 123),但没有乐趣。这可能吗?我向@BotSupport提出了同样的问题,他/他们/it迅速给出了以下回答: 您好,目前无法突出显示命令的参数。在任何情况下,如果您使
/list
/info 123
/info
并将附加参数作为int传递。但是,不幸的是,电报客户端并不把/info 123
看作是一个完整的命令,而只是/info
部分。有没有办法让它将整个命令识别为命令
我试着记下它:
[/info 123](/info 123)
,但没有乐趣。这可能吗?我向@BotSupport提出了同样的问题,他/他们/it迅速给出了以下回答:
您好,目前无法突出显示命令的参数。在任何情况下,如果您使用正确的自定义键盘,您都可以找到解决方法;)
-@BotSupport
定制键盘可能是某人的选择,但不是我的选择。我所寻求的解决方案是以
/info123
的形式给出命令。当bot接收到所有/
命令时,我会检查接收到的命令是否以info
开头,如果是,我会删除info
部分。我将剩余的字符串/int转换为参数,并将其传递给相关的命令。如果要将123
作为命令info
的参数传递,并且如果您碰巧使用了,那么您可以这样做:
dispatcher.add_handler(CommandHandler('hello', SayHello, pass_args=True))
根据文档:pass\u args
确定是否应将作为名为args
的关键字参数传递给命令的参数传递给处理程序。它将包含一个字符串列表,该列表是命令拆分为单个或连续空格后的文本。默认值为False。您可以使用来执行此操作
下面是一个示例
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\u 120
将返回120
而
/info_007
将返回007
更新对于较新版本,您可以改用此方法
MessageHandler(Filters.regex(r'pattern'), callback)
这是从用户输入创建KWARG的一种相当基本的方法 不幸的是,它确实要求用户知道可以用作参数的字段,但是如果用户没有提供任何可检测的kwarg风格的消息时,您可以提供信息性响应,那么您可能会获得更好的体验 正如我所说,这是一个非常基本的想法,并且可能会在使用可用的正则表达式过滤器时更快地实现。当检查“讨厌”用户的输入时,这将更加可靠 脚本依赖于命令前面的分隔符
|
,如图所示,将修剪任何额外的字符,如新行和空格
您可以删除对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
要获取command的参数,您甚至不需要像前面所说的那样使用
pass_args
,只需从context.args
中获取即可。因此,您可以传递任意数量的参数,您将得到一个参数列表!下面是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))
给我们看一些代码。我明白你的意思-但是如果你用命令列表向用户提供反馈,你不能突出显示或使完整的
/info 123
可点击。只需突出显示并发送/info
。@Mave那么您想要一个所有可能参数的列表,硬编码以便用户单击聊天室上的/
图标时显示?我认为唯一的方法是将它们硬编码为单独的命令,并在参数之间使用分隔符,例如/info\u 123
或/info\u 456
。这些应该出现在下拉列表中,但它们实际上不接受参数,它们只是两个不同的命令,用不同的参数调用相同的基础方法。谢谢你的回答,但是如何检查命令名,我正在尝试找到一种方法捕获所有命令,然后解析它们。谢谢大家!@com,这一切都取决于您使用的框架。@或者我的不,您不需要。在BotFather中注册命令时,只有当有人键入“/”时,才能将命令作为列表显示在用户界面上,但您可以实现未列出的命令—只是不要在BotFather中注册它们。不管怎样,你的机器人都会响应命令。啊,说得好,这也是一个很好的方式!谢谢:)。