我如何让我的 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 以争论回应?的主要内容,如果未能解决你的问题,请参考以下文章