【问题标题】:Where do I find the IDs needed for Bot Framework?在哪里可以找到 Bot Framework 所需的 ID?
【发布时间】:2021-09-03 05:54:47
【问题描述】:

在大多数情况下,用于 Bot Framework 的 ID 很容易找到,因为您会在用户发起联系时发送给机器人的“Activity”对象中收到它们。

但是,我正在尝试使用 Create Conversation 端点,这意味着我必须知道用户和机器人的 ID。

https://docs.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-connector-api-reference?view=azure-bot-service-4.0#create-conversation

这样的简化请求(有效!):

{
"bot": {
    "id": "28:4a4f500c-4897-4eaf-a364-c67942f41f6f"
},
"members":[{
    "id": "29:1DUjC5z4ttsBQa0fX2O7B0IDu30R_6SfPMhwj-E1BwWmvYzb_IElqJwzPDocwPxTS0j8clYeb8gZx67V8TuChbA"
}],
"tenantId": "c7392b95-d07b-4653-87a7-6c709f527c42"
}

我需要通过 Graph API 以某种方式找到用户 ID(成员 ID)?或者也许通过 Bot Framework API?但是怎么做呢?

此外,我还希望能够以编程方式找到 Bot ID,因为我将把这个 bot 部署到许多租户,它会大大简化配置。但是,我在哪里可以找到机器人 ID,即使是手动的?它看起来不像是来自 Azure 的 App Id 或 Object id。

(我理解28和29的前缀,所以这与我的问题无关)

更新:

从接受的答案中得到的关键点如下:

The userId is unique to your bot ID and a particular user. You cannot reuse the userId between bots. The channelId is global.

这意味着我无法指望在其他地方找到 userId,这是一条非常重要的信息。

When your app is installed in any particular context, you receive an onMembersAdded activity.

显然,即使我刚刚为用户安装了机器人,我也可以在我的机器人中收到一条消息。这将是我找到 userId 的机会。

当我尝试这个时,我会在这里确认这是否真的发生在我的场景中,它是个人选项卡中的机器人。

【问题讨论】:

  • 您好,如果@RajeeshMenoth 给出的答案能满足您的要求,您能否点赞。
  • @Jagadeesh-MSFT 我会的。这是一些非常好的和有价值的信息,当然值得一票,但它不能回答我的问题,因为他们认为我手边有一个 Activity 对象。这个问题是关于让机器人发起对话的。
  • 您好@NielsBrinch,AnsumanBal-MT 提供的答案是否有帮助?如果是,那么您是否愿意将答案标记为已接受,以供社区成员将来参考?
  • Prabhu,不。但是 Karthik 正确理解并回答了这个问题,我将他的回答标记为已接受。

标签: azure microsoft-graph-api botframework microsoft-teams azure-bot-service


【解决方案1】:

根据您的要求,我了解到您正在尝试从 microsoft 团队频道获取成员信息。您可以从 ms-team 频道中的机器人连接器轻松找到这一点,而不是使用前缀 28 或 29。机器人连接器 REST API 允许您的机器人向通道发送和接收消息,并且机器人状态 REST API 允许机器人存储和检索与用户和对话相关的状态。所以我们可以使用“Microsoft.Bot.Connector”来获取用户的详细信息。

var connector = new ConnectorClient(new Uri(turnContext.Activity.ServiceUrl), "MicrosoftAppId", "MicrosoftAppPassword");
        var conversationId = turnContext.Activity.Conversation.Id;
        var channelInfo = turnContext.Activity.ChannelId;

        var userInfo = await connector.Conversations.GetConversationMembersAsync(conversationId);

扩展方法“GetConversationMembersAsync”将从连接器获取成员信息。

输出:

"userInfo" 对象将返回以下响应。此详细信息将包含重要信息,例如成员 ID、objectId、tenantId 等。

[{
"id": "29:15SDCCoTpDNJ_OiAdsOiMGAgg2S5HCRQvCt3ZVWbszpU5rSHkT95Zh2Tj1n-bhH4Sjc6zOBcuaSAUo-OtCm4ruD",
"name": "Rajeesh Menoth",
"aadObjectId": null,
"role": null,
"objectId": "bz341e75-60cf-8fdc-b490-04d6edd8a0f7",
"givenName": "Rajeesh",
"surname": "Raveendran",
"email": "Rajeesh.Menoth@menothsoft.com",
"userPrincipalName": "Rajeesh.Menoth@menothsoft.com",
"tenantId": "167f026d-8ffe-883f-5a11-9c2063481198",
"userRole": "user"
}]

图形 API:

如果您没有任何正在进行的对话,那么 Graph API 是从应用程序获取用户详细信息的唯一方法。您可以从 bot 频道注册服务手动复制 BotID,您可以从图形 API 中获取用户 ID。

