Skip to content

Instantly share code, notes, and snippets.

@jdreinhardt
Created May 5, 2018 17:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jdreinhardt/be17f1ef0a0e5577cbd5b5825fdd277a to your computer and use it in GitHub Desktop.
Save jdreinhardt/be17f1ef0a0e5577cbd5b5825fdd277a to your computer and use it in GitHub Desktop.
Simple script to send notifications from Tautulli to Matrix (Riot.im)
# -*- coding: utf-8 -*-
import sys
import requests
import json
import markdown
import urllib
MATRIX_SERVER = 'https://matrix.org' #replace with custom server if running own node
MATRIX_PORT = '8448' #default management port
MATRIX_USER = 'USERNAME'
MATRIX_PASSWORD = 'PASSWORD'
MATRIX_ROOM = 'ROOM_ID' #i.e. 'exampleRoom:matrix.org'
if (len(sys.argv) <= 1):
print("No message body entered")
exit(1)
#Tautulli sends arguments as multiple parts instead of single string, so need to concatenate
if (len(sys.argv) > 1):
MESSAGE_BODY = ''
print(sys.argv)
for item in sys.argv:
if (item == sys.argv[0]):
continue
MESSAGE_BODY = MESSAGE_BODY + item + ' '
MESSAGE_BODY = MESSAGE_BODY.decode('utf-8')
MATRIX_CONNECTION = MATRIX_SERVER + ':' + MATRIX_PORT
#Get expected login type
LOGIN_URL = MATRIX_CONNECTION + '/_matrix/client/r0/login'
response = requests.get(LOGIN_URL, verify=False)
data = json.loads(response.text)
LOGIN_TYPE = data['flows'][0]['type']
if (LOGIN_TYPE != 'm.login.password'):
print('Unexpected login type found!')
exit(1)
#Login and get an access token to search instance and post messages
data = {"type":LOGIN_TYPE, "user":MATRIX_USER, "password":MATRIX_PASSWORD}
response = requests.post(LOGIN_URL, data=json.dumps(data), verify=False)
data = json.loads(response.text)
ACCESS_TOKEN = data['access_token']
#Get room ID for specified room to allow for message delivery
GET_ROOM_URL = MATRIX_CONNECTION + '/_matrix/client/r0/directory/room/' + urllib.quote(MATRIX_ROOM)
response = requests.get(GET_ROOM_URL, verify=False)
data = json.loads(response.text)
ROOM_ID = data['room_id']
#Converts markdown text to html and removes head and tail <p> tags
FORMATTED_BODY = markdown.markdown(MESSAGE_BODY)
if (FORMATTED_BODY.startswith('<p>') and FORMATTED_BODY.endswith('</p>')):
FORMATTED_BODY = FORMATTED_BODY[3:-4]
FORMATTED_BODY = FORMATTED_BODY.replace('\\n','<br />')
#If html and plaintext versions are the same send a standard message for backwards compatability
if (MESSAGE_BODY == FORMATTED_BODY):
MESSAGE_DATA = {"msgtype":"m.text", "body":MESSAGE_BODY}
else:
MESSAGE_DATA = {"msgtype":"m.text", "format":"org.matrix.custom.html", "body":MESSAGE_BODY, "formatted_body":FORMATTED_BODY}
MESSAGE_URL = MATRIX_CONNECTION + '/_matrix/client/r0/rooms/' + ROOM_ID + '/send/m.room.message?access_token=' + ACCESS_TOKEN
response = requests.post(MESSAGE_URL, data=json.dumps(MESSAGE_DATA), verify=False)
#Logs out of current session, ensuring no access tokens remain valid
LOGOUT_URL = MATRIX_CONNECTION + '/_matrix/client/r0/logout?access_token=' + ACCESS_TOKEN
response = requests.post(LOGOUT_URL, verify=False)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment