Hola, chicos,
¡Buen día!

En esta publicación demostraré cómo integrar la base de datos con el Flojo y enviar mensajes usando CLR (C#), que es el principal competidor de Ryver, en el cual ya he demostrado cómo hacer esta misma integración en el post SQL Server: cómo integrar la base de datos con Ryver y enviar mensajes usando CLR (C#).

Si no sabes o no sabes cómo utilizar el CLR en SQL Server, descubre cómo accediendo al post Introducción a SQL CLR (Common Language Runtime) en SQL Server.

Si está utilizando SQL Server 2017 y desea utilizar solo comandos DBMS nativos en lugar de tener que crear una biblioteca SQLCLR (C#), aún puede crear sus alertas usando Slack con la solución Python que compartí en la publicación. SQL Server: cómo integrar la base de datos con Slack y enviar mensajes usando Python y sp_execute_external_script.

¿Qué es la holgura?

Para aquellos que no lo saben, el Flojo es uno de los comunicadores corporativos más famosos y utilizados en todo el mundo, principal competidor de Ryver y pretende sustituir la comunicación vía correo electrónico con grupos privados y públicos (dentro del equipo) centrados en determinados equipos y/o temas. Puedes crear grupos públicos, donde todo tu equipo puede interactuar y colaborar, y grupos privados para cada sector, donde solo los del grupo pueden ver los mensajes.

Slack te permite responder correos electrónicos a través de la propia herramienta, enviar y compartir archivos, enviar mensajes privados, instalar varios complementos para agregar nuevas funciones y mucho más.

En el plan gratuito la búsqueda de mensajes solo recupera los últimos 10 mil mensajes, el límite de almacenamiento es de 5 GB y algunas otras limitaciones que puedes consultar en este enlace.

¿Dónde y cómo puedo utilizar Slack en mi empresa?

Esta característica es especialmente útil para crear equipos en tu empresa y generar alertas y seguimiento por equipo, donde cada equipo solo recibe alertas relacionadas con sus actividades. Además, puede utilizar grupos abiertos para enviar boletines y notificaciones que sean relevantes para toda la empresa. Todo ello, sin coste alguno y podrás recibirlo por correo electrónico, visualizarlo en la web y en tu smartphone.

Otra forma interesante de utilizar Slack es enviar el seguimiento de los objetivos de ventas al sector comercial, de modo que los gerentes regionales y locales puedan monitorear el desempeño del equipo de ventas en tiempo real, sin tener que consultar y abrir informes, estén donde estén, incluso fuera de la empresa.

Si su empresa adopta Slack, el departamento de recursos humanos puede utilizar el servicio para enviar mensajes y boletines a los empleados. Enviar mensajes navideños, un mensaje especial por el cumpleaños del empleado, etc.

De todos modos, la ventaja de Slack es que se puede enviar de varias formas diferentes (correo electrónico, web, teléfono inteligente), estés donde estés, dentro o fuera de la empresa y representa una gran revolución en la forma en que las personas interactúan con la información.

Utilizo Slack donde trabajo como herramienta de comunicación, monitoreo y alertas para rutinas de TI, como fallas críticas en trabajos, problemas de respaldo, corrupción de bases de datos, consultas lentas, bloqueos, etc. Cada vez que falla una rutina crítica, se envía un correo electrónico interno y una notificación a través de Slack, donde llega una notificación Push a mi celular (al igual que WhatsApp) y esté donde esté, estoy consciente de esta falla.

Cómo agregar usuarios a Slack

El primer paso para crear la integración es crear su cuenta de Slack, accediendo a este enlace. Una vez creado, recibirá un correo electrónico para iniciar sesión en su cuenta.

Pantalla de inicio de Slack, con algunos grupos que creé para esta publicación

Para agregar nuevos usuarios, simplemente haga clic en el menú (Su nombre) y seleccione la opción “Invitar personas”

Puede agregar sus contactos desde su cuenta de Google, importar varios contactos en formato CSV y más. Una vez que invite a otras personas, recibirán un enlace para unirse a su equipo y, después de completar el registro, podrán ver los datos a través del navegador web o la aplicación móvil.

Cómo habilitar la API de Slack

Para poder enviar mensajes a través de Slack, necesitamos crear una integración personalizada. Para ello acceda a la URL https://api.slack.com/docs/oauth-test-tokens ha iniciado sesión en la cuenta de usuario que servirá como BOT y enviará mensajes automáticos.

Haga clic en el botón "Crear token".

Copie el token generado en su aplicación. Es con este enorme código (76 caracteres en mi caso) que te autenticarás con la API y podrás enviar tus mensajes a través del CLR (C#).

Cómo integrar la base de datos con Slack

Una vez que ya hayas creado tu cuenta de Slack y hayas registrado el usuario que usarás para enviar mensajes a los equipos, pasemos a la parte interesante: Crear el código .NET (C#) que integrará la base de datos de SQL Server con la API de Slack.

Requisito previo: Utils.cs

using System;

namespace Bibliotecas.Model
{

    public static class Utils
    {

        public static string converteStringWebService(string Ds_Texto)
        {
            
            // Recomendação do site do Slack
            var retorno = Ds_Texto.Replace("<", "<").Replace("&", "&").Replace(">", ">");

            // Quebra de linha
            retorno = retorno.Replace("\\n", "\n");

            // Tratamento do caractere "\"    
            retorno = retorno.Replace(@"\", @"\\");

            // Tratamento de Aspas duplas
            retorno = retorno.Replace(@"""", @"\""");
            
            // Resultado final
            return Uri.EscapeDataString(retorno);
        }
        
    }
    
}

Como requisito previo para utilizar este procedimiento, deberá crear la clase Devolución, disponible en la publicación SQL Server: cómo enviar advertencias y mensajes de error a la base de datos usando CLR (C#) para usar el método Devolución.Error y así, enviar mensajes de error, si se producen. También puedes optar por comentar el código y eliminar llamadas a este método (y también comentar usando Bibliotecas.Model), pero no lo recomiendo, ya que no sabrás cuándo ocurrió un error en tu llamada al SP para enviar mensajes a Slack.

Al igual que con Ryver, para poder enviar mensajes el usuario BOT debe estar agregado a todos los grupos, privados y públicos, ya que él es quien envía los mensajes y no es posible enviar los mensajes si no está en el grupo.

Ahora que tenemos la cuenta creada, el usuario BOT está en los grupos deseados y hemos generado nuestro token, es momento de enviar los mensajes a través de la base de datos con el CLR.

Código fuente de stpEnvia_Mensagem_Slack:

using System;
using System.Data.SqlTypes;
using System.IO;
using System.Net;
using System.Text;
using Bibliotecas.Model;

public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void stpEnvia_Mensagem_Slack(SqlString Ds_Canal, SqlString Ds_Mensagem)
    {

        const string slackToken = "seu_token_personalizado";
        const string usuario = "BOT Dirceu Resende";

        try
        {

            var mensagem = Utils.converteStringWebService(Ds_Mensagem.Value);


            if (mensagem.Length > 4000)
                Retorno.Erro("O tamanho máximo da mensagem deve ser inferior a 4.000 caracteres");


            var canal = Ds_Canal.Value;
            var canais = canal.Split(';');

            foreach (var nomeCanal in canais)
            {

                var request = (HttpWebRequest) WebRequest.Create("https://slack.com/api/chat.postMessage");
                
                request.Method = "POST";

                request.UserAgent = "curl/7.45.0";
                request.ContentType = "application/x-www-form-urlencoded";

                var parametros = $"token={slackToken}&channel={nomeCanal.Trim()}&text={mensagem}&username={usuario}&as_user=false";

                var buffer = Encoding.GetEncoding("UTF-8").GetBytes(parametros);
                using (var reqstr = request.GetRequestStream())
                {

                    reqstr.Write(buffer, 0, buffer.Length);

                    using (var response = request.GetResponse())
                    {

                        using (var dataStream = response.GetResponseStream())
                        {

                            if (dataStream == null) return;

                            using (var reader = new StreamReader(dataStream))
                            {
                                var responseFromServer = reader.ReadToEnd();

                                if (responseFromServer.Contains("\"ok\":false"))
                                    Retorno.Erro(responseFromServer);
                                else
                                    Retorno.Mensagem(responseFromServer);

                            }
                        }

                    }

                }

            }

        }
        catch (Exception e)
        {
            Retorno.Erro("Erro : " + e.Message);
        }
    }

};

Ejemplos de uso para grupos (públicos o privados)
A diferencia de lo que ocurre en Ryver, donde es necesario obtener el ID de cada grupo, ya sea privado o público, para poder enviar mensajes, donde la API de Ryver diferencia entre envío a un grupo privado y a un grupo público, en Slack el envío se realiza utilizando el propio nombre del grupo, sin diferenciar entre privado o público a la hora de enviar.

EXEC CLR.dbo.stpEnvia_Mensagem_Slack 
    @Ds_Canal = N'informativos', -- nvarchar(max)
    @Ds_Mensagem = N'Teste de mensagem para o grupo público #informativos' -- nvarchar(max)

Ejemplos de uso para mensajes privados (DM)
Para enviar mensajes directos (DM) o llamadas privadas, simplemente ingresa @nombre_do_usuario.

EXEC CLR.dbo.stpEnvia_Mensagem_Slack 
    @Ds_Canal = N'@bot_dirceuresende', -- nvarchar(max)
    @Ds_Mensagem = N'Teste de mensagem privada para o usuário @bot_dirceuresende' -- nvarchar(max)

Enviar mensajes coloridos en Slack

Una característica realmente interesante de la API de Slack se llama archivos adjuntos, que le permite mejorar el formato y la visualización de los mensajes enviados a través de la API, haciendo que la información sea más clara y elegante. Veamos cómo funciona:

Código de procedimiento almacenado stpEnvia_Mensagem_Slack_Completa

using System;
using System.Data.SqlTypes;
using System.IO;
using System.Net;
using System.Text;
using Bibliotecas.Model;

public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void stpEnvia_Mensagem_Slack_Completa(SqlString Ds_Canal, SqlString Ds_Mensagem, SqlString Ds_Cor_Hexa, SqlString Ds_Titulo, SqlString Ds_Link, SqlString Ds_Mensagem_Interna)
    {


        try
        {

            const string slackToken = "seu_token_slack";
            const string usuario = "BOT Dirceu Resende";

            var mensagem = Utils.converteStringWebService(Ds_Mensagem.Value);
            var mensagemInterna = Utils.converteStringWebService(Ds_Mensagem_Interna.Value);
            var titulo = Utils.converteStringWebService(Ds_Titulo.Value);
            var link = Utils.converteStringWebService(Ds_Link.Value);
            var cor = (!string.IsNullOrEmpty(Ds_Cor_Hexa.Value.Trim()) ? Ds_Cor_Hexa.Value : "");
            var canal = Ds_Canal.Value;

            if (string.IsNullOrEmpty(mensagem) && string.IsNullOrEmpty(mensagemInterna))
                Retorno.Erro("O valor do parâmetro @Ds_Mensagem E @Ds_Mensagem_Interna não pode ser vazio. Pelo menos um dos dois deve ser preenchido.");

            var texto = @"
[
    {
        ""fallback"": """ + mensagem + @""",
        ""color"": ""#" + cor + @""",
        ""pretext"": """ + mensagem + @""",
        ""title"": """ + titulo + @""",
        ""title_link"": """ + link + @""",
        ""text"": """ + mensagemInterna + @""",
        ""mrkdwn_in"": [""text"", ""pretext""]
    }
]";
            var canais = canal.Split(';');

            foreach (var nomeCanal in canais)
            {

                var request = (HttpWebRequest)WebRequest.Create("https://slack.com/api/chat.postMessage");
                
                request.Method = "POST";

                request.UserAgent = "curl/7.45.0";
                request.ContentType = "application/x-www-form-urlencoded";

                var parametros = $"token={slackToken}&channel={nomeCanal.Trim()}&username={usuario}&as_user=false&attachments={texto}";

                var buffer = Encoding.GetEncoding("UTF-8").GetBytes(parametros);
                using (var reqstr = request.GetRequestStream())
                {

                    reqstr.Write(buffer, 0, buffer.Length);

                    using (var response = request.GetResponse())
                    {

                        using (var dataStream = response.GetResponseStream())
                        {

                            if (dataStream == null) return;

                            using (var reader = new StreamReader(dataStream))
                            {
                                var responseFromServer = reader.ReadToEnd();

                                if (responseFromServer.Contains("\"ok\":false"))
                                    Retorno.Erro(responseFromServer);
                                else
                                    Retorno.Mensagem(responseFromServer);

                            }
                        }

                    }

                }
            }

        }
        catch (Exception e)
        {
            Retorno.Erro("Erro : " + e.Message);
        }

    }

};

Ejemplos de uso

Enviar mensajes formateados

EXEC CLR.dbo.stpEnvia_Mensagem_Slack_Completa 
    @Ds_Canal = N'informativos', -- nvarchar(max)
    @Ds_Mensagem = N'Teste de Mensagem', -- nvarchar(max)
    @Ds_Cor_Hexa = N'ff0000', -- nvarchar(max)
    @Ds_Titulo = N'Título da Mensagem com Borda Vermelha', -- nvarchar(max)
    @Ds_Link = N'', -- nvarchar(max)
    @Ds_Mensagem_Interna = N'Essa é a mensagem do Slack. Aceita *negrito*, _italico_ e ~sublinhado~' -- nvarchar(max)

Envío de mensajes con enlaces externos
Cuando haces clic en el título del mensaje, serás dirigido a la URL https://dirceuresende.com/blog 🙂

EXEC CLR.dbo.stpEnvia_Mensagem_Slack_Completa 
    @Ds_Canal = N'informativos', -- nvarchar(max)
    @Ds_Mensagem = N'', -- nvarchar(max)
    @Ds_Cor_Hexa = N'00ff00', -- nvarchar(max)
    @Ds_Titulo = N'Título da Mensagem com Borda Verde', -- nvarchar(max)
    @Ds_Link = N'https://dirceuresende.com/blog', -- nvarchar(max)
    @Ds_Mensagem_Interna = N'Essa é a mensagem do Slack. Aceita *negrito*, _italico_ e ~sublinhado~' -- nvarchar(max)

Enviar un mensaje con saltos de línea

EXEC CLR.dbo.stpEnvia_Mensagem_Slack_Completa 
    @Ds_Canal = N'informativos', -- nvarchar(max)
    @Ds_Mensagem = N'', -- nvarchar(max)
    @Ds_Cor_Hexa = N'0000ff', -- nvarchar(max)
    @Ds_Titulo = N'', -- nvarchar(max)
    @Ds_Link = N'', -- nvarchar(max)
    @Ds_Mensagem_Interna = N'Essa é a mensagem do Slack com Borda Azul.\n\nAceita *negrito*\nAceita_italico_\nAceita ~sublinhado~' -- nvarchar(max)

Para obtener más información sobre el formateo en Slack, accede a este enlace.

¡Y eso es todo, amigos!
Espero que hayas disfrutado de esta publicación y ¡hasta la próxima!

servidor sql clr .net dotnet framework c# integración csharp cómo crear base de datos integración base de datos cómo enviar mensajes cómo enviar mensajes notificaciones notificaciones de grupos privados dm Slack

servidor sql clr .net dotnet framework c# integración csharp cómo crear base de datos integración base de datos cómo enviar mensajes cómo enviar mensajes notificaciones notificaciones de grupos privados dm Slack