我想让我的Telegram机器人根据机器人问的最后一个问题来处理用户输入。基本上,流程如下:
- 用户调用/验证命令
- Bot请求电子邮件
- 用户发送其电子邮件
- Bot会回复一条消息,告诉用户要发送一个代码到用户的电子邮件中进行确认,并要求用户在聊天中键入代码
- 用户键入代码
- Bot验证用户代码,用户通过身份验证并开始接收通知
问题是:我如何知道用户正在回答此流中的特定bot问题?
我想到了两种方法:
- 发送带有强制回复选项的消息,这样用户就必须回复机器人的问题。这会把用户正在回复的消息发送给我,这样我就可以比较机器人消息字符串,看看答案是什么。
- 将最后一条机器人消息存储在某个地方,然后当消息到达时,检查最后一条机器人消息是什么,并假设用户消息是响应。
有更好的方法吗?我正在使用telegrambots library的Java。
3条答案
按热度按时间zphenhs41#
开发电报机器人时最流行的任务之一。
有一个解决方案,你需要安装shapoapps/multibot_driver包( composer 需要shapoapps/multibot_driver)为Laravel.
这个软件包有一个会话管理器,类似于网页用户的会话。在每个用户消息之后,你在服务器端记录用户输入到会话中的内容。当收到每个新的请求(消息)时,你从会话中读取数据并建立逻辑。
以下是文档-https://github.com/shapoapps/multibot_driver
kiayqfof2#
由于很难找到能引导我找到解决方案的想法(在Java中),为了未来的Java Google用户,我将在这里分享我的想法。
实现此流程的最佳方法是在数据库中保存状态。要做到这一点,**使用消息的唯一聊天ID来区分一个聊天与另一个聊天。
下面是Java实现的相关部分(逻辑几乎适用于任何语言):
保存与系统用户相关的电报聊天信息的实体。
表示所有可能的bot响应(状态)的枚举。
接收消息并作出相应响应的服务。
实现的流程为:
1.用户发送/验证。
1.系统对设备一无所知,因此存储聊天ID和最后状态。**最后状态将是对用户的响应。**系统要求提供用户的电子邮件。
1.用户发送电子邮件。
1.文本未被识别为命令,因此系统检查是否存在与此聊天ID相关的最后一个状态。如果存在前一个状态,则使用传入文本作为此状态的方法的参数。系统将代码发送到用户的电子邮件并请求它。
1.用户发送代码。
1.系统再次检查先前状态,如果代码正确,则验证用户。
就这样!希望能帮上忙。
9lowa7mx3#
通常,为了明确您要发送给电报机器人的内容,您可以使用命令与机器人进行通信(电报命令以/开头,每个命令在服务器端都有一个特定的命令处理程序),不幸的是,到目前为止还没有办法将额外的参数与命令沿着发送给电报机器人,您可以使用下面对话中提到的一种解决方法:How do I have my Bot respond with arguments?
如果您不熟悉使用java的bot命令,请参考以下示例:https://www.programcreek.com/java-api-examples/?api=org.telegram.telegrambots.bots.AbsSender
希望这能帮上忙。