python-3.x - 为什么我的第一条机器人消息(通过 REST API)显示在我的第一条线程消息之前?
问题描述
我正在开发一个聊天机器人,它将根据用户的问题返回某些信息。获取此信息的过程可能需要几秒钟,我想确保用户知道这一点。
因此,我使用此stackoverflow question中的建议,并通过服务帐户通过 REST API 返回第一条消息。
然后,第二条机器人消息通过正常实现。我在这里使用基本机器人的模板,部署到 Google Cloud App Engine。
这是我的代码片段:
@app.route("/", methods=["POST"])
def home_post():
"""Respond to POST requests to this endpoint.
All requests sent to this endpoint from Hangouts Chat are POST
requests.
"""
credentials = ServiceAccountCredentials.from_json_keyfile_name(
"credentials.json", scopes=SCOPES
)
http = httplib2.Http()
chat = discovery.build("chat", "v1", http=credentials.authorize(http))
event_data = request.get_json()
thread = event_data["message"]["thread"]
message = {"text": "Thanks for your question! Let me check :)", "thread": thread}
chat.spaces().messages().create(
parent=event_data["space"]["name"], body=message
).execute()
# doing something to find information requested by user
return json.jsonify({"text": "Here is my answer :)"})
一切都按预期工作,除了聊天中的第一条消息放在最初的机器人提及之前,第二条消息通过之后(如录音或屏幕截图所示)。
录音:https ://www.loom.com/share/c37472b703184965ad9ee649cb9f17bc
为什么会这样?我能做些什么来确保订单保持不变?
谢谢!
解决方案
您的代码正在运行onEvent
因此,事件类型为:
- 未指定
- 信息
- ADDED_TO_SPACE
- REMOVED_FROM_SPACE
- CARD_CLICKED
换句话说:
只需将机器人添加到聊天室就已经是一个会触发他发送消息的事件 - 甚至在提到机器人之前。
如何避免:
实现一个条件语句,在发送消息之前检查事件的类型。
样本:
if event_data['type'] == 'MESSAGE':
message = {"text": "Thanks for your question! Let me check :)", "thread": thread}
chat.spaces().messages().create(
parent=event_data["space"]["name"], body=message
).execute()
else:
return
无样品chat.spaces().messages().create
:
if event_data['type'] == 'MESSAGE':
message = "Thanks for your question! Let me check :)"
else:
return
return json.jsonify({'text': message})
推荐阅读
- vue.js - Vue.js 使用 CLI 命令安装,在我的命令提示符下收到一些错误,不明白那是什么
- java - 将recyclerview中的项目自动显示到另一个recyclerview?
- c# - 在 ASP.NET MVC 的报表查看器中加入 2 个表
- elixir - 如何使用 Ecto.Migration 约束仅强制一个字段
- angular - 如何将数据从一个组件获取到 mat-dialog-data 中的另一个子组件?
- java - 如何让 Scanner.next() 保留最后一个“\n”?
- windows - 无法创建看似简单的 stunnel 配置
- java - jsp中获取url参数
- reactjs - 无法在反应中添加if语句
- reactjs - 无法读取未定义的属性“地图”,为什么?