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中注册它们。不管怎样,你的机器人都会响应命令。啊,说得好,这也是一个很好的方式!谢谢:)。