如何从 Slack 获取用户 ID 到机器人服务
How to get the user id from Slack to bot service
我正在使用 Azure LUIS 创建一个简单的机器人,这是我的第一个机器人。在做了一些研究后我取得了一些不错的进展,现在还与 Slack 集成作为测试它的渠道。
机器人功能运行良好,但我想要识别用户。这样我就可以个性化机器人对话,还可以从他的个人资料中提取用户特定信息 table。
我是否可以获取 slack 用户的 UID 或任何参考 ID,以便将其与用户配置文件一起存储在我的用户 table 中?
所以下次,当用户问候机器人时,机器人可以说 "Hello, John." 而不是只说 "Hello."
谢谢!
是的。您可以使用 channelData 对象获取 ApiToken
和 user
值。例如,在 C# 中,您可以使用 turnContext.Activity.ChannelData
来获取 JSON:
中的那些值
{{
"SlackMessage": {
"token": "............",
"team_id": "<TEAM ID>",
"event": {
"type": "message",
"text": "thanks",
"user": "<USER WHO MESSAGED>",
"channel": "............",
"channel_type": "channel"
},
"type": "event_callback",
"event_id": ""............",
"event_time": 1553119134,
"authed_users": [
"............",
"<USER WHO MESSAGED>"
]
},
"ApiToken": "<ACTUAL TOKEN HERE>"
}}
然后,使用这两条信息,您就可以从 Slack 中检索信息。
https://slack.com/api/users.info?token=<ACTUAL TOKEN HERE>&user=<USER WHO MESSAGED>&pretty=1
并获得包含您需要的信息的回复:
{
"ok": true,
"user": {
"id": "<USER WHO MESSAGED>",
"team_id": "<TEAM ID>",
"real_name": "Dana V",
理想情况下,您可能希望设置机器人用户状态并首先检查,如果不存在,则对 Slack 进行 API 调用,然后存储在状态中。因此,进一步的请求不需要转到 Slack,而只会从状态存储中提取。
基本上,您 could/should 在 onTurn 事件中执行此操作。首先,创建您的用户状态存储,例如 here.
然后您可以检查该值并在未填充时写入该值。 This example 简单的提示,可能会有帮助。您不需要像本例那样提示您输入用户名,但是 read/write username from state。您仍然可以使用对话框,但是您不需要它们来进行名称提示,因为您正在动态地这样做。
您可以看到 here where username is being set and here 检索的位置。在这种情况下,它在对话框中,但又一次;你 would/could 只需在回合上下文中执行(使用逻辑获取,如果不存在,则设置)。
我通过打印整个会话对象找到了解决方案,该对象具有所有必需的信息。这可能和上面Dana提到的一样,但是经过调试,下面没有做任何更改就变得简单了。
var slackID = session.message.address.user.id
通过以上,我能够识别用户。
谢谢。
我正在使用 Azure LUIS 创建一个简单的机器人,这是我的第一个机器人。在做了一些研究后我取得了一些不错的进展,现在还与 Slack 集成作为测试它的渠道。
机器人功能运行良好,但我想要识别用户。这样我就可以个性化机器人对话,还可以从他的个人资料中提取用户特定信息 table。
我是否可以获取 slack 用户的 UID 或任何参考 ID,以便将其与用户配置文件一起存储在我的用户 table 中?
所以下次,当用户问候机器人时,机器人可以说 "Hello, John." 而不是只说 "Hello."
谢谢!
是的。您可以使用 channelData 对象获取 ApiToken
和 user
值。例如,在 C# 中,您可以使用 turnContext.Activity.ChannelData
来获取 JSON:
{{
"SlackMessage": {
"token": "............",
"team_id": "<TEAM ID>",
"event": {
"type": "message",
"text": "thanks",
"user": "<USER WHO MESSAGED>",
"channel": "............",
"channel_type": "channel"
},
"type": "event_callback",
"event_id": ""............",
"event_time": 1553119134,
"authed_users": [
"............",
"<USER WHO MESSAGED>"
]
},
"ApiToken": "<ACTUAL TOKEN HERE>"
}}
然后,使用这两条信息,您就可以从 Slack 中检索信息。
https://slack.com/api/users.info?token=<ACTUAL TOKEN HERE>&user=<USER WHO MESSAGED>&pretty=1
并获得包含您需要的信息的回复:
{
"ok": true,
"user": {
"id": "<USER WHO MESSAGED>",
"team_id": "<TEAM ID>",
"real_name": "Dana V",
理想情况下,您可能希望设置机器人用户状态并首先检查,如果不存在,则对 Slack 进行 API 调用,然后存储在状态中。因此,进一步的请求不需要转到 Slack,而只会从状态存储中提取。
基本上,您 could/should 在 onTurn 事件中执行此操作。首先,创建您的用户状态存储,例如 here.
然后您可以检查该值并在未填充时写入该值。 This example 简单的提示,可能会有帮助。您不需要像本例那样提示您输入用户名,但是 read/write username from state。您仍然可以使用对话框,但是您不需要它们来进行名称提示,因为您正在动态地这样做。
您可以看到 here where username is being set and here 检索的位置。在这种情况下,它在对话框中,但又一次;你 would/could 只需在回合上下文中执行(使用逻辑获取,如果不存在,则设置)。
我通过打印整个会话对象找到了解决方案,该对象具有所有必需的信息。这可能和上面Dana提到的一样,但是经过调试,下面没有做任何更改就变得简单了。
var slackID = session.message.address.user.id
通过以上,我能够识别用户。
谢谢。