【问题标题】:Why is my first bot message (via REST API) shown before my first thread message?为什么我的第一条机器人消息(通过 REST API)显示在我的第一条线程消息之前?
【发布时间】:2020-12-04 01:45:08
【问题描述】:

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

因此,我使用来自 stackoverflow question 的建议,并通过服务帐户通过 REST API 返回第一条消息。

第二条机器人消息然后通过正常实现。我正在使用来自 basic bot here 的模板,部署到 Google Cloud App Engine。

这是我的代码的 sn-p:

@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

为什么会这样?我该怎么做才能确保订单保持不变?

谢谢!

【问题讨论】:

  • 请注意,这仅适用于房间。直接在 DM 中向机器人发送消息时,消息的顺序是正确的。

标签: python-3.x hangouts-chat hangouts-api google-chat


【解决方案1】:

您的代码正在运行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})

【讨论】:

  • 感谢@ziganotschka 的回答。请注意,在提到它之前,我已经将机器人添加到了房间。尽管如此,我还是编辑了我的代码以包含您建议的条件语句来检查事件类型。不幸的是,在我提到机器人的消息之前,通过 REST API 的第一条机器人消息仍在上升。
  • 如果创建一个消息你只是简单地返回它作为对事件的响应呢?请参阅我的更新答案。
  • 感谢@ziganotschka,但是机器人只发送一条消息。再次考虑我的用例。我希望机器人首先发送一条消息,上面写着“请等待我的回答”,然后做一些工作来获得答案,然后在第二条消息中发送该答案。这有意义吗?
  • 你能在本地机器上查看时间吗?只是为了排除您与触发机器人响应的脚本之间存在不同步。
  • 嗯,我不完全确定我理解为什么我的本地机器上的时间会对此产生任何影响。请注意,该脚本已部署到 Google Cloud,并且消息中的所有时间戳均采用 UTC 时区。我认为有趣的是,通过 REST API 的消息首先位于机器人提及的下方,然后在第二条消息之后向上移动(请参阅我上面发布的屏幕录像)。这是一种非常奇怪的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-13
  • 2015-11-05
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多