Os exemplos de código nesta seção são baseados na versão 4.6 e versões posteriores do SDK do Bot Framework. Se você estiver procurando documentação para versões anteriores, consulte a seção bots – v3 SDK na pasta SDKs Herdados da documentação.
Ao criar seus bots de conversa do Microsoft Teams, você poderá trabalhar com eventos de conversa. O Teams envia notificações ao bot de eventos de conversa que ocorrem em escopos onde o bot está ativo. Você poderá capturar esses eventos em seu código e executar as seguintes ações:
Dispare uma mensagem de boas-vindas quando seu bot for adicionado a uma equipe.
Dispare uma mensagem de boas-vindas quando um novo membro da equipe for adicionado ou removido.
Dispare uma notificação quando um canal for criado, renomeado ou excluído.
Dispare uma notificação quando uma mensagem de bot for curtida por um usuário.
Identifique o canal padrão do bot na entrada do usuário (seleção) durante a instalação.
Eventos de atualização de conversa
Você pode usar eventos de atualização de conversa para fornecer notificações melhores e ações efetivas de bot.
Importante
Você poderá adicionar novos eventos a qualquer momento e seu bot começará a recebê-los.
Você deve projetar seu bot para receber eventos inesperados.
Se estiver usando o SDK do Bot Framework, o bot responderá automaticamente com um 200 - OK a todos os eventos que você escolher não manipular.
Quando um cliente de Serviços de Comunicação do Azure (ACS) entra ou sai da reunião do Teams, nenhum evento de atualização de conversa é disparado.
Um bot receberá um evento conversationUpdate em um dos seguintes casos:
Quando o bot é adicionado a uma conversa.
Outros membros são adicionados ou removidos de uma conversa.
Os metadados da conversa foram alterados.
O evento conversationUpdate é enviado ao seu bot quando ele recebe informações sobre atualizações de membros para as equipes onde foi adicionado. Ele também receberá uma atualização quando for adicionado pela primeira vez para conversas pessoais.
A tabela a seguir mostra uma lista de eventos de atualização de conversa do Teams com mais detalhes:
protected override async Task OnTeamsChannelCreatedAsync(ChannelInfo channelInfo, TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
var heroCard = new HeroCard(text: $"{channelInfo.Name} is the Channel created");
// Sends an activity to the sender of the incoming activity.
await turnContext.SendActivityAsync(MessageFactory.Attachment(heroCard.ToAttachment()), cancellationToken);
}
async def on_teams_channel_created(
self, channel_info: ChannelInfo, team_info: TeamInfo, turn_context: TurnContext
):
# Sends a message activity to the sender of the incoming activity.
return await turn_context.send_activity(
MessageFactory.text(
f"The new channel is {channel_info.name}. The channel id is {channel_info.id}"
)
)
Canal renomeado
O channelRenamed evento é enviado para o bot sempre que um canal é renomeado em uma equipe em que o bot está instalado.
O código a seguir mostra um exemplo do evento Canal renomeado:
protected override async Task OnTeamsChannelRenamedAsync(ChannelInfo channelInfo, TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
var heroCard = new HeroCard(text: $"{channelInfo.Name} is the new Channel name");
// Sends an activity to the sender of the incoming activity.
await turnContext.SendActivityAsync(MessageFactory.Attachment(heroCard.ToAttachment()), cancellationToken);
}
async def on_teams_channel_deleted(
self, channel_info: ChannelInfo, team_info: TeamInfo, turn_context: TurnContext
):
# Sends a message activity to the sender of the incoming activity.
return await turn_context.send_activity(
MessageFactory.text(f"The deleted channel is {channel_info.name}")
)
Canal restaurado
O channelRestored evento é enviado para o bot, sempre que um canal que foi excluído anteriormente é restaurado em uma equipe em que o bot já está instalado.
O código a seguir mostra um exemplo do evento Canal restaurado:
async def on_teams_channel_restored(
self, channel_info: ChannelInfo, team_info: TeamInfo, turn_context: TurnContext
):
# Sends a message activity to the sender of the incoming activity.
return await turn_context.send_activity(
MessageFactory.text(
f"The restored channel is {channel_info.name}. The channel id is {channel_info.id}"
)
)
Membros adicionados
Um evento adicionado ao membro é enviado ao bot nos seguintes cenários:
Quando o bot, em si, é instalado e adicionado a uma conversa
No contexto de equipe, o conversation.id da atividade é definido como o id do canal selecionado pelo usuário durante a instalação do aplicativo ou o canal em que o bot foi instalado.
Quando um usuário é adicionado a uma conversa em que o bot é instalado
As IDs de usuário recebidas no conteúdo do evento são exclusivas do bot e podem ser armazenadas em cache para uso futuro, como enviar mensagens diretas a um usuário.
A atividade eventType adicionada ao membro é definida como teamMemberAdded quando o evento é enviado de um contexto de equipe. Para determinar se o novo membro adicionado era o próprio bot ou um usuário, marcar o Activity objeto do turnContext. Se a MembersAdded lista contiver um objeto em que id é o mesmo que o id campo do Recipient objeto, o membro adicionado será o bot, caso contrário, é um usuário. O bot é id formatado como 28:<MicrosoftAppId>.
Dica
Use o InstallationUpdate evento para determinar quando o bot é adicionado ou removido de uma conversa.
O código a seguir mostra um exemplo do evento Membros da equipe adicionados:
protected override async Task OnTeamsMembersAddedAsync(IList<TeamsChannelAccount> teamsMembersAdded , TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
foreach (TeamsChannelAccount member in teamsMembersAdded)
{
if (member.Id == turnContext.Activity.Recipient.Id)
{
// Send a message to introduce the bot to the team.
var heroCard = new HeroCard(text: $"The {member.Name} bot has joined {teamInfo.Name}");
// Sends an activity to the sender of the incoming activity.
await turnContext.SendActivityAsync(MessageFactory.Attachment(heroCard.ToAttachment()), cancellationToken);
}
else
{
var heroCard = new HeroCard(text: $"{member.Name} joined {teamInfo.Name}");
// Sends an activity to the sender of the incoming activity.
await turnContext.SendActivityAsync(MessageFactory.Attachment(heroCard.ToAttachment()), cancellationToken);
}
}
}
export class MyBot extends TeamsActivityHandler {
constructor() {
super();
this.onTeamsMembersAddedEvent(async (membersAdded: ChannelAccount[], teamInfo: TeamInfo, turnContext: TurnContext, next: () => Promise<void>): Promise<void> => {
let newMembers: string = '';
console.log(JSON.stringify(membersAdded));
membersAdded.forEach((account) => {
newMembers += account.id + ' ';
});
const name = !teamInfo ? 'not in team' : teamInfo.name;
const card = CardFactory.heroCard('Account Added', `${newMembers} joined ${name}.`);
const message = MessageFactory.attachment(card);
// Sends a message activity to the sender of the incoming activity.
await turnContext.sendActivity(message);
await next();
});
}
}
A mensagem que seu bot recebe quando o bot é adicionado a uma equipe.
Observação
Nesse conteúdo, conversation.id e channelData.settings.selectedChannel.id será a ID do canal que o usuário selecionou durante a instalação do aplicativo ou de onde a instalação foi disparada.
async def on_teams_members_added(
self, teams_members_added: [TeamsChannelAccount], turn_context: TurnContext
):
for member in teams_members_added:
.. # Sends a message activity to the sender of the incoming activity.
await turn_context.send_activity(
MessageFactory.text(f"Welcome your new team member {member.id}")
)
return
Membros removidos
Um evento removido por membro é enviado ao bot nos seguintes cenários:
Quando o bot, em si, é desinstalado e removido de uma conversa.
Quando um usuário é removido de uma conversa em que o bot é instalado.
A atividade eventType removida do membro é definida como teamMemberRemoved quando o evento é enviado de um contexto de equipe. Para determinar se o novo membro removido foi o próprio bot ou um usuário, verifique o objeto Activity do turnContext. Se a MembersRemoved lista contiver um objeto em que id é o mesmo que o id campo do Recipient objeto, o membro adicionado será o bot, caso contrário, é um usuário. A ID do bot é formatada como 28:<MicrosoftAppId>.
Observação
Quando um usuário for excluído permanentemente de um locatário, o evento membersRemoved conversationUpdate será disparado.
O código a seguir mostra um exemplo do evento Membros da equipe removidos:
protected override async Task OnTeamsMembersRemovedAsync(IList<ChannelAccount> membersRemoved, TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
foreach (TeamsChannelAccount member in membersRemoved)
{
if (member.Id == turnContext.Activity.Recipient.Id)
{
// The bot was removed.
// You should clear any cached data you have for this team.
}
else
{
var heroCard = new HeroCard(text: $"{member.Name} was removed from {teamInfo.Name}");
// Sends an activity to the sender of the incoming activity.
await turnContext.SendActivityAsync(MessageFactory.Attachment(heroCard.ToAttachment()), cancellationToken);
}
}
}
export class MyBot extends TeamsActivityHandler {
constructor() {
super();
this.onTeamsMembersRemovedEvent(async (membersRemoved: ChannelAccount[], teamInfo: TeamInfo, turnContext: TurnContext, next: () => Promise<void>): Promise<void> => {
let removedMembers: string = '';
console.log(JSON.stringify(membersRemoved));
membersRemoved.forEach((account) => {
removedMembers += account.id + ' ';
});
const name = !teamInfo ? 'not in team' : teamInfo.name;
const card = CardFactory.heroCard('Account Removed', `${removedMembers} removed from ${teamInfo.name}.`);
const message = MessageFactory.attachment(card);
// Sends a message activity to the sender of the incoming activity.
await turnContext.sendActivity(message);
await next();
});
}
}
O objeto channelData no exemplo de conteúdo a seguir baseia-se na adição de um membro a uma equipe em vez de um chat em grupo ou ao iniciar uma nova conversa individual:
async def on_teams_members_removed(
self, teams_members_removed: [TeamsChannelAccount], turn_context: TurnContext
):
for member in teams_members_removed:
..# Sends a message activity to the sender of the incoming activity.
await turn_context.send_activity(
MessageFactory.text(f"Say goodbye to {member.id}")
)
return
Equipe renomeada
Seu bot será notificado quando a equipe for renomeada. Ele receberá um evento conversationUpdate com eventType.teamRenamed no objeto channelData.
O código a seguir mostra um exemplo do evento Equipe renomeada:
protected override async Task OnTeamsTeamRenamedAsync(TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
var heroCard = new HeroCard(text: $"{teamInfo.Name} is the new Team name");
// Sends an activity to the sender of the incoming activity.
await turnContext.SendActivityAsync(MessageFactory.Attachment(heroCard.ToAttachment()), cancellationToken);
}
export class MyBot extends TeamsActivityHandler {
constructor() {
super();
// Bot is notified when the team is renamed.
this.onTeamsTeamRenamedEvent(async (teamInfo: TeamInfo, turnContext: TurnContext, next: () => Promise<void>): Promise<void> => {
const card = CardFactory.heroCard('Team Renamed', `${teamInfo.name} is the new Team name`);
const message = MessageFactory.attachment(card);
// Sends an activity to the sender of the incoming activity.
await turnContext.sendActivity(message);
await next();
});
}
}
# Bot is notified when the team is renamed.
async def on_teams_team_renamed(
self, team_info: TeamInfo, turn_context: TurnContext
):
# Sends an activity to the sender of the incoming activity.
return await turn_context.send_activity(
MessageFactory.text(f"The new team name is {team_info.name}")
)
Equipe excluída
O bot recebe uma notificação quando a equipe é excluída. Ele receberá um evento conversationUpdate com eventType.teamDeleted no objeto channelData.
O código a seguir mostra um exemplo do evento Equipe excluída:
export class MyBot extends TeamsActivityHandler {
constructor() {
super();
// Invoked when a Team Deleted event activity is received from the connector. Team Deleted corresponds to the user deleting a team.
this.onTeamsTeamDeletedEvent(async (teamInfo: TeamInfo, turnContext: TurnContext, next: () => Promise<void>): Promise<void> => {
// Handle delete event.
await next();
});
}
}
# Invoked when a Team Deleted event activity is received from the connector. Team Deleted corresponds to the user deleting a team.
async def on_teams_team_deleted(
self, team_info: TeamInfo, turn_context: TurnContext
):
# Handle delete event.
)
Equipe restaurada
O bot receberá uma notificação quando uma equipe for restaurada após ser excluída. Ele receberá um evento conversationUpdate com eventType.teamrestored no objeto channelData.
O código a seguir mostra um exemplo do evento Equipe restaurada:
protected override async Task OnTeamsTeamrestoredAsync(TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
var heroCard = new HeroCard(text: $"{teamInfo.Name} is the team name");
// Sends an activity to the sender of the incoming activity.
await turnContext.SendActivityAsync(MessageFactory.Attachment(heroCard.ToAttachment()), cancellationToken);
}
export class MyBot extends TeamsActivityHandler {
constructor() {
super();
// Invoked when a Team Restored event activity is received from the connector. Team Restored corresponds to the user restoring a team.
this.onTeamsTeamrestoredEvent(async (teamInfo: TeamInfo, turnContext: TurnContext, next: () => Promise<void>): Promise<void> => {
const card = CardFactory.heroCard('Team restored', `${teamInfo.name} is the team name`);
const message = MessageFactory.attachment(card);
// Sends an activity to the sender of the incoming activity.
await turnContext.sendActivity(message);
await next();
});
}
}
# Invoked when a Team Restored event activity is received from the connector. Team Restored corresponds to the user restoring a team.
async def on_teams_team_restored(
self, team_info: TeamInfo, turn_context: TurnContext
):
# Sends an activity to the sender of the incoming activity.
return await turn_context.send_activity(
MessageFactory.text(f"The team name is {team_info.name}")
)
Equipe arquivada
O bot receberá uma notificação quando a equipe for instalada e arquivada. Ele receberá um evento conversationUpdate com eventType.teamarchived no objeto channelData.
O código a seguir mostra um exemplo do evento Equipe arquivada:
protected override async Task OnTeamsTeamArchivedAsync(TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
var heroCard = new HeroCard(text: $"{teamInfo.Name} is the team name");
// Sends an activity to the sender of the incoming activity.
await turnContext.SendActivityAsync(MessageFactory.Attachment(heroCard.ToAttachment()), cancellationToken);
}
export class MyBot extends TeamsActivityHandler {
constructor() {
super();
// Invoked when a Team Archived event activity is received from the connector. Team Archived.
this.onTeamsTeamArchivedEvent(async (teamInfo: TeamInfo, turnContext: TurnContext, next: () => Promise<void>): Promise<void> => {
const card = CardFactory.heroCard('Team archived', `${teamInfo.name} is the team name`);
const message = MessageFactory.attachment(card);
// Sends an activity to the sender of the incoming activity.
await turnContext.sendActivity(message);
await next();
});
}
}
# Invoked when a Team Archived event activity is received from the connector. Team Archived correspond to the user archiving a team.
async def on_teams_team_archived(
self, team_info: TeamInfo, turn_context: TurnContext
):
# Sends an activity to the sender of the incoming activity.
return await turn_context.send_activity(
MessageFactory.text(f"The team name is {team_info.name}")
)
Equipe desarquivada
O bot receberá uma notificação quando a equipe for instalada e desarquivada. Ele receberá um evento conversationUpdate com eventType.teamUnarchived no objeto channelData.
O código a seguir mostra um exemplo do evento Equipe desarquivada:
protected override async Task OnTeamsTeamUnarchivedAsync(TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
var heroCard = new HeroCard(text: $"{teamInfo.Name} is the team name");
// Sends an activity to the sender of the incoming activity.
await turnContext.SendActivityAsync(MessageFactory.Attachment(heroCard.ToAttachment()), cancellationToken);
}
export class MyBot extends TeamsActivityHandler {
constructor() {
super();
// Invoked when a Team Unarchived event activity is received from the connector. Team.
this.onTeamsTeamUnarchivedEvent(async (teamInfo: TeamInfo, turnContext: TurnContext, next: () => Promise<void>): Promise<void> => {
const card = CardFactory.heroCard('Team archived', `${teamInfo.name} is the team name`);
const message = MessageFactory.attachment(card);
// Sends an activity to the sender of the incoming activity.
await turnContext.sendActivity(message);
await next();
});
}
}
# Invoked when a Team Unarchived event activity is received from the connector. Team Unarchived correspond to the user unarchiving a team.
async def on_teams_team_unarchived(
self, team_info: TeamInfo, turn_context: TurnContext
):
# Sends an activity to the sender of the incoming activity.
return await turn_context.send_activity(
MessageFactory.text(f"The team name is {team_info.name}")
)
Agora que você trabalhou com os eventos de atualização de conversa, você pode entender os eventos de reação da mensagem que ocorrem para diferentes reações a uma mensagem.
Eventos de reação de mensagem
O messageReaction evento é enviado quando um usuário adiciona ou remove as reações a uma mensagem, que foi enviada pelo bot. O replyToId contém a ID da mensagem e o Type é o tipo de reação no formato de texto. Os tipos de reações incluem irritado, coração, gargalhada, curtir, triste e surpreso. Este evento não contém o conteúdo da mensagem original. Se o processamento de reações às suas mensagens for importante para o bot, você deverá armazenar as mensagens ao enviá-las. A tabela a seguir fornece mais informações sobre o tipo de evento e os objetos do conteúdo:
protected override async Task OnReactionsAddedAsync(IList<MessageReaction> messageReactions, ITurnContext<IMessageReactionActivity> turnContext, CancellationToken cancellationToken)
{
foreach (var reaction in messageReactions)
{
var newReaction = $"You reacted with '{reaction.Type}' to the following message: '{turnContext.Activity.ReplyToId}'";
var replyActivity = MessageFactory.Text(newReaction);
// Sends an activity to the sender of the incoming activity.
var resourceResponse = await turnContext.SendActivityAsync(replyActivity, cancellationToken);
}
}
export class MyBot extends TeamsActivityHandler {
constructor() {
super();
// Override this in a derived class to provide logic for when reactions to a previous activity.
this.onReactionsAdded(async (context, next) => {
const reactionsAdded = context.activity.reactionsAdded;
if (reactionsAdded && reactionsAdded.length > 0) {
for (let i = 0; i < reactionsAdded.length; i++) {
const reaction = reactionsAdded[i];
const newReaction = `You reacted with '${reaction.type}' to the following message: '${context.activity.replyToId}'`;
// Sends an activity to the sender of the incoming activity.
const resourceResponse = context.sendActivity(newReaction);
// Save information about the sent message and its ID (resourceResponse.id).
}
}
});
}
}
# Override this in a derived class to provide logic for when reactions to a previous activity are added to the conversation.
async def on_reactions_added(
self, message_reactions: List[MessageReaction], turn_context: TurnContext
):
for reaction in message_reactions:
activity = await self._log.find(turn_context.activity.reply_to_id)
if not activity:
# Sends an activity to the sender of the incoming activity.
await self._send_message_and_log_activity_id(
turn_context,
f"Activity {turn_context.activity.reply_to_id} not found in log",
)
else:
# Sends an activity to the sender of the incoming activity.
await self._send_message_and_log_activity_id(
turn_context,
f"You added '{reaction.type}' regarding '{activity.text}'",
)
return
Reações removidas da mensagem do bot
O código a seguir mostra um exemplo de reações removidas da mensagem do bot:
protected override async Task OnReactionsRemovedAsync(IList<MessageReaction> messageReactions, ITurnContext<IMessageReactionActivity> turnContext, CancellationToken cancellationToken)
{
foreach (var reaction in messageReactions)
{
var newReaction = $"You removed the reaction '{reaction.Type}' from the following message: '{turnContext.Activity.ReplyToId}'";
var replyActivity = MessageFactory.Text(newReaction);
// Sends an activity to the sender of the incoming activity.
var resourceResponse = await turnContext.SendActivityAsync(replyActivity, cancellationToken);
}
}
export class MyBot extends TeamsActivityHandler {
constructor() {
super();
// Override this in a derived class to provide logic for when reactions to a previous activity.
this.onReactionsRemoved(async(context,next)=>{
const reactionsRemoved = context.activity.reactionsRemoved;
if (reactionsRemoved && reactionsRemoved.length > 0) {
for (let i = 0; i < reactionsRemoved.length; i++) {
const reaction = reactionsRemoved[i];
const newReaction = `You removed the reaction '${reaction.type}' from the message: '${context.activity.replyToId}'`;
// Sends an activity to the sender of the incoming activity.
const resourceResponse = context.sendActivity(newReaction);
// Save information about the sent message and its ID (resourceResponse.id).
}
}
});
}
}
# Override this in a derived class to provide logic specific to removed activities.
async def on_reactions_removed(
self, message_reactions: List[MessageReaction], turn_context: TurnContext
):
for reaction in message_reactions:
activity = await self._log.find(turn_context.activity.reply_to_id)
if not activity:
# Sends an activity to the sender of the incoming activity.
await self._send_message_and_log_activity_id(
turn_context,
f"Activity {turn_context.activity.reply_to_id} not found in log",
)
else:
# Sends an activity to the sender of the incoming activity.
await self._send_message_and_log_activity_id(
turn_context,
f"You removed '{reaction.type}' regarding '{activity.text}'",
)
return
Evento de atualização de instalação
O bot receberá um evento installationUpdate quando você instalar um bot em uma thread da conversa. A desinstalação do bot da thread também disparará o evento. Ao instalar um bot, o campo ação no evento será definido como adicionar, e quando o bot for desinstalado, o campo ação será definido como remover.
Observação
Quando você atualiza um aplicativo, o bot recebe o installationUpdate evento apenas para adicionar ou remover um bot do manifesto. Para todos os outros casos, o installationUpdate evento não é disparado. O campo ação será definido como add-upgrade se você adicionar um bot ou remove-upgrade se você remover um bot.
Evento Instalar atualização
Use o evento installationUpdate para enviar uma mensagem introdutória do bot na instalação. Esse evento ajuda você a atender aos seus requisitos de privacidade e retenção. Você também poderá limpar e excluir dados de usuário ou thread quando o bot for desinstalado.
Semelhante ao evento enviado quando o conversationUpdate bot é adicionado a uma equipe, o conversation.id do installationUpdate evento é definido como a ID do canal selecionado por um usuário durante a instalação do aplicativo ou o canal em que a instalação ocorreu. A id representa o canal em que o usuário pretende que o bot opere e deve ser usado pelo bot ao enviar uma mensagem de boas-vindas. Para cenários em que a ID do canal Geral é explicitamente necessária, você pode obtê-la no team.idchannelData.
Neste exemplo, as conversation.idconversationUpdate atividades e installationUpdate serão definidas como a ID do canal Response na equipe de demonstração do Daves.
Observação
A ID do canal selecionada só é definida em installationUpdateadicionar eventos enviados quando um aplicativo é instalado em uma equipe.
async onInstallationUpdateActivity(context: TurnContext) {
var activity = context.activity.action;
if(activity == "Add") {
// Sends an activity to the sender of the incoming activity to add.
await context.sendActivity(MessageFactory.text("Added"));
}
else {
// Sends an activity to the sender of the incoming activity to uninstalled.
await context.sendActivity(MessageFactory.text("Uninstalled"));
}
}
# Override this in a derived class to provide logic specific to InstallationUpdate activities.
async def on_installation_update(self, turn_context: TurnContext):
if turn_context.activity.action == "add":
# Sends an activity to the sender of the incoming activity to add.
await turn_context.send_activity(MessageFactory.text("Added"))
else:
# Sends an activity to the sender of the incoming activity to uninstalled.
await turn_context.send_activity(MessageFactory.text("Uninstalled"))
Comportamento de desinstalação do aplicativo pessoal com o bot
Quando você desinstalar um aplicativo, o bot também será desinstalado. Quando um usuário enviar uma mensagem para seu aplicativo, ele receberá um código de resposta 403. Seu bot receberá um código de resposta 403 para novas mensagens postadas pelo bot. O comportamento pós-desinstalação de bots no escopo pessoal com os escopos do Teams e do groupChat agora está alinhado. Você não pode enviar ou receber mensagens depois que um aplicativo foi desinstalado.
Manipulação de eventos para instalar e desinstalar eventos
Quando você usa esses eventos de instalação e desinstalação, há algumas instâncias em que os bots dão exceções ao recebimento de eventos inesperados do Teams, que ocorrem nos seguintes casos:
Você projeta seu bot sem o SDK do Microsoft Bot Framework e, como resultado, o bot fornece uma exceção ao receber um evento inesperado.
Você projeta seu bot com o SDK do Microsoft Bot Framework e seleciona alterar o comportamento padrão do evento substituindo o identificador de evento base.
É importante saber que novos eventos podem ser adicionados a qualquer momento no futuro e seu bot começa a recebê-los. Portanto, você deve projetar considerando a possibilidade de receber eventos inesperados. Se você estiver usando o SDK do Bot Framework, o bot responderá automaticamente com um 200 – OK a todos os eventos que você não optar por manipular.
Manipulação de erros em eventos de conversa
Quando um bot encontra um erro ao lidar com diferentes eventos ou atividades, não envie mensagens que não tenham nenhum contexto significativo para a conversa, conforme mostrado na captura de tela a seguir:
Na fase de desenvolvimento, é sempre útil enviar mensagens significativas em conversas, que fornecem detalhes adicionais sobre um erro específico para melhor depuração. No entanto, no ambiente de produção, você deve registrar os erros ou eventos para Aplicativo Azure Insights. Para obter mais informações, consulte Adicionar telemetria ao bot.
Exemplo de código
Nome de exemplo
Descrição
.NET
Node.js
Python
Manifesto
Bot de conversa
Este exemplo mostra como usar diferentes eventos de conversa de bot disponíveis no Bot Framework v4 para escopo pessoal e de equipes.
A fonte deste conteúdo pode ser encontrada no GitHub, onde você também pode criar e revisar problemas e solicitações de pull. Para obter mais informações, confira o nosso guia para colaboradores.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulte https://aka.ms/ContentUserFeedback.