Получение контекста для бота Microsoft Teams

Важно!

Эта статья основана на пакете SDK Bot Framework версии 3. Если вы ищете текущую документацию по пакету SDK версии 4.6 или более поздней, см. раздел Боты для бесед.

Бот может получить доступ к дополнительному контексту о команде или чате, например к профилю пользователя. Эти сведения можно использовать для расширения функциональных возможностей бота и обеспечения более персонализированного взаимодействия.

Примечание.

  • Api ботов Microsoft Teams лучше всего доступны через наши расширения для пакета SDK Bot Builder.
  • Для C# или .NET скачайте пакет NuGet Microsoft.Bot.Connector.Teams .
  • Для Node.js разработки функции Bot Builder для Teams включены в пакет SDK Bot Framework версии 4.6.

Получение списка команды

Бот может запрашивать список участников команды и их базовые профили. Основные профили включают идентификаторы пользователей Teams и сведения Microsoft Entra, такие как имя и идентификатор объекта. Эти сведения можно использовать для сопоставления удостоверений пользователей. Например, проверьте, является ли пользователь, вошедший на вкладку с помощью учетных данных Microsoft Entra, членом команды.

Пример REST API

Непосредственно выполните запрос GET для /conversations/{teamId}/members/, используя serviceUrl значение в качестве конечной точки.

Объект teamId можно найти в объекте channeldata полезных данных действия, получаемых ботом в следующих сценариях:

Примечание.

  • Всегда используйте идентификатор команды при вызове API.
  • Значение serviceUrl , как правило, является стабильным, но может изменяться. При поступлении нового сообщения бот должен проверить его хранимое serviceUrl значение.
GET /v3/conversations/19:ja0cu120i1jod12j@skype.net/members

Response body
[{
    "id": "29:1GcS4EyB_oSI8A88XmWBN7NJFyMqe3QGnJdgLfFGkJnVelzRGos0bPbpsfJjcbAD22bmKc4GMbrY2g4JDrrA8vM06X1-cHHle4zOE6U4ttcc",
    "objectId": "9d3e08f9-a7ae-43aa-a4d3-de3f319a8a9c",
    "givenName": "Larry",
    "surname": "Brown",
    "email": "Larry.Brown@fabrikam.com",
    "userPrincipalName": "labrown@fabrikam.com"
}, {
    "id": "29:1bSnHZ7Js2STWrgk6ScEErLk1Lp2zQuD5H2qQ960rtvstKp8tKLl-3r8b6DoW0QxZimuTxk_kupZ1DBMpvIQQUAZL-PNj0EORDvRZXy8kvWk",
    "objectId": "76b0b09f-d410-48fd-993e-84da521a597b",
    "givenName": "John",
    "surname": "Patterson",
    "email": "johnp@fabrikam.com",
    "userPrincipalName": "johnp@fabrikam.com"
}, {
    "id": "29:1URzNQM1x1PNMr1D7L5_lFe6qF6gEfAbkdG8_BUxOW2mTKryQqEZtBTqDt10-MghkzjYDuUj4KG6nvg5lFAyjOLiGJ4jzhb99WrnI7XKriCs",
    "objectId": "6b7b3b2a-2c4b-4175-8582-41c9e685c1b5",
    "givenName": "Rick",
    "surname": "Stevens",
    "email": "Rick.Stevens@fabrikam.com",
    "userPrincipalName": "rstevens@fabrikam.com"
}]

Пример .NET

Вызовите GetConversationMembersAsync с помощью Team.Id , чтобы вернуть список идентификаторов пользователей. Вызовите GetConversationMembersAsync , чтобы получить userRole свойство, возвращающее значение от имени пользователя.

// 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()}");

пример Node.js или TypeScript


[...]
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 для любого личного чата, чтобы получить сведения о профиле пользователя в чате с ботом.

Вызов API, методы ПАКЕТА SDK и объект ответа идентичны получению списка команды. Единственное отличие заключается в том, что вы передаете conversationId вместо teamId.

Получение списка каналов в команде

Бот может запрашивать список каналов в команде.

Примечание.

  • Имя общего канала по умолчанию возвращается в качестве null, чтобы разрешить локализацию.
  • Идентификатор канала для общего канала всегда совпадает с идентификатором команды.

Пример REST API

Непосредственно выполните запрос GET для /teams/{teamId}/conversations/, используя serviceUrl значение в качестве конечной точки.

Единственным источником является teamId сообщение из контекста команды. Это сообщение является сообщением от пользователя или сообщением, которое бот получает при добавлении в команду. Дополнительные сведения см. в статье Бот или пользователь, добавленный в команду.

Примечание.

Значение serviceUrl , как правило, является стабильным, но может изменяться. При поступлении нового сообщения бот должен проверить его хранимое serviceUrl значение.

GET /v3/teams/19%3A033451497ea84fcc83d17ed7fb08a1b6%40thread.skype/conversations

Response body
{
    "conversations": [{
        "id": "19:033451497ea84fcc83d17ed7fb08a1b6@thread.skype",
        "name": null
    }, {
        "id": "19:cc25e4aae50746ecbb11473bba24c70a@thread.skype",
        "name": "Materials"
    }, {
        "id": "19:b7b84cba410c406ba671dbbf5e0a3519@thread.skype",
        "name": "Design"
    }, {
        "id": "19:fc5db2aed489454e8f8c06829ed6c986@thread.skype",
        "name": "Marketing"
    }]
}

Пример .NET

В следующем примере используется FetchChannelList вызов из расширений Teams для пакета SDK Bot Builder для .NET:

ConversationList channels = client.GetTeamsConnectorClient().Teams.FetchChannelList(activity.GetChannelData<TeamsChannelData>().Team.Id);

Пример Node.js

В следующем примере используется fetchChannelList вызов из расширений Teams для пакета SDK Bot Builder для Node.js:

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

Получение clientInfo в контексте бота

Вы можете получить clientInfo в действиях бота. ClientInfo содержит следующие свойства:

  • Locale
  • Страна
  • Платформа
  • Часовой пояс

Пример JSON

[
    {
        "type": "clientInfo",
        "locale": "en-US",
        "country": "US",
        "platform": "Windows",
        "timezone": "Asia/Calcutta"
    }
]

Пример C#

var connector = new ConnectorClient(new Uri(context.Activity.ServiceUrl));

{
    var clientinfo = context.Activity.Entities[0];
    await context.PostAsync($"ClientInfo: clientinfo ");
}

Дополнительные ресурсы

Примеры Bot Framework.