为什么我的第一条机器人消息(通过 REST API)显示在我的第一条线程消息之前?

Why is my first bot message (via REST API) shown before my first thread message?

我正在开发一个聊天机器人,它会根据用户的问题 return 某条信息。获取此信息的过程可能需要几秒钟,我想确保用户知道这一点。

因此,我使用此 中的建议,并且 return 通过 REST API 通过服务帐户发送的第一条消息。

第二个机器人消息然后通过正常实现。我正在使用 basic bot here 中的模板,部署到 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

因此,event types 是:

  • 未指定
  • 留言
  • 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})