-
Notifications
You must be signed in to change notification settings - Fork 0
/
slack_json_parser.py
149 lines (102 loc) · 3.18 KB
/
slack_json_parser.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#! python3
# slack_json_parser.py - some tools for parsing the json that you can download from Slack
import json, os, pandas, sys
class Parser:
def __init__(self):
self.static_dir = "."
self.data_dir = self.static_dir+"/data/"
self.user_data_file = json.load( open(self.data_dir+"/users.json") )
self.channel_data_file = json.load( open(self.data_dir+"/channels.json") )
self.user_info = self.get_user_info()
self.dirs = [dir for dir in os.listdir(self.data_dir) if "." not in dir]
def get_user_info(self):
channels = {}
for user in self.user_data_file:
try:
if user['is_bot'] == False:
channels[ user['id'] ] = {"name" : user["real_name"], "channels" : [] }
except:
continue
for channel in self.channel_data_file:
for member in channel["members"]:
try:
channels[member]["channels"].append( channel["name"] )
except:
pass
return channels
def file_to_dict(self, file):
with open(file) as input:
input_json = json.load(input)
return input_json
def get_messages(self):
messages = []
for dir in self.dirs:
for file in os.listdir(self.data_dir+dir):
input_dict = self.file_to_dict(self.data_dir+dir+"/"+file)
for object in input_dict:
try:
messages.append(
{
"user_name": object["user_profile"]["real_name"],
"message": object["text"],
"channel": dir,
"timestamp": object["ts"]
} )
except:
continue
return messages
def get_reactions(self):
reactions = []
for dir in self.dirs:
for file in os.listdir(self.data_dir+dir):
input_dict = self.file_to_dict(self.data_dir+dir+"/"+file)
for object in input_dict:
try:
for reaction in object["reactions"]:
reactions.append(
{
"reaction" : reaction["name"],
"user_ids" : reaction["users"]
})
except:
continue
return reactions
def return_csv(self):
# To do later?
input = self.get_messages()
output = {
"user_name": [],
"message": [],
"channel": [],
"timestamp": []
}
for object in input:
output["user_name"].append( object["user_name"] )
output["message"].append( object["message"] )
output["channel"].append( object["channel"] )
output["timestamp"].append( object["timestamp"] )
return output
class Analyzer:
def __init__(self, messages, users):
self.messages = messages
self.messages_dataframe = pandas.DataFrame( self.messages, columns = ["user_name", "message", "channel", "timestamp"] )
# add metadata
self.messages_dataframe["word_count"] = len( self.messages_dataframe["message"] )
def count_words_per_user(self):
# WIP
# number of words per user
return self.messages_dataframe.groupby(["user_name"]).sum().to_csv()
def count_words_per_user_per_channel
return self.messages_dataframe.groupby(["user_name", "channel"]).sum().to_csv()
def count_words_per_user_per_day
pass
if __name__ == "__main__":
par = Parser()
messages = par.return_csv()
users = par.get_user_info()
ana = Analyzer( messages, users )
ana.count_messages()
with open("message_stats.csv", 'w') as output:
output.write( ana.count_messages() )
output.close()
#print( par.get_user_info() )