请查看Microsoft Token Generator docs & Get user info using Graph API

参考:

  1. Microsoft Connector Client

【讨论】:

  • 谢谢。但是,我想要用户 ID 的原因是我可以创建与用户的对话。所以在这种情况下,我还没有正在进行的对话。所以在这种情况下,我还没有 turnContext 或 Activity 对象。使用 BotID 和 UserID,我可以创建一个对话 ID,然后在用户开始使用机器人之前就开始向他们发送消息。
  • 旁注:它是个人选项卡中的机器人,它出现在左侧栏的用户“聊天”区域中。它与特定的团队或频道没有直接或间接的关系。
  • @NielsBrinch 如果您没有任何正在进行的对话,那么 Graph API 是从应用程序获取用户详细信息的唯一方法。您可以从 bot 频道注册服务手动复制 BotID,您可以从图形 API 中获取用户 ID。我会用图形 api 代码更新你的答案。
  • @NielsBrinch 我认为除了 Graph API 之外,您无法使用 AD 身份验证获取 USER 的用户 ID。
  • 我可以从 Graph API 获取用户 ID,但不能获取向机器人发送消息所需的用户 ID 类型。
【解决方案2】:

要获取 bot id ,您可以从 bot 配置页面的 Azure 门户中找到 Microsoft App ID,它指的是 bot 服务的 bot id。

您的机器人可以访问有关团队或聊天的其他上下文,例如用户个人资料。

可以在您的机器人连接的频道中找到用户 ID。您的机器人可以查询团队成员列表及其基本资料。基本配置文件包括团队用户 ID 和 Azure Active Directory (AAD) 信息,例如名称和对象 ID。

  1. 您可以使用serviceUrl 值作为端点直接在/conversations/{teamId}/members/ 上发出GET 请求。

teamId 可以在您的机器人在以下情况下收到的活动负载的 channeldata 对象中找到:

  • 当用户在团队环境中发送消息或与您的机器人交互时。
  • 将新用户或机器人添加到团队时。

GET /v3/conversations/19:ja0cu120i1jod12j@skype.net/members

Response body
[{
    "id": "29:1GcS4EyB_oSI8A88XmWBN7NJFyMqe3QGnJdgLfFGkJnVelzRGos0bPbpsfJjcbAD22bmKc4GMbrY2g4JDrrA8vM06X1-cHHle4zOE6U4ttcc",
    "objectId": "9d3e08f9-a7ae-43aa-a4d3-de3f319a8a9c",
    "givenName": "Scott",
    "surname": "Mccall",
    "email": "Scott.Mccall@xyz.com",
    "userPrincipalName": "scall@xyz.com"
}, {
    "id": "29:1bSnHZ7Js2STWrgk6ScEErLk1Lp2zQuD5H2qQ960rtvstKp8tKLl-3r8b6DoW0QxZimuTxk_kupZ1DBMpvIQQUAZL-PNj0EORDvRZXy8kvWk",
    "objectId": "76b0b09f-d410-48fd-993e-84da521a597b",
    "givenName": "Allison",
    "surname": "Argent",
    "email": "Allison.Agrent@xyz.com",
    "userPrincipalName": "algent@xyz.com"
}]
  1. 您可以使用Team.Id 调用GetConversationMembersAsync 以返回用户ID 列表。

// Fetch the members in the current conversation
var connector = new ConnectorClient(new Uri(context.Activity.ServiceUrl));
var teamId = context.Activity.GetChannelData<TeamsChannelData>().Team.Id;
var members = await connector.Conversations.GetConversationMembersAsync(teamId);

// Concatenate information about all members into a string
var sb = new StringBuilder();
foreach (var member in members.AsTeamsChannelAccounts())
{
    sb.AppendFormat(
        "GivenName = {0}, TeamsMemberId = {1}",
        member.Name, member.Id);

    sb.AppendLine();
}

// Post the member info back into the conversation
await context.PostAsync($"People in this conversation: {sb.ToString()}");
  1. node.js 示例

[...]
import * as builder from "botbuilder";
[...]

var teamId = session.message.sourceEvent.team.id;
connector.fetchMembers(
  (<builder.IChatConnectorAddress>session.message.address).serviceUrl,
  teamId,
  (err, result) => {
    if (err) {
      session.endDialog('There is some error');
    }
    else {
      session.endDialog('%s', JSON.stringify(result));
    }
  }
);

使用图形 API 或 SDK(注意:Bot 应在活动目录中的应用注册中注册,并且用户也必须存在于目录中):

  1. 通过列表和搜索获取bot的Appid:

