将 Slack 用户 ID 作为channel 传递的能力在某种程度上是chat.postMessage 独有的。如果您尝试使用其他仅需要通道 ID (conversations.info) 的 API 方法,您将获得 "error": "channel_not_found"。文档状态:
在用户的应用主页中开始对话
在您的App Home 中与用户开始对话。
启用chat:write 范围后,调用chat.postMessage 并将用户ID (U0G9QF9C6) 作为channel 的值传递到该用户的App Home 频道。您可以改用他们的直接消息频道 ID(例如,im.open)。
来源:https://api.slack.com/methods/chat.postMessage#app_home
注意:上述行为假设您使用的是机器人令牌。如果您改为提供用户令牌,您将自己制作用户 DM。
现在,如果您*确实*需要获取用户的 App Home 频道 ID 以在 chat.postMessage 之外使用,请继续阅读...这里有三种方法,每种方法都有自己的自己的缺点:
1。 chat.postMessage
嗯,值得一提的是,如果您要使用chat.postMessage,它会在其响应中返回已解析的频道ID:"channel": "D01234ABCDE"。您可以将其保存以备后用。
2。 conversations.open
上述文档中引用的API方法im.open已重命名为conversations.open,可用于获取用户的App Home频道ID:
- 使用用户令牌,并将
users 设置为应用程序机器人 ID,或者
- 使用 bot 令牌,并将
users 设置为用户 ID。
不过,我发现 conversations.open 有一些奇怪之处,这对您来说可能会或可能不会破坏交易:
- 它需要比
chat.postMessage 用户发起私人 DM 所需的更强大的 OAuth 权限范围(chat:write 的机器人令牌是不够的),并且
- 它可能会以某种方式结束打开一个已经打开的对话...
- 我使用用户令牌测试了此方法。
- 该令牌的用户已经拥有应用程序的 DM 频道! (那不是说对话已经开始了吗?)
- 奇怪的是,第一个回复有
is_opened: false(随后的回复有is_opened: true)。
3。 app_home_opened
当用户打开您的 App Home 时会触发事件 app_home_opened。如果您处理此事件,则可以将 channel 保存在服务器上的事件负载中并稍后使用,无需稍后调用 conversations.open。
由于该事件仅在用户打开您应用的应用主页时发生,因此这种方法更多的是一种优化,而不是一种独立的解决方案。
4。更好的方法...?
由于上述缺点,如果有人知道为 Slack 用户获取 App Home 频道 ID 的更好方法,请对此答案发表评论!