Llamar a un Webhook externo de Slack desde una Azure Function (II)
En esta segunda y última parte del ejemplo o demostración de como crear rápidamente un Webhook entranda a Slack para ser llamado desde una Azure Function vamos a tocar algo de código.
Para ver la primera parte de este ejemplo, haz clic en este enlace.
Nuestro ejemplo funciona de la siguiente forma:
Haremos una llamada POST a nuestra Azure Function.
Pasaremos un JSON a la Azure Function con este formato de ejemplo:
{ "from":"es", "to":"en", "text":"Esto es un ejemplo de Azure Functions y Slack" }
Como podemos ver, recibiremos tres datos.
- El idioma en el que tenemos el texto.
- El idioma al que queremos traducir el texto.
- El texto.
La idea es que en el canal de Slack aparezca un enlace a Google Translator que traduzca el texto al otro idioma.
Evidentemente, este ejemplo vale para cualquier idioma soportado en Google Translator.
Para llevar a cabo todo esto, lo primero que voy a hacer es crear un archivo de código al que he llamado HttpClientHelper.csx.
Este archivo será para mí el helper que me he creado para hacer una llamada POST al Webhook de Slack.
En realidad el objetivo que persigo en este caso es crear un helper con el que pueda reutilizar el código de este archivo para cualquier otra Azure Function que cree dentro de mi Azure Function App. Este helper no cumpliría el propósito completo de reutilización, pero valga para hacernos una idea aproximada del objetivo a cubrir.
El código de nuestro archivo HttpClientHelper.csx quedará de la siguiente forma:
#r "Newtonsoft.Json" using System.Net; using System.Text; using Newtonsoft.Json; public static async Task<object> PostAsync(string text, string url, TraceWriter log) { using(var client = new HttpClient()) { var dictionary = new Dictionary<string, string>(); dictionary.Add("text", text); string json = JsonConvert.SerializeObject(dictionary); var requestData = new StringContent(json, Encoding.UTF8, "application/json"); var response = await client.PostAsync(String.Format(url), requestData); var result = await response.Content.ReadAsStringAsync(); log.Info($"Result: {result}"); } return true; }
Ahora acudiremos al código de nuestro archivo run.csx que es el archivo de entrada y arranque de nuestra Azure Function (el main de toda la vida) y agregaremos el siguiente código:
#load "./HttpClientHelper.csx" using System.Configuration; using System.Net; public static async Task<object> Run(HttpRequestMessage req, TraceWriter log) { var slackWebhook = ConfigurationManager.AppSettings["SLACK.WEBHOOK"]; dynamic data = await req.Content.ReadAsAsync<object>(); string translateFrom = data.from; string translateTo = data.to; string text = data.text; var clickMessage = (translateFrom.ToUpper() == "ES" ? "Clic aquí para traducir" : "Click here to translate"); text = $"<https://translate.google.es/#{translateFrom}/{translateTo}/{text}|{clickMessage}> " + text; var result = await PostAsync(text, slackWebhook, log); return req.CreateResponse(HttpStatusCode.OK, new { text = $"{text}" }); }
Con #load cargaremos un archivo de código que tenemos en este caso dentro del directorio de nuestra Azure Function.
Antes de iniciar nuestra aplicación deberemos hacer algún ajuste en el portal de Azure (por ejemplo).
Lo primero, acudir a Application settings.
Nuestro código lee de Application settings la información de configuración que habremos copiado de Slack (ver parte I) y que deberemos agregar en un valor denominado SLACK.WEBHOOK (o como desees).
No olvides guardar los cambios.
Una vez hecho esto, podremos ir a la ventana de prueba de nuestra Azure Function, o bien probar con POSTMAN, Fiddler, etc., nuestra Azure Function.
Si acudimos a nuestro canal de Slack, veremos algo parecido a lo siguiente:
Y si hacemos clic en el enlace que aparece en Slack, se nos abrirá Google Translator:
Como podemos observar, la creación de un Webhook entrante de Slack es bastante sencillo y su llamada desde una Azure Function también.
Happy Coding!