为什么用户和具有消息历史记录的应用程序机器人之间的 1:1 DM 的 "last_read" 属性 为零?
Why is the "last_read" property zero for a 1:1 DM between a user and an app bot with message history?
我正在设置一个 Slack 应用程序以通过网络 post 消息 API 并使用来自 ASP.NET 网络应用程序的机器人 OAuth 令牌,其中一项要求是让 Slack 应用程序能够 return 一个相关值,表示用户最后一次使用 Slack 机器人在他们的 DM 中阅读他们的消息。这是为了跟踪哪些邮件需要更新或重新posting。
起初我认为您可以使用 conversations.info 方法发送请求以从 JSON 响应中获取 "last_read" 属性。如果我在请求与令牌相关联的用户打开的任何直接消息时使用用户 OAuth 令牌(带有 "xoxp-..."),我将得到一个值,例如“1571423219851.000000”毫秒。
但是当我使用 bot 令牌(使用 "xoxb-...")向用户检查 DM 时,它会将 "last_read" 字段设为零。
重现问题的步骤是:
- 让 Slack App 通过 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"
}
发送消息以使用 DM id 传播消息 window。
https://api.slack.com/methods/chat.postMessage/test
使用机器人令牌和 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),尽管 在直接消息中有消息历史记录,并且已确认 "Mark read" 新消息/实际打开聊天记录并向下滚动新消息。
怀疑是使用用户 OAuth 令牌将 return 一个相关的 last_read 值,因为用户自己将在给定对话中设置 last_read 时间戳,而 Slack 机器人不会永远不要为他们参与的对话设置 "last_read" 字段(即用户不需要知道机器人本身最后一次阅读聊天的时间?)。如果情况确实如此,那么为什么使用机器人令牌无法在他们的 DM 中看到用户 last_read 字段的设置值?这就是这个问题的来源(以及混乱)。
这可能是一个不正确的理论,但 Slack 文档似乎没有解决这个问题,因此欢迎任何建议。
编辑:仔细查看文档后,似乎 im 的子方法家族没有 im.info 的概念,因此为 dm 设置了默认值 0。
正如文档中关于 channel types 的 last_read
属性所述:
last_read
is the timestamp for the last message the calling user has
read in this channel
如果您使用 bot 令牌调用 conversations.history
那么调用用户就是 bot 用户,显然还没有阅读任何消息。
所以这不是错误,而是按预期工作。
我正在设置一个 Slack 应用程序以通过网络 post 消息 API 并使用来自 ASP.NET 网络应用程序的机器人 OAuth 令牌,其中一项要求是让 Slack 应用程序能够 return 一个相关值,表示用户最后一次使用 Slack 机器人在他们的 DM 中阅读他们的消息。这是为了跟踪哪些邮件需要更新或重新posting。
起初我认为您可以使用 conversations.info 方法发送请求以从 JSON 响应中获取 "last_read" 属性。如果我在请求与令牌相关联的用户打开的任何直接消息时使用用户 OAuth 令牌(带有 "xoxp-..."),我将得到一个值,例如“1571423219851.000000”毫秒。
但是当我使用 bot 令牌(使用 "xoxb-...")向用户检查 DM 时,它会将 "last_read" 字段设为零。
重现问题的步骤是:
- 让 Slack App 通过 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"
}
发送消息以使用 DM id 传播消息 window。 https://api.slack.com/methods/chat.postMessage/test
使用机器人令牌和 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),尽管 在直接消息中有消息历史记录,并且已确认 "Mark read" 新消息/实际打开聊天记录并向下滚动新消息。
怀疑是使用用户 OAuth 令牌将 return 一个相关的 last_read 值,因为用户自己将在给定对话中设置 last_read 时间戳,而 Slack 机器人不会永远不要为他们参与的对话设置 "last_read" 字段(即用户不需要知道机器人本身最后一次阅读聊天的时间?)。如果情况确实如此,那么为什么使用机器人令牌无法在他们的 DM 中看到用户 last_read 字段的设置值?这就是这个问题的来源(以及混乱)。
这可能是一个不正确的理论,但 Slack 文档似乎没有解决这个问题,因此欢迎任何建议。
编辑:仔细查看文档后,似乎 im 的子方法家族没有 im.info 的概念,因此为 dm 设置了默认值 0。
正如文档中关于 channel types 的 last_read
属性所述:
last_read
is the timestamp for the last message the calling user has read in this channel
如果您使用 bot 令牌调用 conversations.history
那么调用用户就是 bot 用户,显然还没有阅读任何消息。
所以这不是错误,而是按预期工作。