Les exemples de code de cette section sont basés sur la version 4.6 et les versions ultérieures du Kit de développement logiciel (SDK) Bot Framework. Si vous recherchez de la documentation pour les versions antérieures, consultez la section bots - Kit de développement logiciel (SDK) v3 dans le dossier Kits de développement logiciel (SDK) hérités de la documentation.
Lorsque vous créez vos bots conversationnels pour Microsoft Teams, vous pouvez utiliser des événements de conversation. Teams envoie des notifications à votre bot pour les événements de conversation qui se produisent dans les étendues où votre bot est actif. Vous pouvez capturer ces événements dans votre code et effectuer les actions suivantes :
Déclenchez un message de bienvenue lorsque votre bot est ajouté à une équipe.
Déclenchez un message de bienvenue lorsqu’un nouveau membre d’équipe est ajouté ou supprimé.
Déclenchez une notification lorsqu’un canal est créé, renommé ou supprimé.
Déclenchez une notification lorsqu’un message de bot est aimé par un utilisateur.
Identifiez le canal par défaut de votre bot à partir de l’entrée utilisateur (sélection) lors de l’installation.
La vidéo suivante montre comment un bot de conversation peut améliorer l’engagement client grâce à des interactions fluides et intelligentes :
Événements de mise à jour de conversation
Vous pouvez utiliser des événements de mise à jour de conversation pour fournir de meilleures notifications et des actions de bot efficaces.
Importante
Vous pouvez ajouter de nouveaux événements à tout moment et votre bot commence à les recevoir.
Vous devez concevoir votre bot pour recevoir des événements inattendus.
Si vous utilisez le SDK Bot Framework, votre bot répond automatiquement avec un 200 - OK à tous les événements que vous choisissez de ne pas gérer.
Lorsqu’un client Azure Communication Services (ACS) rejoint ou quitte la réunion Teams, aucun événement de mise à jour de conversation n’est déclenché.
Un bot reçoit un événement conversationUpdate dans l’un des cas suivants :
Lorsque le bot est ajouté à une conversation.
D’autres membres sont ajoutés ou supprimés d’une conversation.
Les métadonnées de conversation ont changé.
L’événement conversationUpdate est envoyé à votre robot lorsqu’il reçoit des informations sur les mises à jour d’appartenance pour les équipes dans lesquelles il a été ajouté. Il reçoit également une mise à jour lorsqu’elle a été ajoutée pour la première fois pour les conversations personnelles.
Le tableau suivant affiche une liste des événements de mise à jour de conversation Teams avec plus de détails :
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 renommé
L’événement channelRenamed est envoyé à votre bot chaque fois qu’un canal est renommé dans une équipe où votre bot est installé.
Le code suivant montre un exemple d’événement renommé de canal :
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 restauré
L’événement channelRestored est envoyé à votre bot, chaque fois qu’un canal précédemment supprimé est restauré dans une équipe où votre bot est déjà installé.
Le code suivant montre un exemple d’événement de restauration de canal :
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}"
)
)
Membres ajoutés
Un événement de membre ajouté est envoyé à votre bot dans les scénarios suivants :
Lorsque le bot, lui-même, est installé et ajouté à une conversation
Dans le contexte de l’équipe, le conversation.id de l’activité est défini sur le id du canal sélectionné par l’utilisateur lors de l’installation de l’application ou sur le canal sur lequel le bot a été installé.
Lorsqu’un utilisateur est ajouté à une conversation où le bot est installé
Les ID d’utilisateur reçus dans la charge utile d’événement sont propres au bot et peuvent être mis en cache pour une utilisation ultérieure, par exemple pour envoyer directement un message à un utilisateur.
L’activité eventType ajoutée au membre est définie sur teamMemberAdded lorsque l’événement est envoyé à partir d’un contexte d’équipe. Pour déterminer si le nouveau membre ajouté était le bot lui-même ou un utilisateur, case activée l’objet Activity du turnContext. Si la MembersAdded liste contient un objet où id est identique au id champ de l’objet Recipient , le membre ajouté est le bot, sinon il s’agit d’un utilisateur. Le du id bot est au 28:<MicrosoftAppId>format .
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();
});
}
}
Message que votre bot reçoit quand il est ajouté à une équipe.
Remarque
Dans cette charge utile, conversation.id et channelData.settings.selectedChannel.id sont les ID du canal que l’utilisateur a sélectionné pendant l’installation de l’application ou à partir duquel l’installation a été déclenchée.
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
Membres supprimés
Un événement de membre supprimé est envoyé à votre bot dans les scénarios suivants :
Lorsque le bot, lui-même, est désinstallé et supprimé d’une conversation.
Lorsqu’un utilisateur est supprimé d’une conversation où le bot est installé.
L’activité eventType supprimée du membre est définie sur teamMemberRemoved lorsque l’événement est envoyé à partir d’un contexte d’équipe. Pour déterminer si le nouveau membre supprimé était le bot lui-même ou un utilisateur, vérifiez l’objet Activity du turnContext. Si la MembersRemoved liste contient un objet où id est identique au id champ de l’objet Recipient , le membre ajouté est le bot, sinon il s’agit d’un utilisateur. L’ID du bot est au 28:<MicrosoftAppId>format .
Remarque
Lorsqu’un utilisateur est définitivement supprimé d’un locataire, membersRemoved conversationUpdate événement est déclenché.
Le code suivant montre un exemple d’événement de suppression des membres de l’équipe :
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();
});
}
}
L’objet channelData dans l’exemple de charge utile suivant est basé sur l’ajout d’un membre à une équipe plutôt qu’à une conversation de groupe, ou sur l’initialisation d’une nouvelle conversation un-à-un :
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
Équipe renommée
Votre bot est averti lorsque l’équipe est renommée. Il reçoit un événement de conversationUpdate avec eventType.teamRenamed dans l’objet channelData .
Le code suivant montre un exemple d’événement renommé par l’équipe :
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}")
)
Équipe supprimée
Le bot reçoit une notification lorsque l’équipe est supprimée. Il reçoit un conversationUpdate événement avec eventType.teamDeleted l’objet channelData .
Le code suivant montre un exemple d’événement supprimé par l’équipe :
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.
)
Équipe restaurée
Le bot reçoit une notification lorsqu’une équipe est restaurée après sa suppression. Il reçoit un événement de conversationUpdate avec eventType.teamrestored dans l’objet channelData .
Le code suivant montre un exemple d’événement restauré par l’équipe :
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}")
)
Équipe archivée
Le bot reçoit une notification lorsque l’équipe est installée et archivée. Il reçoit un événement de conversationUpdate avec eventType.teamarchived dans l’objet channelData .
Le code suivant montre un exemple d’événement archivé d’équipe :
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}")
)
Équipe non archivée
Le bot reçoit une notification lorsque l’équipe est installée et non archivée. Il reçoit un événement de conversationUpdate avec eventType.teamUnarchived dans l’objet channelData .
Le code suivant montre un exemple d’événement non archivé d’équipe :
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}")
)
Maintenant que vous avez travaillé avec les événements de mise à jour de conversation, vous pouvez comprendre les événements de réaction de message qui se produisent pour différentes réactions à un message.
Événements de réaction aux messages
L’événement messageReaction est envoyé lorsqu’un utilisateur ajoute ou supprime des réactions à un message envoyé par votre bot. Le replyToId contient l’ID du message, et le Type est le type de réaction au format texte. Les types de réactions sont les suivants : en colère, cœur, rire, genre, triste et surprise. Cet événement ne contient pas le contenu du message d’origine. Si le traitement des réactions à vos messages est important pour votre bot, vous devez stocker les messages lorsque vous les envoyez. Le tableau suivant fournit plus d’informations sur le type d’événement et les objets de charge utile :
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
Réactions supprimées du message du bot
Le code suivant montre un exemple de réactions supprimées du message du 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
Événement de mise à jour d’installation
Le bot reçoit un événement installationUpdate lorsque vous installez un bot sur un thread de conversation. La désinstallation du bot du thread déclenche également l’événement. Lors de l’installation d’un bot, le champ d’action de l’événement est défini pour être ajouté et, lorsque le bot est désinstallé, le champ action est défini pour être supprimé.
Remarque
Lorsque vous mettez à niveau une application, le bot reçoit l’événement installationUpdate uniquement pour ajouter ou supprimer un bot du manifeste. Dans tous les autres cas, l’événement installationUpdate n’est pas déclenché. Le champ d’action est défini sur ajouter-mettre à jour si vous ajoutez un bot ou supprimer-mettre à jour si vous supprimez un bot.
Installer l’événement de mise à jour
Utilisez l’événement installationUpdate pour envoyer un message d’introduction à partir de votre bot lors de l’installation. Cet événement vous aide à répondre à vos exigences en matière de confidentialité et de conservation des données. Vous pouvez également nettoyer et supprimer des données d’utilisateur ou de thread lorsque le bot est désinstallé.
À l’instar de l’événement conversationUpdate envoyé lors de l’ajout d’un bot à une équipe, le conversation.id de l’événement installationUpdate est défini sur l’ID du canal sélectionné par un utilisateur lors de l’installation de l’application ou sur le canal où l’installation s’est produite. L’ID représente le canal dans lequel l’utilisateur a l’intention de faire fonctionner le bot et doit être utilisé par le bot lors de l’envoi d’un message de bienvenue. Pour les scénarios où l’ID du canal Général est explicitement requis, vous pouvez l’obtenir à partir de team.id dans channelData.
Dans cet exemple, le conversation.id des conversationUpdate activités et installationUpdate est défini sur l’ID du canal de réponse dans l’équipe de démonstration Daves.
Remarque
L’ID de canal sélectionné est défini uniquement sur installationUpdate les événements d’ajout envoyés lorsqu’une application est installée dans une équipe.
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"))
Comportement de désinstallation pour une application personnelle avec un bot
Lorsque vous désinstallez une application, le bot est également désinstallé. Lorsqu’un utilisateur envoie un message à votre application, il reçoit un code de réponse 403. Votre bot reçoit un code de réponse 403 pour les nouveaux messages publiés par votre bot. Le comportement de post-désinstallation pour les bots dans l’étendue personnelle avec les étendues Teams et groupChat est désormais aligné. Vous ne pouvez pas envoyer ou recevoir de messages après la désinstallation d’une application.
Gestion des événements pour les événements d’installation et de désinstallation
Lorsque vous utilisez ces événements d’installation et de désinstallation, il existe des cas où les bots accordent des exceptions lors de la réception d’événements inattendus de Teams, ce qui se produit dans les cas suivants :
Vous générez votre bot sans le kit de développement logiciel (SDK) Microsoft Bot Framework et, par conséquent, le bot donne une exception lors de la réception d’un événement inattendu.
Vous générez votre bot avec le SDK Microsoft Bot Framework et vous choisissez de modifier le comportement d’événement par défaut en remplaçant le handle d’événement de base.
Il est important de savoir que de nouveaux événements peuvent être ajoutés à tout moment à l’avenir et que votre bot commence à les recevoir. Vous devez donc concevoir la possibilité de recevoir des événements inattendus. Si vous utilisez le Kit de développement logiciel (SDK) Bot Framework, votre bot répond automatiquement avec une valeur 200 – OK aux événements que vous ne choisissez pas de gérer.
Gestion des erreurs dans les événements de conversation
Lorsqu’un bot rencontre une erreur lors de la gestion d’événements ou d’activités différents, n’envoyez pas de messages sans contexte significatif à la conversation, comme illustré dans la capture d’écran suivante :
Dans la phase de développement, il est toujours utile d’envoyer des messages significatifs dans les conversations, qui fournissent des détails supplémentaires sur une erreur spécifique pour un meilleur débogage. Toutefois, dans l’environnement de production, vous devez enregistrer les erreurs ou les événements dans Azure Application Insights. Pour plus d’informations, consultez Ajouter des données de télémétrie à votre bot.
Exemple de code
Exemple de nom
Description
.NET
Node.js
Python
Manifeste
Bot de conversation
Cet exemple montre comment utiliser différents événements de conversation de bot disponibles dans Bot Framework v4 pour l’étendue personnelle et teams.
La source de ce contenu se trouve sur GitHub, où vous pouvez également créer et examiner les problèmes et les demandes de tirage. Pour plus d’informations, consultez notre guide du contributeur.