Примеры кода в этом разделе основаны на версии 4.6 и более поздних версиях пакета SDK Bot Framework. Если вы ищете документацию по более ранним версиям, см. раздел пакет SDK для ботов версии 3 в папке Устаревшие пакеты SDK документации.
Бот может получить доступ к дополнительным контекстным данным о команде или чате, где он установлен. Эти сведения можно использовать для расширения функциональных возможностей бота и его персонализации.
Получение состава или профиля
Бот может запрашивать список участников и их базовые профили пользователей, включая идентификаторы пользователей Teams и сведения Microsoft Entra, такие как имя и objectId. Эти сведения можно использовать для сопоставления удостоверений пользователей. Например, чтобы проверить, является ли пользователь, вошедший на вкладку с помощью учетных данных Microsoft Entra, членом команды. Для получения участников беседы минимальный или максимальный размер страницы зависит от реализации. Размер страницы менее 50 обрабатывается как 50, а размер больше 500 ограничивается 500. Даже если вы используете нестраничную версию, она ненадежна в больших командах и не должна использоваться. Дополнительные сведения см. в статье об изменениях API ботов Teams для получения сведений участников команды или чата.
Примечание.
Разбиение на страницы доступно в команде и канале.
Разбиение на страницы в чатах не поддерживается. Для чатов всегда возвращается весь список.
В следующем примере кода для получения списка используется выгружаемая конечная точка:
public class MyBot : TeamsActivityHandler
{
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
var members = new List<TeamsChannelAccount>();
string continuationToken = null;
do
{
// Gets a paginated list of members of one-on-one, group, or team conversation.
var currentPage = await TeamsInfo.GetPagedMembersAsync(turnContext, 100, continuationToken, cancellationToken);
continuationToken = currentPage.ContinuationToken;
members.AddRange(currentPage.Members);
}
while (continuationToken != null);
}
}
export class MyBot extends TeamsActivityHandler {
constructor() {
super();
// See https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-basics?view=azure-bot-service-4.0 to learn more about the message and other activity types.
this.onMessage(async (turnContext, next) => {
var continuationToken;
var members = [];
do {
// Gets a paginated list of members of one-on-one, group, or team conversation.
var pagedMembers = await TeamsInfo.getPagedMembers(turnContext, 100, continuationToken);
continuationToken = pagedMembers.continuationToken;
members.push(...pagedMembers.members);
}
while(continuationToken !== undefined)
// By calling next() you ensure that the next BotHandler is run.
await next();
});
}
}
async def _show_members(
self, turn_context: TurnContext
):
# Get a conversationMember from a team.
members = await TeamsInfo.get_team_members(turn_context)
Вы можете напрямую отправить запрос GET на /v3/conversations/{conversationId}/pagedmembers?pageSize={pageSize}&continuationToken={continuationToken}, используя значение serviceUrl в качестве конечной точки. Значение параметра serviceUrl является стабильным, но может измениться. Когда приходит новое сообщение, ваш бот должен проверить сохраненное значение serviceUrl. Полезные данные ответа также указывают, является ли пользователь обычным или анонимным пользователем.
После получения состава или профиля вы можете получить сведения об одном участнике. Чтобы получить сведения об одном или нескольких участниках чата или команды, используйте API TeamsInfo.GetMembersAsync бота Microsoft Teams для C# или TeamsInfo.getMembers API TypeScript.
Получение сведений об одном элементе
Вы также можете получить сведения о конкретном пользователе, используя его идентификатор пользователя Teams, имя участника-пользователя или идентификатор объекта Microsoft Entra.
Следующий пример кода используется для получения сведений об одном элементе:
public class MyBot : TeamsActivityHandler
{
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
// Gets the account of a single conversation member.
// This works in one-on-one, group, and team scoped conversations.
var member = await TeamsInfo.GetMemberAsync(turnContext, turnContext.Activity.From.Id, cancellationToken);
}
}
export class MyBot extends TeamsActivityHandler {
constructor() {
super();
// See learn.microsoft.com/en-us/azure/bot-service/bot-builder-basics?view=azure-bot-service-4.0 to learn more about the message and other activity types.
this.onMessage(async (turnContext, next) => {
const member = await TeamsInfo.getMember(turnContext, encodeURI('someone@somecompany.com'));
// By calling next() you ensure that the next BotHandler is run.
await next();
});
}
}
async def _show_members(
self, turn_context: TurnContext
):
# TeamsInfo.get_member: Gets the member of a team scoped conversation.
member = await TeamsInfo.get_member(turn_context, turn_context.activity.from_property.id)
Вы можете напрямую отправить запрос GET на /v3/conversations/{conversationId}/members/{userId}, используя значение serviceUrl в качестве конечной точки. Значение параметра serviceUrl является стабильным, но может измениться. Когда приходит новое сообщение, ваш бот должен проверить сохраненное значение serviceUrl. Его можно использовать для обычных и анонимных пользователей.
Ниже приведен пример ответа для обычного пользователя:
GET /v3/conversations/19:ja0cu120i1jod12j@skype.net/members/29:1GcS4EyB_oSI8A88XmWBN7NJFyMqe3QGnJdgLfFGkJnVelzRGos0bPbpsfJjcbAD22bmKc4GMbrY2g4JDrrA8vM06X1-cHHle4zOE6U4ttcc
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",
"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47",
"userRole":"user"
}
Ниже приведен пример ответа для анонимного пользователя:
GET /v3/conversations/19:ja0cu120i1jod12j@skype.net/members/<anonymous user id>"
Response body
{
"id": "29:1GcS4EyB_oSI8A88XmWBN7NJFyMqe3QGnJdgLfFGkJnVelzRGos0bPbpsfJjcbAD22bmKc4GMbrY2g4JDrrA8vM06X1-cHHle4zOE6U4ttcc",
"name": "Anon1 (Guest)",
"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47",
"userRole":"anonymous"
}
После получения сведений об одном участнике можно получить сведения о команде. Чтобы получить сведения для команды, используйте API TeamsInfo.GetMemberDetailsAsync бота Teams для C# или TeamsInfo.getTeamDetails TypeScript.
Получение сведений о команде
При установке в команде бот может запрашивать метаданные об этой команде, включая идентификатор группы Microsoft Entra.
Следующий пример кода используется для получения сведений о команде:
public class MyBot : TeamsActivityHandler
{
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
// Gets the details for the given team id. This only works in team scoped conversations.
// TeamsGetTeamInfo: Gets the TeamsInfo object from the current activity.
TeamDetails teamDetails = await TeamsInfo.GetTeamDetailsAsync(turnContext, turnContext.Activity.TeamsGetTeamInfo().Id, cancellationToken);
if (teamDetails != null) {
await turnContext.SendActivityAsync($"The groupId is: {teamDetails.AadGroupId}");
}
else {
// Sends a message activity to the sender of the incoming activity.
await turnContext.SendActivityAsync($"Message did not come from a channel in a team.");
}
}
}
export class MyBot extends TeamsActivityHandler {
constructor() {
super();
// See https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-basics?view=azure-bot-service-4.0 to learn more about the message and other activity types.
this.onMessage(async (turnContext, next) => {
// Gets the details for the given team id.
const teamDetails = await TeamsInfo.getTeamDetails(turnContext);
if (teamDetails) {
// Sends a message activity to the sender of the incoming activity.
await turnContext.sendActivity(`The group ID is: ${teamDetails.aadGroupId}`);
} else {
await turnContext.sendActivity('This message did not come from a channel in a team.');
}
// By calling next() you ensure that the next BotHandler is run.
await next();
});
}
}
async def _show_details(self, turn_context: TurnContext):
# Gets the details for the given team id.
team_details = await TeamsInfo.get_team_details(turn_context)
# MessageFactory.text(): Specifies the type of text data in a message attachment.
reply = MessageFactory.text(f"The team name is {team_details.name}. The team ID is {team_details.id}. The AADGroupID is {team_details.aad_group_id}.")
# Sends a message activity to the sender of the incoming activity.
await turn_context.send_activity(reply)
Вы можете напрямую отправить запрос GET на /v3/teams/{teamId}, используя значение serviceUrl в качестве конечной точки. Значение параметра serviceUrl является стабильным, но может измениться. Когда приходит новое сообщение, ваш бот должен проверить сохраненное значение serviceUrl.
GET /v3/teams/19:ja0cu120i1jod12j@skype.net
Response body
{
"id": "29:1GcS4EyB_oSI8A88XmWBN7NJFyMqe3QGnJdgLfFGkJnVelzRGos0bPbpsfJjcbAD22bmKc4GMbrY2g4JDrrA8vM06X1-cHHle4zOE6U4ttcc",
"name": "The Team Name",
"aadGroupId": "02ce3874-dd86-41ba-bddc-013f34019978"
}
После получения сведений о команде можно получить список каналов в команде. Чтобы получить сведения о списке каналов в команде, используйте API TeamsInfo.GetTeamChannelsAsync бота Teams для C# или TeamsInfo.getTeamChannels API TypeScript.
Получение списка каналов в команде
Бот может запрашивать список каналов в команде.
Примечание.
Имя общего канала по умолчанию возвращается в качестве null, чтобы разрешить локализацию.
Идентификатор канала для общего канала всегда совпадает с идентификатором команды.
Следующий пример кода используется для получения списка каналов в команде:
public class MyBot : TeamsActivityHandler
{
// Override this in a derived class to provide logic specific to Message activities.
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
// Returns a list of channels in a Team. This only works in team scoped conversations.
IEnumerable<ChannelInfo> channels = await TeamsInfo.GetTeamChannelsAsync(turnContext, turnContext.Activity.TeamsGetTeamInfo().Id, cancellationToken);
// Sends a message activity to the sender of the incoming activity.
await turnContext.SendActivityAsync($"The channel count is: {channels.Count()}");
}
}
export class MyBot extends TeamsActivityHandler {
constructor() {
super();
// See https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-basics?view=azure-bot-service-4.0 to learn more about the message and other activity types.
this.onMessage(async (turnContext, next) => {
// Supports retrieving channels hosted by a team.
const channels = await TeamsInfo.getTeamChannels(turnContext);
// Sends a message activity to the sender of the incoming activity.
await turnContext.sendActivity(`The channel count is: ${channels.length}`);
// By calling next() you ensure that the next BotHandler is run.
await next();
});
}
}
async def _show_channels(
self, turn_context: TurnContext
):
# Supports retrieving channels hosted by a team.
channels = await TeamsInfo.get_team_channels(turn_context)
reply = MessageFactory.text(f"Total of {len(channels)} channels are currently in team")
await turn_context.send_activity(reply)
Вы можете напрямую отправить запрос GET на /v3/teams/{teamId}/conversations, используя значение serviceUrl в качестве конечной точки. Значение параметра serviceUrl является стабильным, но может измениться. Когда приходит новое сообщение, ваш бот должен проверить сохраненное значение serviceUrl.
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.