首页 > 解决方案 > 为什么用户和具有消息历史记录的应用程序机器人之间的 1:1 DM 的“last_read”属性为零?

问题描述

我正在设置一个 Slack 应用程序以通过 Web API 发布消息并使用来自 ASP.NET Web 应用程序的机器人 OAuth 令牌,其中一个要求是 Slack 应用程序能够返回一个相关值用户上次使用 Slack 机器人阅读他们在 DM 中的消息。这是为了跟踪哪些消息需要更新或重新发布。

起初,我认为您可以使用 conversations.info 方法发送请求,以从 JSON 响应中获取“last_read”属性。如果我在请求与该令牌关联的用户打开的任何直接消息的请求中使用用户 OAuth 令牌(带有“xoxp-...”),我会得到一个值,例如“1571423219851.000000”毫秒。

但是,当我使用机器人令牌(使用“xoxb-...”)向用户检查 DM 时,“last_read”字段将为零。

重现该问题的步骤是:

  1. 让 Slack 应用程序通过 conversations.open 方法打开与用户的直接消息(在这种情况下是我自己,因为用户 OAuth 令牌设置为我的帐户),提供机器人用户令牌和 users=(your_slack_id)。保存 DM id 以备后用。 https://api.slack.com/methods/conversations.open/test

"ok": true,
"no_op": true,
"already_open": true,
"channel": {
    "id": "DP4NRGLNE"
}
  1. 使用 DM id 发送消息以传播消息窗口。 https://api.slack.com/methods/chat.postMessage/test

  2. 使用 bot 令牌和 DM id 使用 conversations.info 方法进行测试。 https://api.slack.com/methods/conversations.info/test

但是,当我运行该方法时,我会得到这样的响应。

"ok": true,
"channel": {
    "id": "DP4NRGLNE",
    "created": 1571404761,
    "is_archived": false,
    "is_im": true,
    "is_org_shared": false,
    "user": "UN4F12QH7",
    "last_read": "0000000000.000000",
    "latest": {
        ...
    },
    "unread_count": 3,
    "unread_count_display": 3,
    "is_open": true,
    "priority": 0
}

预期: “last_read”字段设置为某个值,即“1571404761.000000”,unread_count 设置为 0。

实际: “last_read”字段仍设置为“0000000000.000000”(并且 unread_count 未重置为 0),尽管直接消息中有消息历史记录,并且已确认新消息的“标记为已读”/物理打开聊天日志并滚动在新消息上下来。

怀疑是使用用户 OAuth 令牌将返回相关的 last_read 值,因为用户自己将在给定对话中设置 last_read 时间戳,而 Slack 机器人不会为他们所属的对话设置“last_read”字段(即用户不需要知道机器人本身上次阅读聊天的时间?)。虽然如果是这样的话,那么为什么使用机器人令牌无法在他们的 DM 中看到用户的 last_read 字段的设置值?这就是这个问题的来源(以及混乱)。

这可能是一个不正确的理论,但 Slack 文档似乎没有解决这个问题,因此欢迎提出任何建议。

编辑:仔细查看文档后,似乎方法的子系列 im 没有 im.info 的概念,因此为 dm 设置了默认值 0。

标签: asp.netslackslack-api

解决方案


正如文档中有关通道类型last_read属性的说明:

last_read主叫用户在此频道中阅读的最后一条消息的时间戳

如果您使用 bot 令牌进行呼叫conversations.history,则调用用户是 bot 用户,显然尚未阅读任何消息。

所以这不是一个错误,而是按预期工作。


推荐阅读