我如何让我的机器人用参数回应?

How do I have my Bot respond with arguments?

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

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

我试过 Markdown 格式:[/info 123](/info 123),但并不愉快。这可能吗?

我已经就同样的问题联系了@BotSupport,he/they/it 迅速回复了以下答案:

Hi, at the moment it is not possible to highlight parameters of a command. I any case, you may can find a workaround if you use correct custom keyboards ;) — @BotSupport

自定义键盘可能适合某些人,但不适合我。我寻求的解决方案是将命令作为 /info123。当机器人收到所有 / 命令时,我检查收到的命令是否以 info 开头,如果是,我删除 info 部分。我将剩余的 string/int 转换为参数,并将其传递给相关命令。

如果您打算将 123 作为参数传递给您的命令 info,并且您碰巧使用了 python-telegram-bot,那么您可以这样做:

dispatcher.add_handler(CommandHandler('hello', SayHello, pass_args=True))

根据文档:pass_args 确定是否应将传递给命令的参数作为名为 args 的关键字参数传递给处理程序。它将包含一个字符串列表,即 命令后的文本拆分为单个或连续的空格 字符。默认为 False。

您可以使用 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将return120
/info_007 将 return 007

更新
对于较新的版本,您可以改用此方法!

MessageHandler(Filters.regex(r'pattern'), callback)

这是根据用户输入创建 kwargs 的一种相当基本的方法。

不幸的是,它确实要求用户了解可用作参数的字段,但如果您可以在用户未提供任何可检测到的 kwarg 样式消息时提供信息性响应,那么您可能会获得更好的体验.

正如我所说,这是一个非常初级的想法,使用可用的正则表达式过滤器可能会更快地实现它。这在检查 "pesky" 品种的用户输入时会更加可靠。

脚本依赖于命令前面的 || 定界符,如图所示 trim 任何额外的字符,如换行符和空格

您可以删除 commit 的额外检查,因为提供此检查是为了告诉机器人您要明确地将您的输入保存到数据库中。

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

要获取命令的参数,您甚至不需要像 you can simply get it from context.args look at Github page 所说的那样使用 pass_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))

强制回复

Upon receiving a message with this object, Telegram clients will display a reply interface to the user (act as if the user has selected the bot's message and tapped 'Reply'). This can be extremely useful if you want to create user-friendly step-by-step interfaces without having to sacrifice privacy mode.

一个简单的镜头

在这种情况下,用户应该使用/audio命令发送一个有效号码(例如/audio 3,如果他们忘记了,我们可以通知并强制他们这样做。

来源:
https://core.telegram.org/bots/api#forcereply