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.
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
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.
1 2 3 |
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.
1 2 3 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
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
1 2 3 4 5 6 7 |
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 🙂
1 2 3 4 5 6 7 |
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
1 2 3 4 5 6 7 |
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.
And that's it, folks!
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
Bom dia Dirceu… tentei implementar essa solução, porém quando executo a STP tenho a seguinte msg de erro:
Lookup Error – SQL Server Database Error: A .NET Framework error occurred during execution of user-defined routine or aggregate “STP_Envia_Slack”:
System.Security.SecurityException: Request for the permission of type ‘System.Data.SqlClient.SqlClientPermission, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089’ failed.
System.Security.SecurityException:
at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet)
at System.Security.PermissionSet.Demand()
at System.Data.Common.DbConnectionOptions.DemandPermission()
at System.Data.SqlClient.SqlConnectionFactory.PermissionDemand(DbConnection outerConnection)
at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource
1 retry, DbConnectionOptions userOptions)
1 retry)at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource
at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
at System.Data.SqlClient.SqlConnection.Open()
at Bibliotecas.Model.Retorno.Erro(String erro)
at StoredProcedures.STP_Envia_Slack(SqlString Ds_Canal, SqlString Ds_Mensagem)
.
Consegue me ajudar com este erro?