Send a Slack Message

¡Enviar mensajes a Slack con Python es fácil!

C05348A3-9AB8-42C9-A6E0-81DB3AC59FEB
           

Enviar mensajes a un canal de Slack es una excelente opción para recibir notificaciones sobre los eventos que ocurren en sus sistemas. Si todavía usa el correo electrónico para las notificaciones... no lo haga, Slack es mucho más adecuado para informar a las personas que los métodos tradicionales. Si organiza los canales de Slack por tema, permite a las personas suscribirse a los canales que les interesan y darse de baja cuando se mudan y ya no están en ese proyecto. Slack también le permite notificar a la fuerza a todos los miembros de un canal que, si las personas tienen configurado el cliente móvil, puede generar una alerta como un mensaje de texto.

La siguiente secuencia de comandos se puede utilizar como una herramienta de línea de comandos para enviar mensajes de holgura a cualquier canal en particular.

Primero deberá obtener una URL de webhook entrante de Slack . Esa URL es realmente solo una "URL mágica" que le permite publicar en un canal en particular a través de una solicitud POST, no se necesitan encabezados ni autenticación. Obviamente, debe protegerlo con mucho cuidado, utilizando, por ejemplo, la biblioteca de cifrado de Python . En este ejemplo, usaremos una variable de entorno denominada SLACK_WEBHOOK_URL , que es la URL completa proporcionada por Slack, incluido el protocolo https://...


Los ejemplos de código en este sitio web se proporcionan bajo la licencia LGPL v3 . Al utilizar este código, acepta los términos de este acuerdo de licencia.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
 
'''
Sends a notification to a given Slack channel
'''
 
# I M P O R T S ###############################################################
 
from __future__ import print_function
# from future import standard_library
# standard_library.install_aliases()
# from builtins import input
import argparse
import requests
import json
import sys
import os
 
 
__author__ = "Videre Research, LLC"
 
# G L O B A L S ###############################################################
 
webhookURL = os.getenv('SLACK_WEBHOOK_URL', '')
 
# F U N C T I O N S ###########################################################
 
 
def main():
    """Main function."""
    if os.getenv('SLACK_WEBHOOK_URL', '') == "":
        print('Environment variable SLACK_WEBHOOK_URL not set')
        sys.exit(1)
 
    assert webhookURL.startswith('https://hooks.slack.com/services/')
 
    parser = argparse.ArgumentParser()
    parser.add_argument(
        '-t', '--title', action='store',
        required=True,
        help='Title line of the Slack post (can contain markup).'
    )
    parser.add_argument(
        '-b', '--body', action='store',
        required=True,
        help='Body of the Slack post (can NOT contain markup).'
    )
    parser.add_argument(
        '-u', '--user', action='store',
        default=':Slack-Bot:', required=False,
        help='User Name to display with the post, default to: Slack-Bot.'
    )
    parser.add_argument(
        '-i', '--icon', action='store',
        default=':speaking_head_in_silhouette:', required=False,
        help='Icon (built-in emoji) to display with the post, default to: :speaking_head_in_silhouette:.'
    )
    parser.add_argument(
        '-c','--color', action='store',
        default='36a64f', required=False,
        help='Hex color code for the post content, default to: 36a64f.'
    )
    args = parser.parse_args()
 
    headers = {'Content-Type': 'application/json', 'Accept': 'application/json'}
    data = {
        "username": "SlackPost",
        "icon_emoji": args.icon,
        "text": args.title,
        "attachments": [
            {
                "fallback": args.body,
                "color": args.color,
                "text": args.body
            }
        ]
    }
 
    try:
        r = requests.request(method='POST', url=webhookURL, data=json.dumps(data), headers=headers, timeout=25)
        if r.status_code == 200:
            response = r.content
            print(response)
        else:
            print('Error:')
            print(r.status_code)
            print(r.headers)
            print(r.text)
            print(sys.exc_info()[:2])
            sys.exit(1)
    except Exception as e:
        print("Error {0}".format(str(e)))
        sys.exit(1)
 
    sys.exit(0)
 
###############################################################################
 
if __name__ == "__main__":
    main()
 
# E N D   O F   F I L E #######################################################

Uso de la herramienta de línea de comandos

Como puede ver al invocar el script con el parámetro '-h', los únicos dos parámetros que se requieren son la "-t" para el título de su publicación floja y la "-b" para el cuerpo. Puede especificar cualquier otro parámetro si lo desea o simplemente cambiar el valor predeterminado en el propio script.

Tenga en cuenta que puede usar ' <!channel|channel> ' en el cuerpo para alertar a todos los usuarios activos en ese canal (equivalente a @channel). Absténgase de usar @aquí si es posible.

¡Feliz holgazanería (en sentido figurado, por supuesto), y por favor utilícelo de manera responsable!

python3 send_slack.py -h
usage: __main__.py [-h] -t TITLE -b BODY [-u USER] [-i ICON] [-c COLOR]
 
optional arguments:
  -h, --help            show this help message and exit
  -t TITLE, --title TITLE
                        Title line of the Slack post (can contain markup).
  -b BODY, --body BODY  Body of the Slack post (can NOT contain markup).
  -u USER, --user USER  User Name to display with the post, default to: Slack-
                        Bot.
  -i ICON, --icon ICON  Icon (built-in emoji) to display with the post,
                        default to: :speaking_head_in_silhouette:.
  -c COLOR, --color COLOR
                        Hex color code for the post content, default to:
                        36a64f.
Comentarios publicados: 0

Tagged with:
notification