GET https://graph.microsoft.com/v1.0/applications?$search="displayName:botname"&$count=true
ConsistencyLevel: eventual
  1. 获取活动目录域中存在的用户列表: (通过过滤域邮件进行搜索)
  • 使用 HTTP 请求

GET https://graph.microsoft.com/v1.0/users?$filter=endswith(mail,'a@xyz.com')&$orderby=userPrincipalName&$count=true
ConsistencyLevel: eventual
  • 使用 C#

GraphServiceClient graphClient = new GraphServiceClient( authProvider );

var users = await graphClient.Users
    .Request()
    .Header("ConsistencyLevel","eventual")
    .Filter("endswith(mail,'a@xyz.com')")
    .OrderBy("userPrincipalName")
    .GetAsync();

你会得到这样的输出:

 HTTP/1.1 200 OK 
Content-type: application/json 
{ 
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users", 
"@odata.count": 1, 
"value": [ 
{ 
"displayName": "Allison Argent", 
"givenName": "Allison", 
"jobTitle": "Senior Engineer", 
"mail": "algent@xyz.com", 
"userPrincipalName": "algent@xyz.com", 
"id": "e8b753b5-4117-464e-9a08-713e1ff266b3" 
} 
] 
}

请参考Integrate Bot with Azure Graph

请参考使用 Graph API 的 sample 机器人。

【讨论】:

  • 关于 Bot ID,虽然我对您的指南感到满意,我绝对可以使用,但问题是我是否可以通过编程方式获得它。我想,理论上,我可以通过调用 Azure API 来获得它,但我的意思是机器人本身是否能以某种方式找到它。
  • 关于用户 ID,如果我等到用户与机器人交互,那么我可以按照你的描述从 Activity 对象中获取用户 ID。那么一切都很好。但是,我的问题是我是否可以在此之前找到用户 ID,这样我就不必等待用户与机器人交互,然后才能向用户发送消息。也许我想向租户中的所有用户发送消息,包括尚未开始使用 Teams 的用户。
  • 附带说明,我的机器人不在频道中,而是在个人标签中(但到目前为止它对问题并没有真正的影响)
  • 您是否将此处的租户称为 Active Directory 租户?如果我理解正确,那么您想通过 API 获取该租户/活动目录中的所有用户并收集 id 并使用它使用 bot 发送消息?
  • 是的,AnsumanBal,这是正确的。我想以某种方式收集身份证。但是需要通过机器人发送给用户的 ID 不是普通的用户 ID。
【解决方案3】:

当您询问机器人 ID 时,我认为您的主要问题实际上是关于主动消息传递。我认为您需要机器人 ID,因为某些 Microsoft 文档建议(实际上:“建议”)发送主动消息。但是,我更喜欢使用更简单的方法,并且只需要 conversationid 和 serviceUrl。请参阅here 获取示例实现(我已包含 C# 和 Node 版本)。

简而言之,当用户安装机器人(个人范围、群聊或团队频道)时,您会获得对话 ID 和服务 URL。您可以在用户实际发送的任何消息中获取它,但最好在他们在 activityUpdate 上安装机器人时获取它。您需要将对话 ID 和服务网址存储在您身边,例如在数据库中,然后根据示例在需要发送主动消息时简单地使用它们。顺便说一句,我建议还存储来自 activityUpdate 的时区信息,尤其是对于用户,因为他们可能希望在特定时间发送消息,具体取决于您的应用程序(您的 8:00 可能与用户的 8:00 不同) .

更新:这是我所做的会议视频,涵盖了这个主题 - https://www.youtube.com/watch?v=mM7-fYdcJhw。主动的东西大约已经完成了一半,但早期的部分也可能作为背景有用。

【讨论】:

  • 我还没有 ConversationId。如果我有 UserId,这就是我将创建的内容
  • 回想一下,“Bot 框架”的使用范围远不止 Teams。因此,有些事情适用于一种情况,但不适用于另一种情况——这就是其中之一。以相同的方式在 Teams 中“创建”对话实际上是不可能的。对话是由用户在安装您的机器人时“创建”的,此后用户和机器人之间的所有时间都只有一个“对话”
  • 因此,您需要 - 给定 - 对话 ID。它会在用户与机器人交互的任何时候出现(例如用户发送的任何消息),但它也会在用户第一次安装你的机器人时出现。当然,这是获取它的最佳时间,因为您在安装时立即拥有它,而且他们甚至不需要发送消息。
  • 查看更新后的答案 - 我找到了我今年早些时候所做的会议的视频记录,涵盖了该主题。
  • 明白。我不知道当其他人为用户安装机器人时,机器人会获得 Activity,即使该用户从未与机器人进行过交互。
猜你喜欢
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-12
相关资源
最近更新 更多