#!/usr/bin/env python3 from telethon import TelegramClient, sync import configparser, math, datetime dialogs = [] # list of known chats me = None # the own entity client = None output = None # "csv", "stdout", "yaml", "json"... def printDialog(interid, d): # debug only print('{0:3d}| {1:14d} | {2:30} | {3:1}'.format(interid, d.id, d.name, d.pinned)) def getUsernamebyID(userid): for d in dialogs: if d.id == userid: return d.name return "Unknown" # refresh dialog cache? class Stat: name = None def __init__(self, name): self.name = name def addMsg(self, msgnum, msg, chat): pass def getValue(self, count): pass class Countable(Stat): acc = 0 mult = 0 min = 1 << 31 max = 0 def parse(self, val): return str(val) def getValue(self, count): return "Min: " + self.parse(self.min) + " Max: " + self.parse(self.max) + " Gesamt: " \ + self.parse(self.acc) + " Avg: " + self.parse(self.acc / count) + " Geom.Avg: " + self.parse(math.sqrt(self.mult)) def addMsg(self, msgnum, msg, chat): count = self.count(msgnum, msg, chat) if count > self.max: self.max = count if count < self.min: self.min = count self.acc = self.acc + count self.mult = self.mult + (count * count) def count(self, msgnum, msg, chat): pass class CharCount(Countable): def __init__(self, name: str = "CharCount"): super().__init__(name) def count(self, msgnum, msg, chat): if msg.message != None: return len(msg.message) return 0 class Dist(Countable): prev = 0 def __init__(self, name: str = "Distanz(s)"): super().__init__(name) def count(self, msgnum, msg, chat): if msg.date != None: old = self.prev self.prev = msg.date if old == 0: return 0 return int((old - msg.date).total_seconds()) def parse(self, val): return str(datetime.timedelta(seconds=val)) class DiscreteCount(Stat): list = {} def getValue(self, count): out = '' # sorted_ = sorted(list.items(), key=lambda kv: kv[1]) for name, count in self.list.items(): if len(out) > 0: out = out + ", " out = out + name + ": " + str(count) # TODO: add percantage return out; class UserCount(DiscreteCount): def __init__(self, name: str = "Msg/User"): super().__init__(name) def addMsg(self, msgnum, msg, chat): global me fromid = msg.from_id self.list[fromid] = self.list.get(fromid, 0) + 1 def getValue(self, count): # replace ids with names newdict = {} for id, count in self.list.items(): newdict[getUsernamebyID(id)] = count self.list = newdict return super().getValue(count) stats = { CharCount(), Dist(), UserCount() } # ================================== # MAIN program # read config try: config = configparser.ConfigParser() config.read('config.ini') api_id = int(config.get('Main', 'api_id')) api_hash = config.get('Main', 'api_hash') session_name = config.get('Main', 'user') except (configparser.NoSectionError, configparser.NoOptionError, ValueError): print('invalid config.ini') exit(3) client = TelegramClient(session_name, api_id, api_hash) client.start() me = client.get_me() print('me.id: ', me.id) # get dialogs dialogs = client.get_dialogs() dialogCount = len(dialogs) print(dialogCount, ' Chats loaded.') print( ' Internal ID | Username | pinned\n———+————————————————+————————————————————————————————+———————') interid = 0 for d in dialogs: printDialog(interid, d) interid = interid + 1 get = int(input("Please Enter Chat ID: ")) if get < 0 or get >= dialogCount: print("Unknown Chat ID!") exit(1) selectedDialog = dialogs[get] print("selected: \"", selectedDialog.name, '"; retriving chat!', sep='') # chat = client.get_messages(selectedDialog) chat = client.iter_messages(selectedDialog, limit=None) # run messure msgnum = 0 for msg in chat: if msg != None: msgnum = msgnum + 1 for stat in stats: stat.addMsg(msgnum, msg, selectedDialog) print(msgnum, 'Nachrichten Analysiert') for stat in stats: print(stat.name, ': ', stat.getValue(msgnum), sep='')