Los ejemplos de código de esta sección se basan en la versión 4.6 y versiones posteriores del SDK de Bot Framework. Si busca documentación para versiones anteriores, consulte la sección bots - v3 SDK en la carpeta SDK heredados de la documentación.
Al crear bots conversacionales para Microsoft Teams, puede trabajar con eventos de conversación. Microsoft Teams envía notificaciones al bot para los eventos que se suceden en ámbitos donde el bot está activo. Puede capturar estos eventos en el código y tomar medidas como las siguientes:
Desencadenar un mensaje de bienvenida cuando se añade el bot a un equipo;
Desencadenar un mensaje de bienvenida cuando se añade o quita un nuevo miembro del equipo;
Desencadenar una notificación cuando se crea, cambia el nombre o elimina un canal;
Desencadenar una notificación cuando a un usuario le gusta un mensaje de bot.
Identifique el canal predeterminado del bot a partir de la entrada del usuario (selección) durante la instalación.
En el vídeo siguiente se muestra cómo un bot de conversación puede mejorar la interacción de los clientes a través de interacciones fluidas e inteligentes:
Eventos de actualización de conversación
Puede usar eventos de actualización de conversación para proporcionar mejores notificaciones y acciones de bot eficaces.
Importante
Puede agregar nuevos eventos en cualquier momento y el bot comienza a recibirlos.
Debe diseñar el bot para recibir eventos inesperados.
Si usa el SDK de Bot Framework, el bot responde automáticamente con un 200 - OK a los eventos que elija no controlar.
Cuando un cliente de Azure Communication Services (ACS) se une o deja la reunión de Teams, no se desencadena ningún evento de actualización de conversación.
Un bot recibe un conversationUpdate evento en cualquiera de los casos siguientes:
Cuando el bot se agrega a una conversación.
Otros miembros se agregan o quitan de una conversación.
Los metadatos de conversación han cambiado.
El evento conversationUpdate se envía al bot cuando recibe información sobre las actualizaciones de suscripción de los equipos donde se ha agregado. También recibe una actualización cuando se ha agregado por primera vez, específicamente para conversaciones personales.
En la tabla siguiente se muestra una lista de los eventos de conversación actualizados de Teams con más detalles:
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}"
)
)
Se cambió el nombre del canal
El channelRenamed evento se envía al bot cada vez que se cambia el nombre de un canal en un equipo donde está instalado el bot.
En el código siguiente se muestra un ejemplo de un evento con el nombre cambiado 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_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}"
)
)
Miembros agregados
Se envía un evento agregado de miembro al bot en los siguientes escenarios:
Cuando el bot, en sí mismo, se instala y se agrega a una conversación
En el contexto del equipo, el conversation.id de la actividad se establece en el id del canal seleccionado por el usuario durante la instalación de la aplicación o en el canal donde se instaló el bot.
Cuando se agrega un usuario a una conversación en la que está instalado el bot
Los identificadores de usuario recibidos en la carga del evento son únicos para el bot y se pueden almacenar en caché para su uso futuro, como la mensajería directa de un usuario.
La actividad eventType agregada de miembro se establece en teamMemberAdded cuando el evento se envía desde un contexto de equipo. Para determinar si el nuevo miembro agregado era el propio bot o un usuario, compruebe el Activity objeto de turnContext. Si la MembersAdded lista contiene un objeto donde id es el mismo que el id campo del Recipient objeto, el miembro agregado es el bot; de lo contrario, es un usuario. El bot tiene id el formato 28:<MicrosoftAppId>.
Sugerencia
Use el InstallationUpdate evento para determinar cuándo se agrega o quita el bot de una conversación.
En el código siguiente se muestra un ejemplo de un evento agregado por miembros del equipo:
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();
});
}
}
El mensaje que recibe el bot cuando el bot se agrega a un equipo.
Nota:
En esta carga, conversation.id y channelData.settings.selectedChannel.id son los identificadores del canal que el usuario seleccionó durante la instalación de la aplicación o desde el que se desencadenó la instalación.
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
Miembros eliminados
Se envía un evento quitado de miembro al bot en los siguientes escenarios:
Cuando el bot, en sí mismo, se desinstala y se quita de una conversación.
Cuando se quita un usuario de una conversación en la que está instalado el bot.
La actividad eventType quitada de miembro se establece en teamMemberRemoved cuando el evento se envía desde un contexto de equipo. Para determinar si el nuevo miembro eliminado era el propio bot o un usuario, compruebe el objeto Activity de turnContext. Si la MembersRemoved lista contiene un objeto donde id es el mismo que el id campo del Recipient objeto, el miembro agregado es el bot; de lo contrario, es un usuario. El identificador del bot tiene el formato 28:<MicrosoftAppId>.
Nota:
Cuando un usuario se elimina permanentemente de un inquilino, se desencadena el evento membersRemoved conversationUpdate.
En el código siguiente se muestra un ejemplo de un evento quitado de miembros del equipo:
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();
});
}
}
El objeto channelData del siguiente ejemplo de carga se basa en agregar un miembro a un equipo en lugar de un chat de grupo o iniciar una nueva conversación 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
Se cambió el nombre del equipo
El bot recibe una notificación cuando se cambia el nombre del equipo. Recibe un evento conversationUpdate con eventType.teamRenamed en el objeto channelData.
En el código siguiente se muestra un ejemplo de un evento cuyo nombre ha cambiado el equipo:
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}")
)
Equipo eliminado
El bot recibe una notificación cuando se elimina el equipo. Recibe un evento conversationUpdate con eventType.teamDeleted en el objeto channelData.
El código siguiente muestra un ejemplo de un evento eliminado por el equipo:
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.
)
Equipo restaurado
El bot recibe una notificación cuando se restaura un equipo después de eliminarse. Recibe un evento conversationUpdate con eventType.teamrestored en el objeto channelData.
En el código siguiente se muestra un ejemplo de un evento restaurado por el equipo:
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}")
)
Equipo archivado
El bot recibe una notificación cuando el equipo está instalado y archivado. Recibe un evento conversationUpdate con eventType.teamarchived en el objeto channelData.
En el código siguiente se muestra un ejemplo de evento archivado por el equipo:
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}")
)
Equipo desarchivado
El bot recibe una notificación cuando el equipo está instalado y desarchivo. Recibe un evento conversationUpdate con eventType.teamUnarchived en el objeto channelData.
En el código siguiente se muestra un ejemplo de un evento noarchivo de equipo:
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}")
)
Ahora que ha trabajado con los eventos de actualización de conversación, puede comprender los eventos de reacción del mensaje que se producen para diferentes reacciones a un mensaje.
Eventos de reacción de mensajes
El messageReaction evento se envía cuando un usuario agrega o quita las reacciones a un mensaje que envió el bot.
replyToId contiene el identificador del mensaje y Type es el tipo de reacción en formato de texto. Los tipos de reacciones incluyen enfado, corazón, risa, me gusta, triste y sorprendido. Este evento no contiene el contenido del mensaje original. Si el procesamiento de reacciones a los mensajes es importante para el bot, debe almacenarlos cuando los envíe. En la tabla siguiente se proporciona más información sobre el tipo de evento y los objetos de carga:
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
Reacciones eliminadas del mensaje del bot
En el código siguiente se muestra un ejemplo de reacciones eliminadas del mensaje del 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 actualización de instalación
El bot recibe un evento installationUpdate al instalar un bot en un subproceso de conversación. La desinstalación del bot desde el subproceso también desencadena el evento. Al instalar un bot, el campo de acción del evento se establece en agregar y, cuando se desinstala el bot, el campo de acción se establece en remove.
Nota:
Al actualizar una aplicación, el bot recibe el installationUpdate evento solo para agregar o quitar un bot del manifiesto. En todos los demás casos, el installationUpdate evento no se desencadena. El campo de acción se establece en agregar actualización si agrega un bot o eliminar actualización si quita un bot.
Instalar evento de actualización
Use el evento installationUpdate para enviar un mensaje de introducción desde el bot durante la instalación. Este evento le ayuda a cumplir sus requisitos de privacidad y retención de datos. También puede limpiar y eliminar datos de usuario o subproceso cuando se desinstala el bot.
De forma similar al conversationUpdate evento que se envía cuando se agrega el bot a un equipo, el conversation.id del installationUpdate evento se establece en el identificador del canal seleccionado por un usuario durante la instalación de la aplicación o en el canal donde se produjo la instalación. El identificador representa el canal donde el usuario pretende que el bot funcione y el bot debe usarlo al enviar un mensaje de bienvenida. Para escenarios en los que se requiere explícitamente el identificador del canal General, puede obtenerlo desde team.id en channelData.
En este ejemplo, el conversation.id de las conversationUpdate actividades y installationUpdate se establece en el identificador del canal de respuesta en el equipo de demostración de Daves.
Nota:
El identificador de canal seleccionado solo se establece en agregarinstallationUpdate eventos que se envían cuando se instala una aplicación en un equipo.
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"))
Comportamiento de desinstalación de la aplicación personal con bot
Al desinstalar una aplicación, también se desinstala el bot. Cuando un usuario envía un mensaje a la aplicación, recibe un código de respuesta 403. El bot recibe un código de respuesta 403 para los nuevos mensajes publicados por el bot. El comportamiento posterior a la desinstalación de los bots en el ámbito personal con los ámbitos Teams y groupChat ahora está alineado. No puede enviar ni recibir mensajes después de desinstalar una aplicación.
Control de eventos para eventos de instalación y desinstalación
Cuando se usan los eventos de instalación y desinstalación, hay algunas instancias en las que los bots dan excepciones en la recepción de eventos inesperados de Teams, que se producen en los casos siguientes:
El bot se compila sin el SDK de Microsoft Bot Framework y, como resultado, el bot proporciona una excepción al recibir un evento inesperado.
Compile el bot con el SDK de Microsoft Bot Framework y seleccione modificar el comportamiento del evento predeterminado reemplazando el identificador de eventos base.
Es importante saber que los nuevos eventos se pueden agregar en cualquier momento en el futuro y que el bot comienza a recibirlos. Por lo tanto, debe diseñar para la posibilidad de recibir eventos inesperados. Si usa el SDK de Bot Framework, el bot responde automáticamente con un valor 200 : correcto para los eventos que no elija controlar.
Control de errores en eventos de conversación
Cuando un bot encuentra un error al controlar diferentes eventos o actividades, no envíe mensajes que no tengan ningún contexto significativo a la conversación, como se muestra en la captura de pantalla siguiente:
En la fase de desarrollo, siempre resulta útil enviar mensajes significativos en las conversaciones, lo que proporciona detalles adicionales sobre un error específico para una mejor depuración. Sin embargo, en el entorno de producción, debe registrar los errores o eventos en Aplicación de Azure Insights. Para obtener más información, consulte Adición de telemetría al bot.
Ejemplo de código
Nombre de ejemplo
Descripción
.NET
Node.js
Python
Manifiesto
Bot conversacional
En este ejemplo se muestra cómo usar diferentes eventos de conversación de bot disponibles en Bot Framework v4 para el ámbito personal y de teams.
El origen de este contenido se puede encontrar en GitHub, donde también puede crear y revisar problemas y solicitudes de incorporación de cambios. Para más información, consulte nuestra guía para colaboradores.