Integrando Slack y Spring Boot: cómo enviar mensajes desde aplicaciones Java
Como enviar mensajes a slack con spring boot de manera facil y sin dependencias.
1.¿Qué es Slack y cómo funciona la API de Slack?
Slack es una plataforma de mensajería enfocada en el trabajo en equipo. Permite a las empresas crear canales de comunicación para diferentes proyectos y equipos de trabajo, y ofrece una amplia gama de integraciones con otras herramientas y servicios.
La API de Slack es un conjunto de endpoints que permiten a otras aplicaciones enviar y recibir mensajes a través de Slack. Para usar la API de Slack, primero debes crear una aplicación en la plataforma de Slack y obtener un token de acceso. Luego, puedes utilizar cualquiera de los endpoints de la API para enviar y recibir mensajes a través de Slack.
2.Creación de una aplicación Slack y obtención del token de acceso para la API.
Crea una cuenta y sigue los pasos de configuración para tu espacio de trabajo, debería de verse de la siguiente manera.
Luego busca la aplicación incoming webhook.
Clickea sobre el card y agregalo a slack en unn espacion de trabajo.
Seleciona el canal al cual desear publicar tus mensajes.
Copia el link de la api este sera el que utilizaremos para conectar nuestra api rest en spring boot para enviar mensajes.
3. Instalación de la dependencia de Slack en tu proyecto Spring Boot.
Dependencias de la aplicación, solo necesitaremos la dependencia de Spring web y devtools no es necesario agregar dependencias de terceros.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
Como siguiente paso debemos agregar la url webhook en nuestro application.properties.
Crea un DTO con las siguientes propiedades.
public class SlackMessage implements Serializable {
private static final long serialVersionUID = 1L;
private String username; //usuario directo al que enviaras el mensaje
private String text; //mensaje
private String icon_emoji; //icono parametrizable del boot slack
private String channel; //channel a enviar el message
}
4.Creación de un componente de Spring para enviar mensajes a Slack.
Para este paso, crearemos un componente en un paquete de servicio que utilizará RestTemplate para gestionar la petición de envío de mensajes a Slack.
@Component
public class SlackComponent {
@Value("${slack.bot.token}")
private String slackWebhookUrl;
public Object sendMessageNative(SlackMessage message) {
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<SlackMessage> request = new HttpEntity<>(message, headers);
return restTemplate.postForObject(slackWebhookUrl, request, String.class);
}
}
Hay que tener en cuenta que slackWebhookUrl utiliza el valor definido anterior mente en el archivo de properties de nuestra aplicación.
Con esto deberíamos poder realizar una prueba unitaria para verificar el correcto funcionamiento de nuestro componente. Definamos nuestra prueba simple.
@SpringBootTest
class SlackMessagingSpringbootApplicationTests {
@Autowired
private SlackComponent slackUtils;
@Test
void testSendMessage() {
var message = "Hola mundo desde junit :heart: :smile:";
SlackMessage slackMessage = new SlackMessage();
slackMessage.setText(message);
slackMessage.setChannel("varios");
// slackMessage.setIcon_emoji(":smiley:");
var response = slackUtils.sendMessageNative(slackMessage);
assertEquals("ok", response);
}
}
Al ejecutar nuestro test recibiríamos el mensaje al canal de varios.
5.Inyección del componente de Slack en donde sea necesario enviar mensajes.
Para completar nuestra API crearemos un controlador que inyectará nuestro componente de Slack y expondrá un método para enviar mensajes a través de él. De esta manera, podrás consumir este método desde cualquier otra parte de la aplicación.
@RestController
public class SlackController {
@Autowired
private SlackComponent slackComponent;
@PostMapping("/send")
public ResponseEntity<?> sendMesssage(@RequestBody SlackMessage slackRequest) {
return ResponseEntity.ok(slackComponent.sendMessageNative(slackRequest));
}
}
Como ultimo paso la probamos desde postman.
Y este seria el resultado.
6.Envío de mensajes con emojis y imágenes adjuntas a Slack.
Para incluir emojis y imágenes en un mensaje de Slack desde tu API, es necesario utilizar el formato de marcado de Slack.
Para incluir emojis en el texto de un mensajo, debes utilizar el siguiente formato:
:nombre_del_emoji:
Ejemplo:
Y este seria el resultado.
También podríamos agregar en nuestro DTO un campo de emoji_message y luego concatenar lo al mensaje para dar una mejor experiencia de segmentación pero para este ejemplo no es necesario.
Sí, es posible incluir imágenes directamente en el texto de un mensaje utilizando el formato de marcado de Slack, que permite añadir enlaces y formatear el texto de diversas maneras.
Para incluir una imagen en el texto de un mensaje, debes utilizar el siguiente formato:

Ejemplo:
Resultado.
Con esto, finalizamos nuestro tutorial sobre cómo integrar la API de Slack de manera sencilla en una aplicación Spring Boot. También es posible realizar esta integración utilizando OpenFeign o Web Client. Si tienes alguna duda, no dudes en contactarme o si quieres un tutorial sobre el uso de estas librerías, también házmelo saber.
Repositorio en Github: https://github.com/danielangel22/slack-messaging-springboot