Importante
Os exemplos de código nesta secção baseiam-se na versão 4.6 e versões posteriores do SDK do Bot Framework. Se estiver à procura de documentação para versões anteriores, veja a secção bots – SDK v3 na pasta SDKs Legados da documentação.
Um bot pode acessar dados de contexto adicionais sobre uma equipe ou chat onde está instalado. Essas informações podem ser usadas para enriquecer a funcionalidade do bot e fornecer uma experiência mais personalizada.
Buscar a lista ou perfil de usuário
O bot pode consultar a lista de membros e os respetivos perfis de utilizador básicos, incluindo IDs de utilizador do Teams e informações de Microsoft Entra, como o nome e o objectId. Você pode usar essas informações para correlacionar identidades de usuários. Por exemplo, para marcar se um utilizador iniciou sessão num separador através de Microsoft Entra credenciais é membro da equipa. Para obter membros da conversa, o tamanho mínimo ou máximo da página depende da implementação. Tamanho de página menor que 50, são tratados como 50 e maiores que 500, são limitados a 500. Mesmo se você usar a versão não paginada, ela não é confiável em grandes equipes e não deve ser usada. Para obter mais informações, alterações nas APIs de Bot do Teams para buscar membros da equipe ou de chat.
Observação
- A paginação está disponível numa equipa e num canal.
- A paginação não é suportada em chats. Para conversas, todo o plantel é sempre devolvido.
O código de amostra a seguir usa o ponto de extremidade paginado para buscar a lista:
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://v4.hkg1.meaqua.org/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();
});
}
}
Referência do SDK
async def _show_members(
self, turn_context: TurnContext
):
# Get a conversationMember from a team.
members = await TeamsInfo.get_team_members(turn_context)
Você pode emitir diretamente uma solicitação GET em /v3/conversations/{conversationId}/pagedmembers?pageSize={pageSize}&continuationToken={continuationToken}, usando o valor de serviceUrl como ponto de extremidade. O valor de serviceUrl é estável, mas pode ser alterado. Quando uma nova mensagem chega, o bot deve verificar seu valor armazenado para serviceUrl. A carga de resposta também indica se o usuário é um usuário normal ou anônimo.
GET /v3/conversations/19:meeting_N2QzYTA3YmItYmMwOC00OTJmLThkYzMtZWMzZGU0NGIyZGI0@thread.v2/pagedmembers?pageSize=100&continuationToken=asdfasdfalkdsjfalksjdf
Response body
{
"continuationToken":"asdfqwerueiqpiewr",
"members":[
{
"id":"29:1GcS4EyB_oSI8A88XmWBN7NJFyMqe3QGnJdgLfFGkJnVelzRGos0bPbpsfJjcbAD22bmKc4GMbrY2g4JDrrA8vM06X1-cHHle4zOE6U4ttcc",
"name":"Anon1 (Guest)",
"tenantId":"29:1UX7p8Fkx7p93MZlBFS71swTB9juQOCfnXf2L3wxOUITCcIGpFcRX-JiFjLDVZhxGpEfzSTGNsZeEyTKr1iu3Vw",
"userRole":"anonymous"
},
{
"id":"29:1bSnHZ7Js2STWrgk6ScEErLk1Lp2zQuD5H2qQ960rtvstKp8tKLl-3r8b6DoW0QxZimuTxk_kupZ1DBMpvIQQUAZL-PNj0EORDvRZXy8kvWk",
"objectId":"76b0b09f-d410-48fd-993e-84da521a597b",
"givenName":"John",
"surname":"Patterson",
"email":"johnp@fabrikam.com",
"userPrincipalName":"johnp@fabrikam.com",
"tenantId":"29:1UX7p8Fkx7p93MZlBFS71swTB9juQOCfnXf2L3wxOUITCcIGpFcRX-JiFjLDVZhxGpEfzSTGNsZeEyTKr1iu3Vw",
"userRole":"user"
},
{
"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",
"tenantId":"29:1UX7p8Fkx7p93MZlBFS71swTB9juQOCfnXf2L3wxOUITCcIGpFcRX-JiFjLDVZhxGpEfzSTGNsZeEyTKr1iu3Vw",
"userRole":"user"
}
]
}
Depois de buscar a lista ou perfil de usuário, você pode obter detalhes de um único membro. Para obter informações para um ou mais membros de uma conversa ou equipa, utilize as APIs TeamsInfo.GetMembersAsync de bot do Microsoft Teams para C# ou TeamsInfo.getMembers para APIs TypeScript.
Obter detalhes de membro único
Também pode obter os detalhes de um determinado utilizador com o respetivo ID de utilizador, UPN ou Microsoft Entra ID de Objeto do Teams.
O código de exemplo a seguir é usado para obter detalhes de um único membro:
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 v4.hkg1.meaqua.org/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)
Você pode emitir diretamente uma solicitação GET em /v3/conversations/{conversationId}/members/{userId}, usando o valor de serviceUrl como ponto de extremidade. O valor de serviceUrl é estável, mas pode ser alterado. Quando uma nova mensagem chega, o bot deve verificar seu valor armazenado para serviceUrl. Isso pode ser usado para usuários regulares e usuários anônimos.
A seguir está a amostra de resposta para usuário comum:
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"
}
Veja a seguir a amostra de resposta para usuário anônimo:
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"
}
Depois de obter detalhes de um único membro, você pode obter detalhes da equipe. Para obter informações para uma equipa, utilize as APIs TeamsInfo.GetMemberDetailsAsync de bot do Teams para C# ou TeamsInfo.getTeamDetails para TypeScript.
Obter detalhes da equipe
Quando instalado numa equipa, o bot pode consultar metadados sobre essa equipa, incluindo o Microsoft Entra ID do grupo.
O código de exemplo a seguir é usado para obter os detalhes da equipe:
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://v4.hkg1.meaqua.org/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();
});
}
}
Referência do SDK
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)
Você pode emitir diretamente uma solicitação GET em /v3/teams/{teamId}, usando o valor de serviceUrl como ponto de extremidade. O valor de serviceUrl é estável, mas pode ser alterado. Quando uma nova mensagem chega, o bot deve verificar seu valor armazenado para 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"
}
Depois de obter os detalhes da equipe, você pode obter a lista de canais em uma equipe. Para obter informações para uma lista de canais numa equipa, utilize as APIs TeamsInfo.GetTeamChannelsAsync de bot do Teams para C# ou TeamsInfo.getTeamChannels para APIs TypeScript.
Obter a lista de canais em uma equipe
Seu bot pode consultar a lista de canais em uma equipe.
Observação
- O nome do canal geral padrão é retornado como
null para permitir a localização.
- A ID do canal para o canal Geral sempre corresponde à ID da equipe.
O código de exemplo a seguir é usado para obter a lista de canais em uma equipe:
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()}");
}
}
Referência do SDK
export class MyBot extends TeamsActivityHandler {
constructor() {
super();
// See https://v4.hkg1.meaqua.org/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();
});
}
}
Referência do SDK
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)
Você pode emitir diretamente uma solicitação GET em /v3/teams/{teamId}/conversations, usando o valor de serviceUrl como ponto de extremidade. O valor de serviceUrl é estável, mas pode ser alterado. Quando uma nova mensagem chega, o bot deve verificar seu valor armazenado para 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"
}]
}
Exemplo de código
Para obter exemplos de trabalho completos que demonstram a funcionalidade, veja os seguintes exemplos do Teams para o Bot Framework:
|
Nome de exemplo |
Descrição |
.NET |
Node.js |
Python |
Manifesto |
| Bot de conversas do Teams |
Esta aplicação demonstra eventos de conversação de bots, suportando Cartões Ajustáveis, recibos de leitura e eventos de atualização de mensagens. Inclui suporte de leitura envolvente para acessibilidade. |
View |
View |
View |
View |
| Autenticação com OAuthPrompt |
Esta aplicação de exemplo demonstra como um Bot pode utilizar a autenticação do Teams. |
View |
View |
View |
View |
| Carregamento de ficheiros do Teams |
Este exemplo de bot para o Teams demonstra as capacidades de carregamento de ficheiros com o Bot Framework v4, permitindo que os utilizadores carreguem ficheiros e vejam imagens inline em chats. |
View |
View |
View |
View |
| Caixa de diálogo (referida como módulo de tarefas no TeamsJS v1.x) |
Esta aplicação de exemplo demonstra como utilizar caixas de diálogo (referidas como módulos de tarefas no TeamsJS v1.x) com o Bot Framework v4 |
View |
View |
View |
View |
| Iniciar um novo thread num canal |
Esta aplicação demonstra como iniciar um thread de conversação num canal específico do Teams com o Bot Framework v4. |
View |
View |
View |
View |
| Localização de aplicações do Teams |
Este exemplo demonstra como implementar a localização para aplicações do Microsoft Teams com Bots e Separadores. |
View |
View |
NA |
View |
Próxima etapa
Confira também