From d82f1b2bb200cf4ca0c20f8fc1782ee33f170d32 Mon Sep 17 00:00:00 2001 From: mrbesen Date: Fri, 19 Jul 2019 09:36:55 +0200 Subject: [PATCH] initial --- .gitignore | 4 ++ Pipfile | 14 ++++ src/TgStats.py | 183 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 201 insertions(+) create mode 100644 .gitignore create mode 100644 Pipfile create mode 100755 src/TgStats.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fe01b5e --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +config.ini +*.session +Pipfile.lock +.idea/ \ No newline at end of file diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..2f7f75a --- /dev/null +++ b/Pipfile @@ -0,0 +1,14 @@ +[[source]] +name = "pypi" +url = "https://pypi.org/simple" +verify_ssl = true + +[dev-packages] + +[packages] +httplib2 = "*" +cryptg = "*" +telethon = "*" + +[requires] +python_version = "3.6" diff --git a/src/TgStats.py b/src/TgStats.py new file mode 100755 index 0000000..7592aba --- /dev/null +++ b/src/TgStats.py @@ -0,0 +1,183 @@ +#!/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='')