initial
This commit is contained in:
commit
d82f1b2bb2
|
@ -0,0 +1,4 @@
|
|||
config.ini
|
||||
*.session
|
||||
Pipfile.lock
|
||||
.idea/
|
|
@ -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"
|
|
@ -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='')
|
Loading…
Reference in New Issue