Created
January 7, 2020 03:18
-
-
Save tom-henderson/bf672f4121ba1acf03bc7458c58f4aa6 to your computer and use it in GitHub Desktop.
Revisions
-
tom-henderson created this gist
Jan 7, 2020 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,134 @@ #!/usr/bin/env python3 import os import sys import json import requests import argparse import re SLACK_WEBHOOK_URL = os.environ.get("SLACK_WEBHOOK_URL") SLACK_DEFAULT_USER = os.environ.get("SLACK_DEFAULT_USER", "Python") SLACK_DEFAULT_ICON = os.environ.get("SLACK_DEFAULT_ICON", "python") def valid_channel(channel): if channel[0] in ("@", "#"): return channel raise argparse.ArgumentTypeError(f"Invalid channel: {channel} does not begin with # or @.") def valid_icon(icon): if icon[0] != ":": icon = f":{icon}" if icon[-1] != ":": icon = f"{icon}:" return icon def valid_colour(colour): named_colours = [ "good", "warning", "danger", ] if colour in named_colours or re.match(r"^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$", colour): return colour raise argparse.ArgumentTypeError(f"Invalid colour: {colour}") parser = argparse.ArgumentParser(description="Send a slack message.") parser.add_argument( '-c', '--channel', required=True, type=valid_channel, help="Channel to post to. Must begin with # or @." ) parser.add_argument( '-u', '--username', default=SLACK_DEFAULT_USER, help="Username to post as." ) parser.add_argument( '-m', '--message', default=None, help="Message to send." ) parser.add_argument( '-i', '--icon_emoji', default=SLACK_DEFAULT_ICON, type=valid_icon, help="Emoji to use as icon." ) parser.add_argument( '--colour', default=None, type=valid_colour, help="Post message as a block with a coloured left border." ) args = parser.parse_args() def post_json(url, payload): req = urllib2.Request(url) req.add_header('Content-Type', 'application/json') response = urllib2.urlopen(req, json.dumps(payload)) return response def post_to_slack(channel, username, message, icon_emoji, colour=None): headers = { 'Content-Type': 'application/json' } if (args.colour): payload = json.dumps({ 'channel': channel, 'username': username, 'icon_emoji': icon_emoji, "attachments": [ { "text": message.replace('\\n', '\n'), "color": args.colour, "mrkdwn_in": ["text"] } ] }) else: payload = json.dumps({ 'channel': channel, 'username': username, 'text': message.replace('\\n', '\n'), 'icon_emoji': icon_emoji, }) response = requests.post( SLACK_WEBHOOK_URL, data=payload, headers=headers ) return response if __name__ == '__main__': if not SLACK_WEBHOOK_URL: print('ERROR: SLACK_WEBHOOK_URL is not defined.') sys.exit(1) if not args.message: args.message = "".join(sys.stdin.readlines()) response = post_to_slack( channel=args.channel, username=args.username, message=args.message, icon_emoji=args.icon_emoji, colour=args.colour ) if response: sys.exit(0) else: sys.exit(1)