/ Bot Framework

How to: enviar mensajes utilizando el Bot Connector

Recientemente me ha tocado interactuar con el bot framework v4 y me han sorprendido los cambios que le han hecho para soportar mejor las conversaciones y los diferentes diálogos que se pueden sostener con el usuario, además del cambio que se ha realizado para que los proyectos se ejecuten en ASP.Net Core abre más el abanico de servidores en los que se podría ejecutar este tipo de proyectos.

En mis andanzas utilizando este framework me he encontrado que en algunas ocasiones será necesario enviar mensajes a un chat de forma directa y sin necesidad de pasar por el portal dónde tienes publicado tu bot, un ejemplo de estos escenarios podría ser el querer enviar mensajes a usuarios en un canal personal o de grupo para recordar un proceso que el usuario solicito se pospusiera, para este tipo de escenarios se puede hacer uso del Bot Connector para facilitar el trabajo un poco más ya que siempre se puede utilizar el REST API, la principal ventaja de utilizar el bot Connector es que el paquete nuget contiene ya todas las clases necesarias para generar el Activity que se le enviará al Bot Service.

Para enviar mensajes es necesario que se tenga información de la conversación con la que deseas interactuar, seguramente te preguntarás cómo obtener esa información, la forma más sencilla y segura es almacenar la información de la conversación la primera vez que se genera la interacción con el bot aunque es posible que tengas que manejar el caso en el que el ServiceUrl cambie (un evento poco frecuente según la documentación).
bot-connector

Hora del código

Para empezar, necesitamos generar el ConnectorClient donde pasaremos el id del bot y el secret del bot ambos datos deben estar en los settings de tu App Service.

static ConnectorClient GetConnectorClient()
        {

            MicrosoftAppCredentials appCredentials =
               new MicrosoftAppCredentials(botClientId, botSecret);
            MicrosoftAppCredentials.TrustServiceUrl(serviceUrl);

            Uri uri = new Uri(serviceUrl);
            ConnectorClient connectorClient =
                new ConnectorClient(uri, appCredentials);

            return connectorClient;
        }

Posteriormente crearemos un método para enviar el mensaje en el cual pasaremos toda la información referente a la conversación, recuerda también especificar el canal que desees que se utilice.

private static async Task SendMessageAsync(
            ConnectorClient connectorClient,
            string conversationId,
            string recipientId,
            string fromId,
            string message)
        {
            Activity messageActivity =
                new Activity();
            messageActivity.Type = ActivityTypes.Message;
            messageActivity.Text = message;
            messageActivity.ChannelId = Channels.Webchat;
            messageActivity.ServiceUrl = serviceUrl;
            messageActivity.Conversation = new ConversationAccount()
            {
                Id = conversationId
            };
            messageActivity.Recipient = new ChannelAccount()
            {
                Id = recipientId
            };
            messageActivity.From = new ChannelAccount()
            {
                Id = fromId
            };

            await connectorClient
                .Conversations
                .SendToConversationAsync(messageActivity);

        }

En este ejemplo se utilizará una aplicación de consola para enviar el mensaje, pero tu puedes hacerlo desde tu aplicación web o cliente.

private static string botClientId = "bot_id";
        private static string botSecret = "bot_secret";
        //Tiende a ser constante, pero puede cambiar
        private static string serviceUrl = "service_url";
        private static string conversationId = "conversation_id";
        private static string recipientId = "recipient_Id";
        private static string fromId = "from_Id";

        static async Task Main(string[] args)
        {
            ConnectorClient connectorClient = GetConnectorClient();
            try
            {
                await SendMessageAsync(connectorClient,
                    conversationId,
                    recipientId,
                    fromId,
                    "Mensaje desde la consola.");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }

        }

Como siempre te dejo el código del ejemplo en mi repositorio en github

Ahora que ya sabes como enviar mensajes a una conversación podrías agregar funcionalidad para que tu usuario reciba recordatorios de tareas que le ha pedido a tu bot que posponga, la forma más sencilla la he encontrado en stackoverflow utilizando colas con un delay y una Azure Function que lea el mensaje de la cola una vez que está visible y ejecuta el envío del mensaje.

Me despido, pero me gustaría preguntarte ¿Te ha tocado algún escenario similar? ¿Cómo lo resolviste?
¡Saludos!
@SaturPimentel

Referencias

Bot Connector
CreateMessage

Saturnino Pimentel

Saturnino Pimentel

Microsoft MVP, consultor, blogger y conferencista. Saturnino es el cofundador de la comunidad de programadores c# y el meetup de c# de la ciudad de México además de participar con otras comunidades.

Read More

Suscríbete a la lista de correos :)

* indicates required