我如何让我的Bot回应参数?

时间:2016-03-17 11:42:48

标签: telegram telegram-bot

所以我构建了一个Telegram bot,它可以接收以下命令:

  • /list
  • /info 123

这很好用,因为我可以捕获/info并将其他参数作为int传递。但遗憾的是,Telegram客户端并未将/info 123视为完整命令,而只是/info部分。有没有办法让它将整个命令识别为命令?

我试过Markdown-it it:[/info 123](/info 123),但没有快乐。这可能吗?

5 个答案:

答案 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))