slackmail/slackmail.py

96 lines
2.5 KiB
Python

#!/usr/bin/python
# Copyright 2015 (c) Anna Schumaker.
import json
import sys
from datetime import datetime
from urllib import request
# TODO: Move the token file outside of code directory
TOKEN = ""
with open("token") as f:
TOKEN = f.read().strip()
def call_method(method, args = dict()):
arglist = []
for (key, value) in args.items():
arglist += ["%s=%s" % (key, value)]
argstr = "&&".join(arglist)
server = "https://slack.com/api/"
with request.urlopen("%s/%s?%s" % (server, method, argstr)) as f:
return json.loads(f.read().decode())
return {"ok" : False}
def call_method_auth(method, args = dict()):
args["token"] = TOKEN
return call_method(method, args)
#
# Test connection before doing anything else
#
if call_method("api.test")["ok"] == False:
sys.exit(1)
if call_method_auth("auth.test")["ok"] == False:
sys.exit(1)
#
# Find list of channels, we'll get info later
#
def list_channel_ids():
call = call_method_auth("channels.list")
if call["ok"] == True:
for channel in call["channels"]:
yield channel["id"]
def find_channel_info(id):
call = call_method_auth("channels.info", { "channel" : id })
if call["ok"] == True:
return call["channel"]
def read_channel(id, ts):
args = { "channel" : id, "oldest" : ts }
call = call_method_auth("channels.history", args)
if call["ok"] == True:
messages = call["messages"]
messages.reverse()
for message in messages:
yield message
def _print_message(user, message):
dt = datetime.fromtimestamp(float(message["ts"]))
text = message["text"].encode("utf-8").decode("latin-1")
print("%s %s: %s" % (str(dt), user, text))
def print_message(message):
call = call_method_auth("users.info", {"user" : message["user"]})
if call["ok"] == False:
name = message["user"]
else:
first = call["user"]["profile"].get("first_name", "")
last = call["user"]["profile"].get("last_name", "")
name = "%s %s" % (first, last)
if first == "" and last == "":
name = call["user"]["name"]
_print_message(name, message)
for id in list_channel_ids():
channel = find_channel_info(id)
print(channel["name"])
print("\t%s" % channel["purpose"]["value"].encode("utf-8").decode("latin-1"))
if channel["is_member"]:
print("\tUnread count: %s, last read: %s" % (channel["unread_count"], channel["last_read"]))
for message in read_channel(id, channel["last_read"]):
print_message(message)
print()