Olá pessoal,
Bom dia!

Neste post vou demonstrar como fazer uma integração do banco de dados com o Slack e enviar mensagens utilizando CLR (C#), que é o principal concorrente do Ryver, no qual já demonstrei como fazer essa mesma integração no post SQL Server – Como fazer uma integração do banco de dados com o Ryver e enviar mensagens utilizando CLR (C#).

Caso você não conheça ou não saiba utilizar o CLR no SQL Server, descubra como acessando o post Introdução ao SQL CLR (Common Language Runtime) no SQL Server.

Caso você esteja utilizando o SQL Server 2017 e queira utilizar apenas comandos nativos do SGBD ao invés de ter que criar uma biblioteca SQLCLR (C#), ainda assim pode criar seus alertas utilizando o Slack com a solução em Python que compartilhei no post SQL Server – Como fazer uma integração do banco de dados com o Slack e enviar mensagens utilizando Python e sp_execute_external_script.

O que é o Slack?

Para quem não conhece, o Slack é um dos comunicadores corporativos mais famosos e utilizados em todo o mundo, principal concorrente do Ryver e tem a proposta de substituir a comunicação via e-mail por grupos privados e públicos (dentro do time) focados em determinadas equipes e/ou assuntos. Você pode criar grupos públicos, onde toda sua equipe pode interagir e colaborar e grupos privados para cada setor, onde somente quem está no grupo pode visualizar as mensagens.

O Slack permite que você responda e-mails pela própria ferramenta, envio e compartilhamento de arquivos, envio de mensagens privadas, instalação de diversos plugins para adicionar novos recursos e muito mais.

No plano gratuito, a busca de mensagens recupera apenas as últimas 10 mil mensagens, o limite de armazenamento é de 5 GB e mais algumas limitações que você pode verificar neste link.

Onde e como posso usar o Slack na minha empresa?

Esse recurso é especialmente útil para criar equipes na sua empresa e gerar alertas e monitoramentos por equipe, onde cada equipe recebe apenas os alertas referentes às suas atividades. Além disso, você pode utilizar os grupos abertos para enviar informativos e notificações que interessam para a empresa toda. Tudo isso, sem custo algum e você pode receber por e-mail, visualizar na Web e no seu smartphone.

Uma outra forma legal de se utilizar o Slack, é enviar acompanhamento de metas de vendas para o setor de comercial, de forma que os gerentes regionais e locais possam acompanhar a performance da equipe de vendas em tempo real, sem ter que ficar consultando e abrindo relatórios, onde quer que eles estejam, mesmo fora da empresa.

Caso sua empresa adote o Slack, o setor de RH pode utilizar o serviço para enviar mensagens e informativos para os colaboradores. Enviar mensagens de natal, uma mensagem especial no aniversário do colaborador, etc.

Enfim, a vantagem do Slack é que ele pode ser enviado de várias formas diferentes (E-mail, Web, Smartphone), onde quer que você esteja, dentro ou fora da empresa e representa uma grande revolução na forma em que as pessoas interagem com as informações.

Utilizo o Slack onde eu trabalho como ferramenta de comunicação, monitoramento e alertas das rotinas de TI, como falhas em jobs críticos, problemas em backups, corrupções de bases, queries lentas, locks, etc. Sempre que alguma rotina crítica falha, é enviado um e-mail interno e uma notificação via Slack, onde chega uma notificação Push no meu celular (igual do Whatsapp) e onde quer que eu esteja, tomo conhecimento dessa falha.

Como adicionar usuários ao Slack

O primeiro passo para criar a integração, é criar sua conta no Slack, acessando este link. Uma vez criada, você receberá um e-mail para logar na sua conta.

Tela inicial do Slack, já com alguns grupos que criei para este post

Para adicionar novos usuários, basta clicar no menu (Seu nome) e selecionar a opção “Invite people”

Você pode adicionar seus contatos da usa conta do Google, importar vários contatos no formato CSV e outros. Uma vez que você convide outras pessoas, ela receberão um link para se juntar à sua equipe e após finalizar o cadastro, elas já poderão visualizar os dados pelo navegador Web ou aplicativo para celular.

Como ativar a API do Slack

Para que seja possível enviar as mensagens pelo Slack, precisamos criar uma integração customizada. Para isso acesse a URL https://api.slack.com/docs/oauth-test-tokens logado na conta do usuário que servirá como BOT e fará o envio das mensagens automáticas.

Clique no botão “Create token”.

Copie o token gerado para a sua aplicação. É com esse código enorme (76 caracteres no meu caso) que você será fará a autenticação com a API e poderá enviar suas mensagens através do CLR (C#).

Como integrar o banco de dados ao Slack

Uma vez que você já criou sua conta no Slack e já cadastrou o usuário que você irá utilizar para enviar as mensagens para as equipes, vamos à parte interessante: Criar o código .NET (C#) que irá realizar a integração do banco de dados SQL Server com a API do Slack.

Pré-requisito: 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 pré-requisito para utilizar essa procedure, você precisará criar a classe Retorno, disponível no post SQL Server – Como enviar avisos e mensagens de erro para o banco pelo CLR (C#) para utilizar o método Retorno.Erro e assim, enviar mensagens de erro, caso ocorram. Você também pode optar por comentar o código e remover as chamadas para esse método (e comentar também o using Bibliotecas.Model), mas não aconselho, pois você não saberá quando ocorreu algum erro na sua chamada à SP de envio de mensagens para o Slack.

Assim como ocorre no Ryver, para que seja possível enviar as mensagens, o usuário do BOT tem que ser adicionado em todos os grupos, privados e públicos, pois ele que faz o envio das mensagens e não é possível enviar as mensagens se ele não estiver no grupo.

Agora que já temos a conta criada, o usuário do BOT está nos grupos desejados e já geramos o nosso token, é hora de enviar as mensagens pelo banco de dados com o CLR.

Código-fonte da 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);
        }
    }

};

Exemplos de uso para grupos (públicos ou privados)
Diferente do que ocorre no Ryver, onde você precisa pegar o ID de cada grupo, seja privado ou público, para poder realizar o envio das mensagens, onde a API do Ryver diferencia o envio para grupo privado é diferente de grupo público, no Slack o envio é feito pelo próprio nome do grupo, não tendo diferença entre privado ou público para realizar o envio.

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)

Exemplos de uso para mensagens privadas (DM)
Para enviar mensagens diretas (DM) ou também chamadas de privadas, basta colocar @nome_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)

Enviando mensagens coloridas no Slack

Um recurso bem legal da API do Slack é o chamado attachments (anexos), que permite melhorar a formatação e visualização das mensagens enviadas pela API, tornando as informações mais claras e elegantes. Vamos ver como funciona:

Código da Stored Procedure 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);
        }

    }

};

Exemplos de uso

Envio de mensagens com formatação

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)

Envio de mensagens com Links externos
Ao clicar no título da mensagem, você será direcionado para a 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)

Envio de mensagem com quebra de linha

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 saber mais sobre formatação no Slack, acesse este link.

E é isso aí, pessoal!
Espero que tenham gostado desse post e até a próxima!

sql server clr .net dotnet framework c# csharp integration como criar integração banco de dados database como enviar mensagens how to send messages notifications notificações grupo privada dm Slack

sql server clr .net dotnet framework c# csharp integration como criar integração banco de dados database como enviar mensagens how to send messages notifications notificações grupo privada dm Slack