我如何让我的 Bot 以争论回应?

Posted

技术标签:

【中文标题】我如何让我的 Bot 以争论回应?【英文标题】:How do I have my Bot respond with arguments? 【发布时间】:2016-07-03 17:50:25 【问题描述】:

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

/list /info 123

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

我已经尝试对其进行 Markdown 处理:[/info 123](/info 123),但没有任何乐趣。这可能吗?

【问题讨论】:

给我们看一些代码。 【参考方案1】:

我已经向@BotSupport 提出了同样的问题,他/他们/它迅速回复了以下答案:

您好,目前无法突出显示命令的参数。无论如何,如果您使用正确的自定义键盘,您可能会找到解决方法;) — @BotSupport

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

【讨论】:

感谢您的回答,但是您如何检查命令名称,我正在尝试找到一种方法来捕获所有命令然后解析它们。谢谢! @com 这完全取决于您使用的框架。 @ortonomy 不,你没有。向 BotFather 注册命令只会在有人键入“/”时将它们作为列表显示在用户界面上,但您可以实现未列出的命令 - 只是不要在 BotFather 中注册它们。无论如何,您的机器人都会回答命令。【参考方案2】:

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

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

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

【讨论】:

我明白你在说什么 - 但如果你通过命令列表向用户提供反馈,你不能突出显示或使完整的 /info 123 可点击。只有/info 会突出显示并因此发送。 @Mave 所以你想要一个所有可能参数的列表,硬编码以便当用户点击聊天中的/ 图标时它们会出现?我相信做到这一点的唯一方法是将它们实际硬编码为单独的命令,并在参数之间使用分隔符,例如/info_123/info_456。这些实际上应该出现在下拉列表中,但它们实际上并不接受参数,它们只是两个不同的命令,它们使用不同的参数调用相同的底层方法。【参考方案3】:

您可以使用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

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

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

【讨论】:

啊,公平点,这也是一个很好的方法!谢谢:)。【参考方案4】:

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

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

正如我所说,这是一个非常初级的想法,使用可用的正则表达式过滤器可能会更快地实现。当检查来自“讨厌”的用户的输入时,这会更加可靠。

脚本依赖于命令前面的|| 分隔符,如图所示,它将修剪任何额外的字符,如换行符和空格

您可以删除对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

【讨论】:

【参考方案5】:

要获取命令的参数,您甚至不需要使用pass_args,如Moein 所说,您可以简单地从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))

【讨论】:

【参考方案6】:

强制回复

收到带有此对象的消息后,Telegram 客户端将向用户显示回复界面(就像用户选择了机器人的消息并点击了“回复”一样)。如果您想在不牺牲隐私模式的情况下创建用户友好的分步界面,这将非常有用。

一个简单的镜头

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

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

【讨论】:

以上是关于我如何让我的 Bot 以争论回应?的主要内容,如果未能解决你的问题,请参考以下文章

如何让我的 Discord Bot 用 Ja​​vascript 编写以更快地发送消息?

对于Web3.0是否需要区块链的争论

'呼叫中的额外争论'

和产品争论MySQL底层如何实现order by的,惨败!

Aop和Mono争论

如何让我的 Discord Bot 提及我提及的人?