├── .gitignore
├── Reddit_Bot_Classifier.pdf
├── reddit_bot_classifier_code.zip
├── __pycache__
├── items.cpython-36.pyc
└── user_scraper.cpython-36.pyc
├── .idea
├── misc.xml
├── vcs.xml
├── modules.xml
├── Reddit-Bot-Classifier.iml
└── workspace.xml
├── items.py
├── tests.py
├── README.md
├── user_scraper.py
├── deleted.txt
├── classifier.py
└── bot_accounts.txt
/.gitignore:
--------------------------------------------------------------------------------
1 | *.ini
2 | *.csv
3 | *.png
4 | *.PNG
5 | *.jpg
6 | visuals/*
7 | /visuals/*
8 | dump/*
--------------------------------------------------------------------------------
/Reddit_Bot_Classifier.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/norMNfan/Reddit-Bot-Classifier/HEAD/Reddit_Bot_Classifier.pdf
--------------------------------------------------------------------------------
/reddit_bot_classifier_code.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/norMNfan/Reddit-Bot-Classifier/HEAD/reddit_bot_classifier_code.zip
--------------------------------------------------------------------------------
/__pycache__/items.cpython-36.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/norMNfan/Reddit-Bot-Classifier/HEAD/__pycache__/items.cpython-36.pyc
--------------------------------------------------------------------------------
/__pycache__/user_scraper.cpython-36.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/norMNfan/Reddit-Bot-Classifier/HEAD/__pycache__/user_scraper.cpython-36.pyc
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/items.py:
--------------------------------------------------------------------------------
1 | class Redditor:
2 |
3 | username = ''
4 | post_karma = 0
5 | comment_karma = 0
6 | cake_day = 0
7 | is_bot = False
8 | comments = []
9 | posts = []
10 |
11 | def Redditor(self):
12 | self.username = ''
13 | self.post_karma = 0
14 | self.comment_karma = 0
15 | self.cake_day = 0
16 | self.is_bot = False
17 | self.comments = []
18 | self.posts = []
19 |
20 | def __setitem__(self, key, value):
21 | self[key] = value
22 |
23 |
--------------------------------------------------------------------------------
/tests.py:
--------------------------------------------------------------------------------
1 | import unittest
2 |
3 | from user_scraper import get_bot_usernames
4 | from user_scraper import get_usernames_currently_in_db
5 |
6 |
7 | class Tests(unittest.TestCase):
8 |
9 | def test_get_bot_names(self):
10 | self.assertEqual(len(get_bot_usernames()), 939, "There should be 939 bot account names")
11 |
12 | def test_get_regular_names(self):
13 | self.assertEqual(len(get_usernames_currently_in_db()), 1343, "There should be 1343 regular account names")
14 |
15 |
16 | if __name__ == '__main__':
17 | unittest.main()
--------------------------------------------------------------------------------
/.idea/Reddit-Bot-Classifier.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Reddit-Bot-Classifier
2 |
3 | This project classifies accounts on Reddit as bots or regular users.
4 |
5 | I originally created this project for an independent study project during my last semester of University but since then have adapted it to be used by others.
6 |
7 | There are two main files used in this project:
8 |
9 | - user_scraper.py
10 |
11 | This file is used to scrape user data from reddit and insert it into mongo db.
12 |
13 | - classifier.py
14 |
15 | This file performs all of the classification algorithms and creates all of the visualizations for the data.
16 |
17 | ## How to use this code
18 |
19 | 1. Clone this repository
20 |
21 | 2. Download [mongodb](https://www.mongodb.com/download-center/community)
22 |
23 | 3. Create Reddit account and then create a [developer application](https://www.reddit.com/prefs/apps)
24 | Step by step guide [here](https://github.com/reddit-archive/reddit/wiki/OAuth2)
25 |
26 | 4. Create a [praw.ini](https://praw.readthedocs.io/en/latest/getting_started/configuration/prawini.html) file with your reddit account credentials
27 | Put the praw.ini file in your main directory. It should look something like this:
28 |
29 | [bot1]
30 |
31 | client_id=XXXXXXXXXXXXXX
32 |
33 | client_secret=XXXXXXXXXXXXXXXXXXXXXXXXXXX
34 |
35 | password=XXXXXXXXXX
36 |
37 | username=XXXXXXXXXX
38 |
39 | 5. Run the user_scraper.py
40 |
41 | 6. Run the classifier_all() function in classifier.py
42 |
--------------------------------------------------------------------------------
/user_scraper.py:
--------------------------------------------------------------------------------
1 | import praw
2 | import json
3 | import pymongo
4 | import urllib.request
5 | from items import Redditor
6 |
7 | reddit = praw.Reddit('bot1', user_agent='bot1 user agent')
8 |
9 |
10 | # Scrape user information and store it in mongodb
11 | def scrape_users(usernames, is_bot):
12 |
13 | for author in filter_usernames(usernames):
14 |
15 | redditor = Redditor()
16 |
17 | # try/except because some users have been deleted
18 | try:
19 | user = reddit.redditor(author)
20 |
21 | redditor.username = author
22 | redditor.post_karma = user.link_karma
23 | redditor.comment_karma = user.comment_karma
24 | redditor.cake_day = user.created_utc
25 | redditor.is_bot = is_bot
26 | print('pass')
27 |
28 | except Exception as e:
29 | print(e)
30 | print("Reddit account " + author + " has been deleted")
31 | record_deleted_username(author)
32 | continue
33 |
34 | redditor.comments = get_user_comments(author)
35 | redditor.posts = get_user_posts(author)
36 |
37 | insert_user_into_mongo_db(redditor)
38 |
39 |
40 | def get_user_comments(author):
41 | comment_counter = 500
42 | last_utc = '1428624000'
43 | comments = []
44 |
45 | # Loop through all comments between 1428624000 (4/10/2015) to 1523318400 (4/10/18)
46 | # These are the dates that the bots were active
47 | while comment_counter == 500:
48 | comment_counter = 0
49 |
50 | # Add each comment to the user
51 | for comment in get_comment_data_from_user(author, last_utc)['data']:
52 | comments.append(create_comment_object_from_comment_data(comment))
53 | comment_counter = comment_counter + 1
54 | last_utc = str(comment['created_utc'] + 1)
55 |
56 | return comments
57 |
58 |
59 | def get_user_posts(author):
60 |
61 | post_counter = 500
62 | last_utc = '1428624000'
63 | posts = []
64 |
65 | # Loop through all posts between 1428624000 (4/10/2015) to 1523318400 (4/10/2018)
66 | # These are the dates that the bots were active
67 | while post_counter == 500:
68 | post_counter = 0
69 |
70 | # Add each post to the user
71 | for post in get_post_data_from_user(author, last_utc)['data']:
72 | posts.append(create_post_object_from_post_data(post))
73 | post_counter = post_counter + 1
74 | last_utc = str(post['created_utc'] + 1)
75 |
76 | return posts
77 |
78 |
79 | # Call Push Shift API to get Reddit user comments
80 | def get_comment_data_from_user(author, last_utc):
81 | url = 'https://api.pushshift.io/reddit/comment/search?after=' + last_utc + '&before=1523318400&size=500&author=' + author
82 | web_url = urllib.request.urlopen(url)
83 | contents = web_url.read()
84 | encoding = web_url.info().get_content_charset('utf-8')
85 | data = json.loads(contents.decode(encoding))
86 | return data
87 |
88 |
89 | def create_comment_object_from_comment_data(comment):
90 |
91 | # In case the subreddit has been deleted
92 | try:
93 | subreddit = comment['subreddit']
94 | except:
95 | subreddit = ''
96 |
97 | comment_object = {
98 | 'body': comment['body'],
99 | 'created_utc': comment['created_utc'],
100 | 'score': comment['score'],
101 | 'subreddit': subreddit
102 | }
103 | return comment_object
104 |
105 |
106 | def insert_user_into_mongo_db(redditor):
107 | client = pymongo.MongoClient('mongodb://localhost:27017')
108 | db = client['redditors']
109 | collection = db['redditors']
110 | collection.update({'username': redditor.username}, redditor.__dict__, upsert=True)
111 | client.close()
112 |
113 |
114 | def create_post_object_from_post_data(post):
115 |
116 | # In case the subreddit has been deleted
117 | try:
118 | subreddit = post['subreddit']
119 | except:
120 | subreddit = ''
121 |
122 | post_object = {
123 | 'created_utc': post['created_utc'],
124 | 'num_comments': post['num_comments'],
125 | 'over_18': post['over_18'],
126 | 'score': post['score'],
127 | 'subreddit': subreddit,
128 | 'title': post['title']
129 | }
130 |
131 | # Some posts don't have selftext
132 | try:
133 | post_object['selftext'] = post['selftext']
134 | except KeyError:
135 | post_object['selftext'] = ''
136 |
137 | return post_object
138 |
139 |
140 | # Call Push Shift API to collect user post data
141 | def get_post_data_from_user(author, last_utc):
142 | url = 'https://api.pushshift.io/reddit/submission/search?after=' + last_utc \
143 | + '&before=1523318400&size=500&author=' + author
144 | web_url = urllib.request.urlopen(url)
145 | contents = web_url.read()
146 | encoding = web_url.info().get_content_charset('utf-8')
147 | data = json.loads(contents.decode(encoding))
148 | return data
149 |
150 |
151 | # Keep track of deleted accounts
152 | def record_deleted_username(author):
153 | f = open("deleted.txt", "a+")
154 | f.write(author)
155 | f.write("\n")
156 | f.close()
157 |
158 |
159 | def filter_usernames(usernames):
160 | already_scraped_usernames = get_usernames_currently_in_db()
161 | deleted_usernames = get_deleted_usernames()
162 | authors = []
163 | for username in usernames:
164 | if username not in already_scraped_usernames and username not in deleted_usernames\
165 | and username != 'AutoModerator' and username != '[deleted]':
166 | authors.append(username)
167 | return authors
168 |
169 |
170 | def get_deleted_usernames():
171 |
172 | with open('deleted.txt', 'r') as data:
173 | lines = data.readlines()
174 |
175 | usernames = []
176 |
177 | for line in lines:
178 | usernames.append(line.split('\n')[0])
179 |
180 | return usernames
181 |
182 |
183 |
184 | def get_usernames_currently_in_db():
185 |
186 | client = pymongo.MongoClient('mongodb://localhost:27017')
187 | db = client['redditors']
188 | collection = db['redditors']
189 | documents = collection.find({}, {'username': True})
190 | client.close()
191 |
192 | return [document['username'] for document in documents]
193 |
194 |
195 | def get_bot_usernames():
196 |
197 | # read bot file
198 | with open('bot_accounts.txt', 'r') as data:
199 | lines = data.readlines()
200 |
201 | bot_usernames = []
202 |
203 | for line in lines:
204 | bot_usernames.append(line.split('\t')[0].split('/')[1])
205 |
206 | bot_redditors = []
207 |
208 | for name in bot_usernames:
209 | bot_redditors.append(reddit.redditor(name).name)
210 |
211 | bot_redditors.reverse()
212 |
213 | return bot_redditors
214 |
215 |
216 | # Get account names from random reddit users
217 | # We search all comments starting from 4/10/2015 0:00:00 (UTC)
218 | def get_account_names_from_reddit(limit):
219 |
220 | last_utc = '1428624000'
221 | authors = []
222 |
223 | while len(authors) < limit:
224 |
225 | data = get_reddit_users_after_utc(last_utc)
226 |
227 | for comment in data['data']:
228 | authors.append(comment['author'])
229 | last_utc = str(comment['created_utc']+1)
230 |
231 | return authors[:limit]
232 |
233 |
234 | def get_reddit_users_after_utc(last_utc):
235 | url = 'https://api.pushshift.io/reddit/comment/search?after=' + last_utc + '&before=1523318400&size=500'
236 | url = urllib.request.urlopen(url)
237 | contents = url.read()
238 | encoding = url.info().get_content_charset('utf-8')
239 | data = json.loads(contents.decode(encoding))
240 | return data
241 |
242 |
243 | def scrape_all_users(account_names, bot_names):
244 |
245 | scrape_users(account_names, False)
246 | scrape_users(bot_names, True)
247 |
248 |
249 | # Scrape bot and user accounts and insert their data into the db
250 | def scrape_accounts():
251 |
252 | MAX_ACCOUNTS = 1344
253 |
254 | bot_account_names = get_bot_usernames()
255 | regular_account_names = get_account_names_from_reddit(MAX_ACCOUNTS)
256 |
257 | scrape_all_users(regular_account_names, bot_account_names)
258 |
259 | scrape_accounts()
--------------------------------------------------------------------------------
/deleted.txt:
--------------------------------------------------------------------------------
1 | Tixoz
2 | onandonandonandon
3 | TheFreakWinger
4 | Mikedx42
5 | fluffythepoo
6 | brownbottleflu
7 | CadenMoran10
8 | networklackey
9 | deltacharlie82
10 | JayChimichanga
11 | jtj313
12 | GMU_TheHulk
13 | Alexandra_Morthana
14 | riders994
15 | hutchkc
16 | Onlycleanredditname
17 | barryenright2320
18 | trish1975
19 | demonninja911
20 | Yporti
21 | mohna85
22 | cannotorwillnot
23 | accidentalabort
24 | acken
25 | machyna
26 | JamesStrang
27 | tugg_romney
28 | AudioJunki
29 | TheoreticalThespian
30 | Mostlikelyme
31 | kittyshepherd93
32 | NumberOneStan
33 | Late_Night_Grumbler
34 | WakaIsMyWaifu
35 | anon1821
36 | callthebluff
37 | Liability42
38 | GirlFromYourTown
39 | DNA128k
40 | JohnnyReal
41 | My_Game_Account
42 | ofubeca
43 | mayotoast
44 | Pr0FiT
45 | Sitruckram
46 | Brony_Starstruck
47 | Altered_Equine
48 | Cfultz34
49 | TaxTime2015
50 | Goethe2go
51 | pscalfa
52 | IamA_Hobo_AMA
53 | Lord_Bill_Exe
54 | Hiwhatsupdoc
55 | PhillipCarey
56 | LaPerraDelDiablo
57 | Tixoz
58 | Sixteenarmed
59 | DonCherrysSuitAMA
60 | AceHarding
61 | Miyako-Hamasaki
62 | grrruuummmmpppyy
63 | Cendo
64 | Cz1975
65 | Citrus_supra
66 | NecroSpace
67 | PM_ME_UR_PLANTS
68 | LadyOops
69 | iamthegraham
70 | crabsock
71 | Jonas_Dralle
72 | kenaireb
73 | captain_proton
74 | deepblue001
75 | OptimisticRobotLord
76 | SarahLee
77 | gabed-em
78 | sigmayogi
79 | almostadjinn
80 | lordderplythethird
81 | stonedgummybear
82 | ansible_jane
83 | CarouselambraSucks
84 | YourAssComfortsMe
85 | YouHitMeWhereILikeIt
86 | hypnocomment
87 | MrCyn
88 | SlayerBVC
89 | L1nkk
90 | BanjoJalopy
91 | TheRosesAndGuns
92 | D-Gu
93 | NotBreaze
94 | freefrench
95 | swolkyrie
96 | KnyteTech
97 | neoblade1624
98 | Kumaton
99 | happygoth5433
100 | _Intuition_
101 | jjungsch
102 | Creepthan_Frome
103 | Reesespeanuts
104 | as_hagi
105 | RomaniPiere
106 | klausterfukken
107 | Locketpanda
108 | kwonza
109 | turtlegirl100
110 | Tman5293
111 | nope_nic_tesla
112 | somebody777
113 | Silenced_21
114 | thebrennagade
115 | ImLoveless
116 | Dafuzz
117 | Kyle_Boughton
118 | teenage_waistband
119 | timmojo
120 | yesoom
121 | Kythosos
122 | palch12
123 | thisismyfirstday
124 | PlanetGamerYT
125 | grouchyfrostgiant
126 | Cyridius
127 | texasguy911
128 | bigblackskateboard
129 | redditP
130 | a7rcana
131 | DaPlayerNinetyNine
132 | Gundamnitpete
133 | argyleecho
134 | blessedhellfire
135 | BaddestBrain
136 | punzada
137 | White-boy
138 | Ubahootah
139 | linkboy83
140 | AQuietMan
141 | GjallarRegime
142 | BrianBrecker
143 | Debonaire_Death
144 | KanjiKun
145 | Shotmaniac
146 | Chexjc
147 | twistdmentat
148 | jakethesnake87
149 | Tollazor
150 | wilfork4foood
151 | BIGGRIFF14
152 | agoody117
153 | SomeRandomNewYorker
154 | EVOSexyBeast
155 | HarHis
156 | euphemism5
157 | jandrese
158 | Mark2626
159 | 8BitHedgehog
160 | rainbowbunny56
161 | SilentSentinel
162 | mr_lab_rat
163 | Aardvark_Man
164 | WestCoastBestCoast01
165 | rosestoprose
166 | ProbabilityOfFail
167 | lifeoftheta
168 | Alexandra_Morthana
169 | prk_624
170 | neotropic9
171 | lifethroughawindow
172 | Augustus_Trollus_III
173 | ham_dog
174 | TheHermioneStranger
175 | handfulofsounds
176 | Getmethepresident11
177 | Bullshardt
178 | FannyBabbs
179 | Tiaraju9
180 | T3hHippie
181 | CollegeRuled
182 | IDslut
183 | Maxise
184 | clyde2003
185 | _neurotoxin_
186 | onandonandonandon
187 | TheFreakWinger
188 | Mikedx42
189 | fluffythepoo
190 | brownbottleflu
191 | CadenMoran10
192 | networklackey
193 | deltacharlie82
194 | JayChimichanga
195 | jtj313
196 | GMU_TheHulk
197 | Alexandra_Morthana
198 | riders994
199 | hutchkc
200 | Onlycleanredditname
201 | barryenright2320
202 | trish1975
203 | demonninja911
204 | Yporti
205 | mohna85
206 | cannotorwillnot
207 | accidentalabort
208 | acken
209 | machyna
210 | JamesStrang
211 | tugg_romney
212 | AudioJunki
213 | TheoreticalThespian
214 | Mostlikelyme
215 | kittyshepherd93
216 | NumberOneStan
217 | Late_Night_Grumbler
218 | WakaIsMyWaifu
219 | anon1821
220 | callthebluff
221 | Liability42
222 | GirlFromYourTown
223 | DNA128k
224 | JohnnyReal
225 | My_Game_Account
226 | ofubeca
227 | mayotoast
228 | Pr0FiT
229 | Sitruckram
230 | Brony_Starstruck
231 | Altered_Equine
232 | Cfultz34
233 | TaxTime2015
234 | Goethe2go
235 | pscalfa
236 | IamA_Hobo_AMA
237 | Lord_Bill_Exe
238 | Hiwhatsupdoc
239 | PhillipCarey
240 | LaPerraDelDiablo
241 | Tixoz
242 | Sixteenarmed
243 | DonCherrysSuitAMA
244 | onandonandonandon
245 | TheFreakWinger
246 | Mikedx42
247 | fluffythepoo
248 | brownbottleflu
249 | CadenMoran10
250 | networklackey
251 | deltacharlie82
252 | JayChimichanga
253 | jtj313
254 | GMU_TheHulk
255 | Alexandra_Morthana
256 | xSylrin
257 | peavarianez
258 | TheWrathMD
259 | bwaredapenguin
260 | richmaqq
261 | ludi_literarum
262 | PM_YOUR_PANTY_DRAWER
263 | revcon
264 | IWishIWasATurnip
265 | Besuh
266 | greggawatt
267 | mecasloth
268 | androbot
269 | Gratal
270 | Jaccount
271 | Ilovesloth
272 | moxiesmiley
273 | box_in_hand
274 | raloobs
275 | TheRabidCoder
276 | Tryingtobeok
277 | oriaven
278 | Lunaisbestpony42
279 | Turpskadey
280 | Lulubee79
281 | Banjoeman
282 | alienman82
283 | AmericasBlackProblem
284 | Porrick
285 | VelvetOnion
286 | Ranguvar
287 | DrLariat
288 | ilivetofly
289 | mmouth
290 | wiz_killa
291 | Axe_wound_crotch
292 | BlueFrogsAreGreen
293 | feuerfoxalpha
294 | diegogt98
295 | braveonion
296 | Kiernan88
297 | jacktiggs
298 | PATXS
299 | Tic_Tac_Goal
300 | CaptCrunch91
301 | Skaarg
302 | dejious
303 | iugameprof
304 | NovacElement
305 | putupyourdukes
306 | vbndizzle
307 | Clocktower-
308 | TommmmyD
309 | Dean_Guitarist
310 | princegb
311 | Charak-V
312 | TheArchist
313 | kristiebear
314 | TheFrizz
315 | eliseogonzalez
316 | in_the_yarbles
317 | FourMonthsEarly
318 | talking_cookie_shark
319 | cathshestands
320 | Robobble
321 | wdn
322 | pureguavaa
323 | sweener77
324 | kyojin25
325 | A_Snazzy_Turtle
326 | hanky1979
327 | Redective
328 | 211Nickey
329 | Kal1699
330 | Pasmao
331 | LordEnigma
332 | royal_dump
333 | LOLCENA
334 | youngjeww
335 | UrGoing2LuvMyNuts
336 | falseaccount92
337 | chaoticstability
338 | slapadastic
339 | Dzotshen
340 | idip31
341 | EnoughNoLibsSpam
342 | Anendtoabeginning
343 | Dont_be_an_idot
344 | aussiekinga
345 | Zukuto
346 | TSTMWKU
347 | neonpainted
348 | BunnyHuggles
349 | OfficialJokingOff
350 | Paradeta
351 | trusttheskinnychef
352 | PolyUre
353 | LeagueDown
354 | Waffle_kun
355 | bebopblues
356 | adarias
357 | savingrain
358 | K_S_REDF1RE
359 | mirzers
360 | KemosabeDouglas
361 | AndTheLink
362 | LA562
363 | Calcd_Uncertainty
364 | wazza3000
365 | lurker69
366 | xxfay6
367 | beerwithanolive
368 | squidparty
369 | Nearctic
370 | Meowingtons-PhD
371 | IamDokdo_AMA
372 | NegativityP0lice
373 | Artrur
374 | l_dont_even_reddit
375 | GreenCrackers
376 | thehammer100
377 | ketura
378 | Namru
379 | arkonum
380 | PurplePlanetOrange
381 | sunlitmountain
382 | jmazz65
383 | Kody02
384 | LosCabadrin
385 | CampBenCh
386 | Chucklezzz
387 | Acrylami
388 | Peanut1645
389 | wagedomain
390 | Cerafire
391 | damocles2501
392 | chw2006
393 | c3534l
394 | Yreisolgakig
395 | poormilk
396 | LiftsandSurvives
397 | teletraan1
398 | Pirellan
399 | TheYield
400 | Epitaph140
401 | CaptFluffyBunny
402 | ebenz87
403 | IRAn00b
404 | Head1lessZombie
405 | waaxz
406 | alwaystryharder
407 | devals
408 | thegreedyturtle
409 | LeFromageQc
410 | nbiscuitz
411 | _Uncle_Acid_
412 | TheVetNoob
413 | bigairbrodeo
414 | kilerabv
415 | Kilmacrennan
416 | Drshibby
417 | KeyserSoze96
418 | madguitarist007
419 | SadisticPenguin
420 | Enebula
421 | papi_chulo49
422 | tubcat
423 | AWildAmericanApeared
424 | MightyRoops
425 | Drunkenbull
426 | Kolma528
427 | ChamoRegulates
428 | darthbarracuda
429 | UnforeseenLuggage
430 | majesky
431 | Mapleleaf97
432 | HiddenSage
433 | WilliamBott
434 | Enraric
435 | guitargoosebandido
436 | TrulyMagnificient
437 | jetski76
438 | NoonebutMark
439 | yParticle
440 | RoadToHappiness
441 | fandette88
442 | drchoi21
443 | mountrainier
444 | SexSellsStats
445 | Belcaster
446 | S4int_Adri4n
447 | VirgilAsashima
448 | Rambo_Bond
449 | imakeelyu
450 |
--------------------------------------------------------------------------------
/.idea/workspace.xml:
--------------------------------------------------------------------------------
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 | print
53 | open
54 | collection
55 | classify_comment_dat
56 | classify_user
57 |
58 |
59 |
60 |
61 |
62 |
63 |
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 | 1557639217280
136 |
137 |
138 | 1557639217280
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 |
265 |
266 |
267 |
268 |
269 |
270 |
--------------------------------------------------------------------------------
/classifier.py:
--------------------------------------------------------------------------------
1 | import pymongo
2 | import time
3 | import datetime
4 | import pandas as pd
5 | import numpy as np
6 | import matplotlib.pyplot as plt
7 | from collections import Counter
8 | from nltk.stem.snowball import SnowballStemmer
9 | from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
10 | from sklearn.model_selection import train_test_split
11 | from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
12 | from sklearn.ensemble import ExtraTreesClassifier
13 | from sklearn.pipeline import Pipeline
14 | import scattertext as st
15 |
16 |
17 | class Classifier:
18 | def classify_all(self):
19 | classify_all()
20 |
21 | def classify_user(self, username):
22 | classify_user(username)
23 |
24 | def create_visualizations(self):
25 | create_interactive_visualizations()
26 | create_number_of_comments_and_posts_pie_chart()
27 | create_cake_day_histogram()
28 | create_time_of_day_for_comment_histogram()
29 |
30 |
31 | def classify_all():
32 |
33 | X_comments, X_comments_sub, Y_comments, Y_comments_sub = get_comment_data_from_mongo_for_all()
34 | X_posts, X_posts_sub, Y_posts, Y_posts_sub = get_post_data_from_mongo_for_all()
35 |
36 | print('------------------------------------------------------------')
37 | print_post_numbers(X_posts, Y_posts)
38 | print_comment_numbers(X_comments, Y_comments)
39 | print('------------------------------------------------------------')
40 |
41 | # Post subreddit
42 | print('post subreddit')
43 | classify(X_posts_sub, Y_posts_sub, stem=False)
44 | print('------------------------------------------------------------')
45 |
46 | # Comment subreddit
47 | print('comment subreddit')
48 | classify(X_comments_sub, Y_comments_sub, stem=False)
49 | print('------------------------------------------------------------')
50 |
51 | # Posts
52 | print('posts')
53 | classify(X_posts, Y_posts)
54 | print('------------------------------------------------------------')
55 |
56 | # Comments
57 | print('comments')
58 | classify(X_comments, Y_comments)
59 | print('------------------------------------------------------------')
60 |
61 |
62 | def classify(X, Y, stem=True):
63 |
64 | stemmer = SnowballStemmer('english')
65 |
66 | if stem:
67 | X = [' '.join([stemmer.stem(word) for word in text.split(' ')]) for text in X]
68 |
69 | # Split train/test data
70 | X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.20, random_state=31)
71 |
72 | # Able to add different classifiers to this list to compare their results
73 | classifiers = [ExtraTreesClassifier()]
74 |
75 | for classifier in classifiers:
76 |
77 | print(classifier)
78 |
79 | # Create pipeline: word vectorizer => create tfidf model => Run classifier
80 | text_clf = Pipeline([
81 | ('vect', CountVectorizer(lowercase=True, strip_accents='ascii', stop_words='english')),
82 | ('tfidf', TfidfTransformer()),
83 | ('clf', classifier),])
84 |
85 | # Train model
86 | text_clf.fit(X_train, Y_train)
87 |
88 | # Predict test data
89 | Y_pred = text_clf.predict(X_test)
90 | print(confusion_matrix(Y_pred, Y_test))
91 | print('accuracy: ' + str(accuracy_score(Y_test, Y_pred)))
92 | print(classification_report(Y_pred, Y_test))
93 |
94 | # Predict train data
95 | #predicted_train = text_clf.predict(X_train)
96 | #print('Train: ')
97 | #acc, precision, recall, f1 = evaluate(Y_train, predicted_train)
98 | #print("Evalution: Accuracy: %f\tPrecision: %f\tRecall: %f\tMacro-F1: %f" % (acc, precision, recall, f1))
99 | #print(confusion_matrix(predicted_train, Y_train))
100 | #print(classification_report(predicted_train, Y_train))
101 |
102 |
103 | def classify_users(X, Y, X_user, Y_user):
104 |
105 | if len(X_user) < 1 or len(Y_user) < 1:
106 | return
107 |
108 | # Create pipeline: word vectorizer => create tfidf model => Run NB classifier
109 | text_clf = Pipeline([
110 | ('vect', CountVectorizer()),
111 | ('tfidf', TfidfTransformer()),
112 | ('clf', ExtraTreesClassifier(n_estimators=10, max_depth=None, min_samples_split=2, random_state=0))
113 | ])
114 |
115 | # Train model
116 | text_clf.fit(X, Y)
117 |
118 | # Predict train data
119 | predicted_user = text_clf.predict(X_user)
120 | print('user accuracy: ' + str(np.mean(predicted_user == Y_user)))
121 | counter = Counter(predicted_user)
122 | print(counter)
123 | if counter[1] > counter[0]:
124 | print('bot')
125 | else:
126 | print('user')
127 |
128 |
129 | def classify_user(username):
130 |
131 | X_comments, X_comments_sub, Y_comments, Y_comments_sub = get_comment_data_from_mongo_for_all()
132 | X_posts, X_posts_sub, Y_posts, Y_posts_sub = get_post_data_from_mongo_for_all()
133 |
134 | X_comments_user, X_comments_sub_user, Y_comments_user, Y_comments_sub_user = get_comment_data_from_mongo_for_user(
135 | username)
136 | X_posts_user, X_posts_sub_user, Y_posts_user, Y_posts_sub_user = get_post_data_from_mongo_for_user(username)
137 |
138 | print('------------------------------------------------------------')
139 | print_post_numbers(X_posts, Y_posts)
140 | print_comment_numbers(X_comments, Y_comments)
141 | print('------------------------------------------------------------')
142 |
143 | # Post subreddit
144 | print('post subreddit')
145 | classify_users(X_posts_sub, Y_posts_sub, X_posts_sub_user, Y_posts_user)
146 | print('------------------------------------------------------------')
147 |
148 | # Comment subreddit
149 | print('comment subreddit')
150 | classify_users(X_comments_sub, Y_comments_sub, X_comments_sub_user, Y_comments_user)
151 | print('------------------------------------------------------------')
152 |
153 | # Posts
154 | print('posts')
155 | classify_users(X_posts, Y_posts, X_posts_user, Y_posts_user)
156 | print('------------------------------------------------------------')
157 |
158 | # Comments
159 | print('comments')
160 | classify_users(X_comments, Y_comments, X_comments_user, Y_comments_user)
161 | print('------------------------------------------------------------')
162 |
163 |
164 | def get_post_data_from_mongo_for_user(username):
165 | return get_post_data_from_mongo(username)
166 |
167 |
168 | def get_comment_data_from_mongo_for_user(username):
169 | return get_comment_data_from_mongo(username)
170 |
171 |
172 | def get_post_data_from_mongo_for_all():
173 | return get_post_data_from_mongo('')
174 |
175 |
176 | def get_comment_data_from_mongo_for_all():
177 | return get_comment_data_from_mongo('')
178 |
179 |
180 | def print_comment_numbers(X_comments, Y_comments):
181 | print('num comments: ' + str(len(X_comments)))
182 | print('\tnum bot comments: ' + str(Y_comments.count(1)))
183 | print('\tnum user comments: ' + str(Y_comments.count(0)))
184 |
185 |
186 | def print_post_numbers(X_posts, Y_posts):
187 | print('num posts: ' + str(len(X_posts)))
188 | print('\tnum bot posts: ' + str(Y_posts.count(1)))
189 | print('\tnum user posts: ' + str(Y_posts.count(0)))
190 |
191 |
192 | def get_comment_data_from_mongo(username):
193 | X_comments, Y_comments, X_comments_sub, Y_comments_sub = [], [], [], []
194 | # Get data from database
195 | for doc in get_redditor_collection().find({}):
196 |
197 | if doc['username'] == username:
198 | continue
199 |
200 | # Skip is account contains no comment and no posts
201 | if len(doc['comments']) < 1:
202 | continue
203 |
204 | X_comments_sub_obj = ''
205 |
206 | for comment in doc['comments']:
207 | X_comments_sub_obj = X_comments_sub_obj + comment['subreddit'] + ' '
208 | X_comments.append(comment['body'])
209 | if doc['is_bot']:
210 | Y_comments.append(1)
211 | else:
212 | Y_comments.append(0)
213 |
214 | # Add subreddit data
215 | X_comments_sub.append(X_comments_sub_obj)
216 | if doc['is_bot']:
217 | Y_comments_sub.append(1)
218 | else:
219 | Y_comments_sub.append(0)
220 | return X_comments, X_comments_sub, Y_comments, Y_comments_sub
221 |
222 |
223 | def get_post_data_from_mongo(username):
224 | X_posts, Y_posts, X_posts_sub, Y_posts_sub = [], [], [], []
225 | # Get data from database
226 | for doc in get_redditor_collection().find({}):
227 |
228 | if doc['username'] == username:
229 | continue
230 |
231 | # Skip is account contains no comment and no posts
232 | if len(doc['posts']) < 1:
233 | continue
234 |
235 | X_posts_sub_obj = ''
236 |
237 | for post in doc['posts']:
238 | X_posts_sub_obj = X_posts_sub_obj + post['subreddit'] + ' '
239 | X_posts.append(post['title'])
240 | if doc['is_bot']:
241 | Y_posts.append(1)
242 | else:
243 | Y_posts.append(0)
244 |
245 | X_posts_sub.append(X_posts_sub_obj)
246 | if doc['is_bot']:
247 | Y_posts_sub.append(1)
248 | else:
249 | Y_posts_sub.append(0)
250 | return X_posts, X_posts_sub, Y_posts, Y_posts_sub
251 |
252 |
253 | def create_interactive_visualizations():
254 |
255 | X_comments, Y_comments, X_posts, Y_posts = [], [], [], []
256 | X_comments_sub, X_posts_sub, Y_comments_sub, Y_posts_sub = [], [], [], []
257 |
258 | # Get data from database
259 | for doc in get_redditor_collection().find({}):
260 | X_comments_sub_obj = ''
261 | X_posts_sub_obj = ''
262 |
263 | if len(doc['comments']) < 1 and len(doc['posts']) < 1:
264 | continue
265 |
266 | # Add comment data
267 | for comment in doc['comments']:
268 | X_comments_sub_obj = X_comments_sub_obj + comment['subreddit'] + ' '
269 | X_comments.append(comment['body'])
270 | if doc['is_bot']:
271 | Y_comments.append(1)
272 | else:
273 | Y_comments.append(0)
274 |
275 | # Add post data
276 | for post in doc['posts']:
277 | X_posts_sub_obj = X_posts_sub_obj + post['subreddit'] + ' '
278 | X_posts.append(post['title'])
279 | if doc['is_bot']:
280 | Y_posts.append(1)
281 | else:
282 | Y_posts.append(0)
283 |
284 | # Add subreddit data
285 | X_comments_sub.append(X_comments_sub_obj)
286 | X_posts_sub.append(X_posts_sub_obj)
287 | if doc['is_bot']:
288 | Y_comments_sub.append(1)
289 | Y_posts_sub.append(1)
290 | else:
291 | Y_comments_sub.append(0)
292 | Y_posts_sub.append(0)
293 |
294 | data = np.empty([len(X_comments), 2], dtype=object)
295 | data[:, 0] = Y_comments
296 | data[:, 1] = X_comments
297 |
298 | for d in data:
299 | if d[0] == 0:
300 | d[0] = 'normal'
301 | else:
302 | d[0] = 'bot'
303 |
304 | df = pd.DataFrame({'label': data[:, 0], 'text':data[:, 1]})
305 | print(df)
306 |
307 | corpus = (st.CorpusFromPandas(df, category_col='label', text_col='text', nlp=st.whitespace_nlp_with_sentences)
308 | .build()
309 | .get_unigram_corpus()
310 | .compact(st.ClassPercentageCompactor(term_count=2, term_ranker=st.OncePerDocFrequencyRanker)))
311 |
312 | html = st.produce_characteristic_explorer(
313 | corpus,
314 | category='normal',
315 | category_name='Normal',
316 | not_category_name='Bot'
317 | )
318 | open('comment_text_chart.html', 'wb').write(html.encode('utf-8'))
319 |
320 |
321 | def create_number_of_comments_and_posts_pie_chart():
322 |
323 | X_comments, X_comments_sub, Y_comments, Y_comments_sub = get_comment_data_from_mongo_for_all()
324 | X_posts, X_posts_sub, Y_posts, Y_posts_sub = get_post_data_from_mongo_for_all()
325 |
326 | # Create post pie chart
327 | labels = 'Normal', 'Bot'
328 | sizes = [Y_posts.count(0), Y_posts.count(1)]
329 | colors = ['blue', 'red']
330 | explode = (0, 0.1)
331 | plt.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', shadow=True, startangle=140)
332 | plt.axis('equal')
333 | plt.show()
334 |
335 | # Create comment pie chart
336 | labels = 'Normal', 'Bot'
337 | sizes = [Y_comments.count(0), Y_comments.count(1)]
338 | colors = ['blue', 'red']
339 | explode = (0, 0.1)
340 | plt.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', shadow=True, startangle=140)
341 | plt.axis('equal')
342 | plt.show()
343 |
344 |
345 | def create_cake_day_histogram():
346 |
347 | bot_cake_days, normal_cake_days = [], []
348 |
349 | # Get data from database
350 | for doc in get_redditor_collection().find({}):
351 | if doc['is_bot']:
352 | t = (datetime.datetime.fromtimestamp(doc['cake_day']),)
353 | bot_cake_days.append(t)
354 | else:
355 | t = (datetime.datetime.fromtimestamp(doc['cake_day']),)
356 | normal_cake_days.append(t)
357 |
358 | labels = ['date']
359 |
360 | df_bots = pd.DataFrame.from_records(bot_cake_days, columns=labels)
361 | df_normal = pd.DataFrame.from_records(normal_cake_days, columns=labels)
362 |
363 | data = np.array([['', 'Num'], ['Bots', len(bot_cake_days)], ['Users', len(normal_cake_days)]])
364 |
365 | print(pd.DataFrame(data=data[1:, 1:], index=data[1:, 0], columns=data[0, 1:]))
366 |
367 | df = pd.DataFrame({'Number of accounts': ['Bot', 'Normal'], 'val':[len(bot_cake_days), len(normal_cake_days)]})
368 | df.plot.bar(x='Number of accounts', y='val', rot=0)
369 |
370 | df_bots["date"] = df_bots["date"].astype("datetime64")
371 | df_bots.groupby([df_bots["date"].dt.year, df_bots["date"].dt.month]).count().plot(kind="bar")
372 |
373 | df_normal["date"] = df_normal["date"].astype("datetime64")
374 | df_normal.groupby([df_normal["date"].dt.year, df_normal["date"].dt.month]).count().plot(kind="bar")
375 |
376 | print(df_bots)
377 | print(df_normal)
378 |
379 | visualize(df_bots)
380 | visualize(df_normal)
381 |
382 |
383 | def create_time_of_day_for_comment_histogram():
384 |
385 | bot_comments, normal_comments = [], []
386 |
387 | # Get data from database
388 | for doc in get_redditor_collection().find({}):
389 | if doc['is_bot']:
390 | for comment in doc['comments']:
391 | t = (datetime.datetime.fromtimestamp(comment['created_utc']),)
392 | bot_comments.append(t)
393 | else:
394 | for comment in doc['comments']:
395 | t = (datetime.datetime.fromtimestamp(comment['created_utc']),)
396 | normal_comments.append(t)
397 |
398 | labels = ['date']
399 |
400 | df_bots = pd.DataFrame.from_records(bot_comments, columns=labels)
401 | df_normal = pd.DataFrame.from_records(normal_comments, columns=labels)
402 |
403 | visualize(df_bots, title='bot users')
404 | visualize(df_normal, title='normal users')
405 |
406 |
407 | def get_redditor_collection():
408 | client = pymongo.MongoClient('mongodb://localhost:27017')
409 | db = client['redditors']
410 | collection = db['redditors']
411 | client.close()
412 | return collection
413 |
414 |
415 | # Creates histogram of a dataframe
416 | def visualize(df, column_name='date', color='#494949', title=''):
417 |
418 | plt.figure(figsize=(20, 10))
419 | ax = (df[column_name].groupby(df[column_name].dt.hour)
420 | .count()).plot(kind="bar", color=color)
421 | ax.set_facecolor('#eeeeee')
422 | ax.set_xlabel("hour of the day")
423 | ax.set_ylabel("count")
424 | ax.set_title(title)
425 | plt.show()
426 | plt.savefig('visuals/' + title + '.png')
--------------------------------------------------------------------------------
/bot_accounts.txt:
--------------------------------------------------------------------------------
1 | u/BlackToLive -16
2 | u/FaurnFlamebreaker -10
3 | u/bill_jonson -8
4 | u/PurebringerOghmagra -5
5 | u/clawisma -2
6 | u/jake_browny -1
7 | u/Georgie_Felix -1
8 | u/george_BENTLEY -1
9 | u/rico_penya 0
10 | u/Leprechaun_yura 0
11 | u/Admiraf 0
12 | u/lgbtunited 0
13 | u/20twony 0
14 | u/momaskin 0
15 | u/FelhafymDugrel 0
16 | u/DoriraKam 0
17 | u/DalaghmaMajurus 0
18 | u/IfiacelMoogutaxe 0
19 | u/AragelvBlackkiller 0
20 | u/SsoncenModifyn 0
21 | u/KulagdaMneriel 0
22 | u/BloodbearerBusius 0
23 | u/SteeldefenderZululm 0
24 | u/TaushakarGrantrius 0
25 | u/FlameweaverTokazahn 0
26 | u/MunirusDrelalas 0
27 | u/JoJosarBlacksong 0
28 | u/ZulkilkreeMazucage 0
29 | u/RexcliffVushura 0
30 | u/KizragoreMajin 0
31 | u/MograMarn 0
32 | u/RedseekerMami 0
33 | u/StardwellerFordrezi 0
34 | u/PaineyeDaron 0
35 | u/RexscarNalmekelv 0
36 | u/SaberstalkerTygorr 0
37 | u/GhoginnModilbine 0
38 | u/BeariArashura 0
39 | u/ZalarGroshakar 0
40 | u/DaktilarMarirus 0
41 | u/GhozarIannn 0
42 | u/AdofynMorakus 0
43 | u/FelorielBalladolore 0
44 | u/SaimathJurisar 0
45 | u/ZulkizragoreLairdan 0
46 | u/BrargasYggndis 0
47 | u/FordreninDalas 0
48 | u/GavidiKenrad 0
49 | u/NikojindDalarad 0
50 | u/SharpgroveMagal 0
51 | u/AkinotilarGardana 0
52 | u/ShadowhammerFelozan 0
53 | u/FelorgasAlsagelv 0
54 | u/ArashillCererana 0
55 | u/YozshulkisNighthamm 0
56 | u/FelothisRagegrove 0
57 | u/KigagrelMightrunner 0
58 | u/BalbineSnowbourne 0
59 | u/HugilmeenaBurinrad 0
60 | u/BagraBludwood 0
61 | u/TetaurDizragore 0
62 | u/KazshuraDoommaster 0
63 | u/KularimGaviril 0
64 | u/TaulabarMumi 0
65 | u/NilkisZargas 0
66 | u/DoukasaZahelm 0
67 | u/BalladoranaBalhala 0
68 | u/IshnntriusBufym 0
69 | u/ManadorSternfont 0
70 | u/SaithrisShakajas 0
71 | u/ArarisarStarbinder 0
72 | u/MakazahnFelodwyn 0
73 | u/KulaNegore 0
74 | u/ShalirgasFetaur 0
75 | u/PeghmaGoldenfist 0
76 | u/DawnravenFenritaur 0
77 | u/HugirisBoth 0
78 | u/DilarNitius 0
79 | u/NelrajasAndromardre 0
80 | u/DoukusGujar 0
81 | u/TaushuraJujind 0
82 | u/MavehelmMightblade 0
83 | u/TanrisVijinn 0
84 | u/MolarZulugar 0
85 | u/KajizragoreJojurus 0
86 | u/KulariTezshura 0
87 | u/MorlurusShagelv 0
88 | u/GaranBurithris 0
89 | u/JurgKagashakar 0
90 | u/MalarilZolorn 0
91 | u/KenisLightwing 0
92 | u/DokelvCentrillador 0
93 | u/VolkisDulmaran 0
94 | u/ThobandisGavinaya 0
95 | u/GonosShak 0
96 | u/ModidredAnanadar 0
97 | u/RainwormKigak 0
98 | u/DoukSaris 0
99 | u/ThorisPerintrius 0
100 | u/MazukazahnFlamebrin 0
101 | u/AdriesidaVolmaran 0
102 | u/ThotiusBalis 0
103 | u/KigashoBlackmoon 0
104 | u/YorgAndrozan 0
105 | u/AndromalladorAnayan 0
106 | u/MorardanaForad 0
107 | u/GrojoraAxebinder 0
108 | u/RunebringerSaberdra 0
109 | u/GavirusBurus 0
110 | u/GavizelMazumi 0
111 | u/MajinnSpellgrove 0
112 | u/RaindwellerKasho 0
113 | u/NafymAriugelv 0
114 | u/ShalilisDaill 0
115 | u/vadro 0
116 | u/jay_cook 0
117 | u/eblun 0
118 | u/marshallwayneee 0
119 | u/thomas_baxter 0
120 | u/chrisrockyou 0
121 | u/tomwiek 0
122 | u/IndianaLewis666 0
123 | u/peterpenpeter 0
124 | u/AllanMcPherson2 0
125 | u/GeraldineKnapp 0
126 | u/coolpau 0
127 | u/RichardPhilbrick 0
128 | u/MichelleBerends 0
129 | u/m_peltier 0
130 | u/hymynameisharold 0
131 | u/chillypepperchilly 0
132 | u/marcus_jones 0
133 | u/lisa_kelley 0
134 | u/lipstickred 0
135 | u/sasanbasan 0
136 | u/sunshinesunny 0
137 | u/RichardShannon 0
138 | u/nu3goxyu 0
139 | u/TaraLynnRussel 0
140 | u/YnellieryFezilkree 0
141 | u/MeztimGavijurus 0
142 | u/DathrisKelabar 0
143 | u/MeztikusVusar 0
144 | u/DoularZulkijas 0
145 | u/KariusToshura 0
146 | u/KaziraSirardin 0
147 | u/DarimTatilar 0
148 | u/FelordanaAkinojinn 0
149 | u/KazitaurTruemane 0
150 | u/BlackforgeKazikazah 0
151 | u/AdorahuginnKele 0
152 | u/BallariusAgamantriu 0
153 | u/AdorakelvFelolis 0
154 | u/GholbinradCentrilsa 0
155 | u/KazilCentrilhala 0
156 | u/DurnAdrierdana 0
157 | u/FrostmoonVur 0
158 | u/LandaathDalbine 0
159 | u/TygraswynBloodblade 0
160 | u/TruthwindDawnhunter 0
161 | u/CordalenKeralsa 0
162 | u/FenriranWhiteeye 0
163 | u/MarinaraMolis 0
164 | u/FaucageDoomsmith 0
165 | u/MalakusShagore 0
166 | u/DagdagrinnThordin 0
167 | u/MezizilkreeRunewind 0
168 | u/SaithilarOghmarus 0
169 | u/MoramarVorr 0
170 | u/AralmaranGajinn 0
171 | u/ShajarDalardred 0
172 | u/BranayaKeletius 0
173 | u/BuMolhala 0
174 | u/SaithiniusManakus 0
175 | u/ThunderbringerKagre 0
176 | u/AratGavith 0
177 | u/RedhammerVusho 0
178 | u/FernRunecaster 0
179 | u/DofymZumuro 0
180 | u/DirehammerDoomworm 0
181 | u/BuzarusNathris 0
182 | u/DagdalarDoulrajas 0
183 | u/BeazedredLaighma 0
184 | u/ShalrajasMightbring 0
185 | u/BuzaradAna 0
186 | u/TaularLightkiller 0
187 | u/FenrisMnegrinn 0
188 | u/HellbearerIshn 0
189 | u/NajasMecage 0
190 | u/DokasaDoushakar 0
191 | u/BalaceDait 0
192 | u/AnararanaModith 0
193 | u/DougoreDaghma 0
194 | u/GholbiziusGramand 0
195 | u/CenradNuarad 0
196 | u/MubandisAxeweaver 0
197 | u/BuriathFelordred 0
198 | u/GholisMazumi 0
199 | u/FearlessbrewGazrago 0
200 | u/DawnsongMalador 0
201 | u/DagdalenShaligra 0
202 | u/TygolkreeTygorn 0
203 | u/BlackstalkerZulkisi 0
204 | u/GorgMoogukus 0
205 | u/MorlugdaMugore 0
206 | u/KagalkisArigar 0
207 | u/CemeenaShaswyn 0
208 | u/ZujarDalara 0
209 | u/OpiwieldKirr 0
210 | u/AdriekusFlameworker 0
211 | u/TholoreMorlurgas 0
212 | u/ModiborThorgalis 0
213 | u/KazrajoraMofyn 0
214 | u/VujoraNightworker 0
215 | u/MalogamandGrarne 0
216 | u/WrathshadeButh 0
217 | u/ZulkibeiTruefire 0
218 | u/DaitIshnth 0
219 | u/LasiusNalmeswyn 0
220 | u/NagelvConjugar 0
221 | u/KajimShadoweye 0
222 | u/JoJotTygramand 0
223 | u/UmlasMekus 0
224 | u/IanradKisho 0
225 | u/KanosDoulrajas 0
226 | u/TaujinnStonewind 0
227 | u/DozuruSteelbringer 0
228 | u/KathribandisZa 0
229 | u/ThunderbringerKajin 0
230 | u/MoonshadeGavifyn 0
231 | u/GranithisKirizar 0
232 | u/TetAndromalak 0
233 | u/PerilasBlackflame 0
234 | u/BroadshaperNualar 0
235 | u/FordrenisBloodstaff 0
236 | u/CentrilvKashura 0
237 | u/RockravenShaktilmar 0
238 | u/ColasDushura 0
239 | u/MunilsaNilanin 0
240 | u/DianatiusFaern 0
241 | u/GoshuraAdrienn 0
242 | u/FenrilmaranMarin 0
243 | u/TygrargasShadowstaf 0
244 | u/CedredKirimath 0
245 | u/ZaDacage 0
246 | u/GravelbeardUmdar 0
247 | u/DutBlackshaper 0
248 | u/DuraKiririm 0
249 | u/NikolabarMezticage 0
250 | u/FordregdaNualis 0
251 | u/FordremeenaModred 0
252 | u/TaulrajasHugifyn 0
253 | u/FelhazarVim 0
254 | u/KathridarSaigar 0
255 | u/BeazedredHunin 0
256 | u/GuzuruKarin 0
257 | u/KatiusNalmeginn 0
258 | u/FomandAndroath 0
259 | u/KazikazahnShakalkis 0
260 | u/MavegrinnOghmagar 0
261 | u/YozshurnDousar 0
262 | u/MalanimSashakar 0
263 | u/KazilkreeGavidi 0
264 | u/ThetatiusTojatilar 0
265 | u/AndrothrisAkile 0
266 | u/ZulkilmaranFearless 0
267 | u/AnayarnDusar 0
268 | u/AuziusPebor 0
269 | u/LighthammerAdora 0
270 | u/OghmarielMorarne 0
271 | u/KeralvMalarin 0
272 | u/BeazekusGavilmeena 0
273 | u/KekoraFejar 0
274 | u/FaeshuraDirehammer 0
275 | u/FoBeazezar 0
276 | u/KaborBearis 0
277 | u/GarisarCentri 0
278 | u/BanrisShagal 0
279 | u/ZulkizuruMauzahn 0
280 | u/DelameenaDailar 0
281 | u/CordaradKeraswyn 0
282 | u/MenrisLainn 0
283 | u/KejindGolabar 0
284 | u/MalakusGobei 0
285 | u/WhispermaneGakinos 0
286 | u/ToktilarJular 0
287 | u/ShaathRedweaver 0
288 | u/GullMalazuru 0
289 | u/TygozilkreeDandis 0
290 | u/SamuhnCelen 0
291 | u/BraathGhondis 0
292 | u/DarkshaperWhiteblad 0
293 | u/DozahnBlacksmasher 0
294 | u/MalarnBuginn 0
295 | u/NuadagasMudor 0
296 | u/FeloraShadowbringer 0
297 | u/MaloathFordrethis 0
298 | u/BandidarKagaramar 0
299 | u/GoltigoreArashishak 0
300 | u/FolasMogrel 0
301 | u/GamiBalladolune 0
302 | u/AurilakSaijurus 0
303 | u/DainosAndromaswyn 0
304 | u/BlackstaffCordazar 0
305 | u/NikinosTygranius 0
306 | u/NiramarSaithithis 0
307 | u/GriborSasho 0
308 | u/MiranadarAnardana 0
309 | u/UmluneYolar 0
310 | u/VozilkreeStonebreak 0
311 | u/MagedwellerMaloriel 0
312 | u/BusidaHuginadar 0
313 | u/DugisSabermaster 0
314 | u/BuVoodoogul 0
315 | u/AgathrisRockweaver 0
316 | u/DuzshuraMorlurn 0
317 | u/StarsmithPurefang 0
318 | u/PezarMadal 0
319 | u/GholbisiusAdrieginn 0
320 | u/PerilasMawield 0
321 | u/NaraWhitehunter 0
322 | u/PeridwynSaithilis 0
323 | u/FauraBugas 0
324 | u/AnayaronAdorarin 0
325 | u/MekreeKeswyn 0
326 | u/BlackraySinshaper 0
327 | u/DabeiSharpdefender 0
328 | u/GoldskinKelmaran 0
329 | u/KajihnGavinn 0
330 | u/SindwellerKerarne 0
331 | u/AgafynFefym 0
332 | u/BallariFelorus 0
333 | u/MoranShadowdragon 0
334 | u/DalasMorlubandis 0
335 | u/RunebourneMavetus 0
336 | u/JothisMokus 0
337 | u/MezilrajasRainconju 0
338 | u/DawnfistKirirdana 0
339 | u/JutAkinolar 0
340 | u/MakinosMazugis 0
341 | u/DoginnSirarim 0
342 | u/NalkreeKadwyn 0
343 | u/LajurusOghmagamand 0
344 | u/BearadGakus 0
345 | u/PerilisMezisida 0
346 | u/FordrehuginnNilarga 0
347 | u/GoltirrNuadaswyn 0
348 | u/SaberwoodMikakazahn 0
349 | u/TernCoidar 0
350 | u/IanrisFordrebor 0
351 | u/KelePerdin 0
352 | u/BallargasFenribar 0
353 | u/ArijurusRunesmasher 0
354 | u/SaitiusGrilen 0
355 | u/BurilNuadadred 0
356 | u/MoogumuroGalrajas 0
357 | u/NalmeathFordreril 0
358 | u/SaithihelmDathris 0
359 | u/DoomseekerDakelv 0
360 | u/MoogukoraDugore 0
361 | u/BuzathisWhitebrew 0
362 | u/NiNizahn 0
363 | u/OpindisCordafyn 0
364 | u/MutaxeDorinrad 0
365 | u/MalatiusJokus 0
366 | u/MalmaranBurilbine 0
367 | u/NaziusTujora 0
368 | u/ShalilsaVor 0
369 | u/CererneGardasar 0
370 | u/AriloreKesida 0
371 | u/ConjularAdolore 0
372 | u/TaukoraBrakus 0
373 | u/ThordanaLaigelv 0
374 | u/MavergasTholak 0
375 | u/SardredWhiteblade 0
376 | u/SiramandThordirgas 0
377 | u/NalisShaktimi 0
378 | u/KazraktilarBluebear 0
379 | u/ShaktisidaMoogum 0
380 | u/SteelbrewGavirad 0
381 | u/MolarMavellador 0
382 | u/AriginnKerin 0
383 | u/GranadarPenrad 0
384 | u/BuzalisFern 0
385 | u/DofymArcaneredeemer 0
386 | u/PezanArigrinn 0
387 | u/NuadagarKelenadar 0
388 | u/KigashicageTegas 0
389 | u/ThunderwalkerAurida 0
390 | u/SanadarDagdara 0
391 | u/ShalirusDoomcliff 0
392 | u/AuririBeagrinn 0
393 | u/BuzagasVinris 0
394 | u/AdoswynShakam 0
395 | u/YotilarMaramar 0
396 | u/SamukazahnThunderfu 0
397 | u/AkinorgWhisperforge 0
398 | u/GraveleyeGardana 0
399 | u/BakTygralore 0
400 | u/ShalimathKekelv 0
401 | u/KajoraDelalas 0
402 | u/KejindMoogucage 0
403 | u/ArashiraMirantrius 0
404 | u/ThordibandisCentrin 0
405 | u/IronhammerGholbithr 0
406 | u/BoathDoushakar 0
407 | u/DianarneFelhandis 0
408 | u/DianafymMeztira 0
409 | u/UmgraDoomcaster 0
410 | u/GralladorTojall 0
411 | u/SinbinderMezikasa 0
412 | u/ThunderbreakerTuram 0
413 | u/IshnnayaKendis 0
414 | u/MorinBandikelv 0
415 | u/ZurFergas 0
416 | u/BragulBuzagda 0
417 | u/ManarinDorizar 0
418 | u/NarrTauzuru 0
419 | u/TygotDorifyn 0
420 | u/MadiIanlace 0
421 | u/BuzariusCowield 0
422 | u/BeazarStoneflame 0
423 | u/WhitebrewOghmalore 0
424 | u/MarinradMorlundis 0
425 | u/DalsaGholbilis 0
426 | u/ShalinadarForcegrov 0
427 | u/MagulZolodal 0
428 | u/JuzshuraDusho 0
429 | u/AnagasAdorann 0
430 | u/SatiusKathrilar 0
431 | u/MolabarThetalis 0
432 | u/KeleginnGa 0
433 | u/MenosMerg 0
434 | u/MaurisarKiri 0
435 | u/IanniusFaurr 0
436 | u/KelelarArindis 0
437 | u/MebeiManadwyn 0
438 | u/BlackbreakerDalalsa 0
439 | u/BaloreDarne 0
440 | u/NakazahnDogul 0
441 | u/BurikusVogar 0
442 | u/DogarSaithigamand 0
443 | u/TruesingerYggbandis 0
444 | u/GoltijinPurepick 0
445 | u/DoridorMalanrad 0
446 | u/VishoSardred 0
447 | u/BlackfangSinbeard 0
448 | u/GujarBuzarius 0
449 | u/BalabarTruesinger 0
450 | u/BroadsongKegar 0
451 | u/SamularMavelas 0
452 | u/AnayawynIansida 0
453 | u/YozshulkreeKathriwi 0
454 | u/DiananradKula 0
455 | u/ButhrisNecage 0
456 | u/GrosarGhollador 0
457 | u/DirehammerTojajin 0
458 | u/GranradAgazar 0
459 | u/ZagelvKirilmeena 0
460 | u/MebarConjulhala 0
461 | u/DadredGawield 0
462 | u/ThohuginnDianardred 0
463 | u/BluerayAkinorn 0
464 | u/NirdinKazrall 0
465 | u/KulanadarMazubar 0
466 | u/NightravenJoJotilar 0
467 | u/GutilarBlackraven 0
468 | u/GhosiusAraswyn 0
469 | u/NitFothris 0
470 | u/MirandisStoneblade 0
471 | u/FrostdragonTukus 0
472 | u/FlamebringerRockdwe 0
473 | u/GaluneManis 0
474 | u/ModinadarKamuro 0
475 | u/KigaleLaidred 0
476 | u/KigajoraTruemaster 0
477 | u/KedarGavirne 0
478 | u/PeriBeamath 0
479 | u/WindscarThetarim 0
480 | u/MalazelHellwarden 0
481 | u/FlamesmasherMalordr 0
482 | u/ThunderconjurorDark 0
483 | u/DaranBlueworker 0
484 | u/KerameenaShalimath 0
485 | u/AnarardredStonebran 0
486 | u/FrostshadeMozil 0
487 | u/ArashirAgarin 0
488 | u/ThorgalarKalar 0
489 | u/KargBeazeswyn 0
490 | u/OghmalarDoomray 0
491 | u/ThontriusMaulkis 0
492 | u/GornSham 0
493 | u/NikomuroCeris 0
494 | u/IronwormGrirdana 0
495 | u/VojinThordithis 0
496 | u/GamathTura 0
497 | u/SpellhunterGaktilar 0
498 | u/MneborFlamemaster 0
499 | u/SilverdefenderNuada 0
500 | u/MalasarCordanius 0
501 | u/AndromaziusShakalar 0
502 | u/YggwieldKagakree 0
503 | u/YozshusidaMujora 0
504 | u/MuthYole 0
505 | u/KagazuruMarin 0
506 | u/JumuroFlameweaver 0
507 | u/MajindSirahuginn 0
508 | u/HuginnShantrius 0
509 | u/NightbreakerCefym 0
510 | u/IroneyeManagar 0
511 | u/NikokazahnSpellston 0
512 | u/DarkbreakerBeazenar 0
513 | u/RagescarTejin 0
514 | u/StarredeemerFlamebr 0
515 | u/AuriborSternworker 0
516 | u/ConjuDrelatius 0
517 | u/DagdalisStoneweaver 0
518 | u/MoonwardenAdrierdin 0
519 | u/KigagorZujin 0
520 | u/DailarKezshura 0
521 | u/DianatusSharpcliff 0
522 | u/SaberwardenBabandis 0
523 | u/BalladothisBragami 0
524 | u/KillTygoll 0
525 | u/MaveghmaSamurg 0
526 | u/MosidaBlacksinger 0
527 | u/BagraMolar 0
528 | u/TegrelKajilkree 0
529 | u/KillThowield 0
530 | u/AdorariusBrightflam 0
531 | u/SwordfistBraktilar 0
532 | u/KaziktilarYokus 0
533 | u/MirnSairne 0
534 | u/MaririelNila 0
535 | u/KeramarKemand 0
536 | u/ArashigrelVudolmara 0
537 | u/LamathConjurdin 0
538 | u/GozshuraTagrel 0
539 | u/MuzilDoritius 0
540 | u/CewieldGranius 0
541 | u/CordaKat 0
542 | u/MoshicageCentrirdre 0
543 | u/TauzragoreAndrolune 0
544 | u/AndromajurusDianage 0
545 | u/FlamebinderFelhadre 0
546 | u/GoldenwoodAnayawiel 0
547 | u/PainforgeKigagis 0
548 | u/DoutaxeDijora 0
549 | u/FelhardredLandabor 0
550 | u/KagataxeDala 0
551 | u/OpintriusMalador 0
552 | u/GoltirnAdrie 0
553 | u/GraniziusAndromaghm 0
554 | u/VuzilHuwyn 0
555 | u/MunirielDawnsmith 0
556 | u/MadiTor 0
557 | u/MashuraManalmeena 0
558 | u/KakelvGror 0
559 | u/DarisFelar 0
560 | u/TetaurTashura 0
561 | u/BroadbrandStoneweav 0
562 | u/KirnGavinrasida 0
563 | u/ArisidaFaekasa 0
564 | u/BlackwardenVudozil 0
565 | u/AurinisNuadardred 0
566 | u/GardalmaranMelkis 0
567 | u/AdoralanimBlackpick 0
568 | u/KazratBeazenn 0
569 | u/TygralasModidred 0
570 | u/BuriAnage 0
571 | u/MoogugorAkinotaxe 0
572 | u/GriraAgabor 0
573 | u/NiladredMajar 0
574 | u/GrinayaMunilanim 0
575 | u/BumeenaJulrajas 0
576 | u/MumiMikagis 0
577 | u/BeazegdaAgaril 0
578 | u/BloodshadeMoonweave 0
579 | u/JusarCoginn 0
580 | u/MetilarMavenadar 0
581 | u/DogisVogrel 0
582 | u/NightwindLagar 0
583 | u/KazragoreMale 0
584 | u/AnaraninMagar 0
585 | u/DagdaranaAkilmaran 0
586 | u/ShakalrajasTholsa 0
587 | u/WhitebringerTewyn 0
588 | u/KagazshuraDoulrajas 0
589 | u/KagorJuhn 0
590 | u/AuridredDarad 0
591 | u/VisarColace 0
592 | u/RainsongTojarn 0
593 | u/SteelfontKeleris 0
594 | u/ZukazahnAurifym 0
595 | u/LandadorJoJora 0
596 | u/StonewoodCoirus 0
597 | u/SiralhalaYojin 0
598 | u/SinweaverMordred 0
599 | u/AurigeAnarin 0
600 | u/KiriTygramath 0
601 | u/ArajinTaukazahn 0
602 | u/MalarAdosius 0
603 | u/ShaktilkisTumuro 0
604 | u/YorgConjunara 0
605 | u/JoJolarKathrimand 0
606 | u/paulgrapes 0
607 | u/rapitangnyy 0
608 | u/artautumn 0
609 | u/dipperhummer 0
610 | u/Ten_GOP 0
611 | u/ny_black_protest 0
612 | u/andy1235 0
613 | u/magaing4trump 0
614 | u/gogomrbrown 0
615 | u/MatEvidence 0
616 | u/lilstoner 0
617 | u/jenn_abrams 0
618 | u/leecory 0
619 | u/georgeschultz 0
620 | u/KularimGaviril 0
621 | u/miajones005 0
622 | u/rblackie 0
623 | u/hollymolly2015 0
624 | u/lydia_rodarte-quayle 0
625 | u/Motlalepule 0
626 | u/Motlalent 0
627 | u/Bugemlon 0
628 | u/Amohelang 0
629 | u/Eliot_Aiden 0
630 | u/Tyrone_Marion 0
631 | u/Jaden_Corey 0
632 | u/Aiden_Chuck 0
633 | u/Tristen_Sadler 0
634 | u/LorrySn 0
635 | u/deren777 0
636 | u/sarah_sanchez 0
637 | u/julesbrandy 0
638 | u/HelenaFreiy 0
639 | u/smarteagles 0
640 | u/geoffreych 0
641 | u/MarkHudson89 0
642 | u/FuUNCake 0
643 | u/tebepizdec 0
644 | u/rebekahbennet 0
645 | u/hcaner 0
646 | u/bilberrypie 0
647 | u/vsbeats 0
648 | u/fergensonk 0
649 | u/illlolyourtexass 0
650 | u/astridrooo 0
651 | u/lunacyfreak 0
652 | u/cre-ker 0
653 | u/valyaspb 0
654 | u/joewellbenson 0
655 | u/ivanlox255 0
656 | u/huyolzovatel 0
657 | u/pizdectest 0
658 | u/kozloshlyap 0
659 | u/picnicshirt 0
660 | u/issastunna 0
661 | u/stendupp 0
662 | u/stenlies 0
663 | u/failkate 0
664 | u/smoliangirl 0
665 | u/mironon 0
666 | u/traceyjohnson 0
667 | u/stephenbag 0
668 | u/bennylewis 0
669 | u/susanpeterson 0
670 | u/madpood 0
671 | u/amazingbodilyfluids 1
672 | u/qkempek 1
673 | u/sandlerwow 1
674 | u/BleepThePolice 1
675 | u/merlinperegrin 1
676 | u/Albert_Baldwin 1
677 | u/Tayler_Cletis 1
678 | u/vsrruslan 1
679 | u/ser005 1
680 | u/YggkelvZurn 2
681 | u/KazishuraTerne 2
682 | u/baconlover8 2
683 | u/SouthLoneStar 2
684 | u/Lepolesa 2
685 | u/moluleloa 3
686 | u/YggwynZulkigul 4
687 | u/vsruslan 4
688 | u/Kutloisiso 4
689 | u/Hararnir 4
690 | u/georgepharell 5
691 | u/kuabrush 5
692 | u/mikeehrmantraut55 5
693 | u/salamanca_tuco 5
694 | u/WileandraMalhala 6
695 | u/RobbKR 6
696 | u/ThorgalenGozil 6
697 | u/wolfen01 6
698 | u/jessepinkman1984 6
699 | u/letlotlow 6
700 | u/solodoto666 7
701 | u/saulgoodman1978 7
702 | u/Mamigon 7
703 | u/TakeMyEnerGG 7
704 | u/ZuluraGolar 8
705 | u/anime_stan 8
706 | u/khotsofalan 8
707 | u/Ezra_Jimmie 8
708 | u/QuenceynnTejora 9
709 | u/IronhammerConjukelv 9
710 | u/trollsofficial 9
711 | u/fring-gus 9
712 | u/truckshark 9
713 | u/FezilGavinn 10
714 | u/AdoraronDoomworker 10
715 | u/ZolosidaSpellsinger 10
716 | u/KahuginnCerenadar 10
717 | u/YokouJJ 10
718 | u/VuranThordilore 11
719 | u/Brenden_Kevyn 11
720 | u/LandageKador 12
721 | u/BrahnVilar 12
722 | u/GaranaTobar 12
723 | u/YggdorKakree 13
724 | u/graulli 13
725 | u/Heirlow 13
726 | u/FordreranaCordagda 14
727 | u/randomipad 14
728 | u/SailakSamura 15
729 | u/smollow 15
730 | u/socketwom 15
731 | u/foxmeowlder 15
732 | u/CeriusTojajar 17
733 | u/ModitiusOpirius 17
734 | u/mohato 17
735 | u/Abena_Tau 17
736 | u/GranilisDogul 18
737 | u/BloodwoodArashizrag 18
738 | u/crownalbum 18
739 | u/DaytonayenMoranaya 19
740 | u/CewieldZuluhn 19
741 | u/Taulou 19
742 | u/VoodoogamiAurilak 21
743 | u/HaroldGarold 21
744 | u/OghmagelvFedora 22
745 | u/davscolf 22
746 | u/LightshadeGardakino 23
747 | u/TetaurDafyn 23
748 | u/HoodieLoodie 23
749 | u/walterwhite1962 23
750 | u/Derek_Daniel 23
751 | u/KagrelMauran 24
752 | u/NilarilOpirim 24
753 | u/DrelathrisBo 25
754 | u/SalmaranLaihuginn 25
755 | u/mr_clampin 25
756 | u/VanecedwaShadowsmith 26
757 | u/SadCitizen2016 26
758 | u/seatfaith 27
759 | u/AgaluneMalordred 28
760 | u/MeepoPeep 30
761 | u/KakreeTabar 33
762 | u/thistleescape 34
763 | u/Garry_Gregg 36
764 | u/WilliananLandalsa 37
765 | u/germagamo 37
766 | u/inkreindeer 38
767 | u/TojasidaSamukree 41
768 | u/hank-schrade 41
769 | u/IshnranaAnayagrinn 44
770 | u/aubrey_harper 44
771 | u/ModitiusFaetaur 46
772 | u/GushicageAgamadi 46
773 | u/NuaborShaktikasa 47
774 | u/garliccomet 47
775 | u/jerrhill 49
776 | u/moonreading 49
777 | u/MalojurusMutus 52
778 | u/Riley_Gerrard 55
779 | u/AralisTugis 58
780 | u/FreddieGi 62
781 | u/CogelvWhitebinder 63
782 | u/VojarAndrorus 68
783 | u/SharprunnerAndrolas 74
784 | u/winthrop_clancy 75
785 | u/emilyli 77
786 | u/BagoreZulkihn 78
787 | u/muslimzebra 83
788 | u/DorothieBell 89
789 | u/Orville_Willy 92
790 | u/wadeharriot 93
791 | u/KatusPenadar 94
792 | u/KulazelKelkree 95
793 | u/1488Reasons 96
794 | u/TojatMalaron 97
795 | u/dreamsquadd 98
796 | u/DalabandisAndroma 101
797 | u/cakes689 107
798 | u/Zach_Bristol 110
799 | u/riversailor 111
800 | u/SteelfangMogamand 112
801 | u/bottlehope 112
802 | u/Gilbert_Preston 113
803 | u/harperdaveharper 115
804 | u/chriscrossfire 115
805 | u/GavinayaBeazefym 121
806 | u/Paolosi 124
807 | u/SnorrySturluson 134
808 | u/GoldenbringerTogore 140
809 | u/NalenTaugami 141
810 | u/MoonMoon8 141
811 | u/Darcy_Loyd 143
812 | u/DianarinAdorardred 151
813 | u/ThorgaghmaLai 152
814 | u/FerdavynaCentrirus 153
815 | u/petouchoque 171
816 | u/AriundisVugar 171
817 | u/CordaronGavinralbin 175
818 | u/DelaranaBatius 186
819 | u/BallardredTholak 195
820 | u/MalalladorSincliff 196
821 | u/jojouel 199
822 | u/violinslipper 205
823 | u/caterpillarclass 210
824 | u/AxeseekerMightwind 222
825 | u/SamugoreKekelv 244
826 | u/patsy_rudolph 257
827 | u/DelalbineSilvershad 260
828 | u/DearDearBear 260
829 | u/DarusCege 269
830 | u/RedGov 273
831 | u/malefane 298
832 | u/PeriniusDular 299
833 | u/vudonrismakasa 306
834 | u/VukazahnGardagis 312
835 | u/AndromajurusAragrel 315
836 | u/HityndiDutilar 328
837 | u/NekoraJoJolar 329
838 | u/Dazzle6 331
839 | u/rockanda 334
840 | u/IronwalkerGardred 336
841 | u/DelanradAgamadwyn 338
842 | u/FenrilkreeMolabar 347
843 | u/BludflameMeztirg 356
844 | u/researchbeggar 367
845 | u/toffeetear 368
846 | u/AndrorneGavinrage 398
847 | u/TebenelBrazragore 401
848 | u/DaFordremand 401
849 | u/SharpwingChillshape 412
850 | u/Gillian0zero0 447
851 | u/CererinKarn 457
852 | u/ZukoraTezil 492
853 | u/Mponeng 505
854 | u/MnefymPainmane 522
855 | u/HellwindShadowbreak 595
856 | u/richwilcom 615
857 | u/moratutu 635
858 | u/DalahelmFelharil 636
859 | u/paulmall112 654
860 | u/AgamagelvTozshura 700
861 | u/tishcol 712
862 | u/lekgotla 738
863 | u/xameg 837
864 | u/PeGobei 843
865 | u/blackie_jack 845
866 | u/BurigelvGravelbrew 889
867 | u/MalasarGholbiris 893
868 | u/UmthDarkfire 910
869 | u/Graham_Quinn 1003
870 | u/brondran 1112
871 | u/alex_jonathan 1167
872 | u/sugarshoehorn 1173
873 | u/LeyleynFearlessworm 1185
874 | u/CeginnFonin 1239
875 | u/Heetmean 1256
876 | u/GoltijindGoltishura 1275
877 | u/horseeating 1370
878 | u/Meek_Mitchel 1406
879 | u/hadheart 1451
880 | u/men_like 1534
881 | u/ThordibandisHugimat 1586
882 | u/waeqxd 1633
883 | u/hyddrox 1788
884 | u/CogdaAnayanara 1840
885 | u/brant_s 1870
886 | u/ZamalynodeThothis 1874
887 | u/fginery 1899
888 | u/come-true 1949
889 | u/CereranaKeath 1956
890 | u/chereese 2000
891 | u/TojasHellwarden 2221
892 | u/toffeeathletics 2330
893 | u/laserathletics 2387
894 | u/peter_stevenson1986 2401
895 | u/GavinraraFonara 2589
896 | u/keklelkek 2,591
897 | u/ThonisIshnlen 2612
898 | u/ironzion17 2706
899 | u/ThontriusBanos 2997
900 | u/NitaurMaull 3032
901 | u/MananaraGralsa 3085
902 | u/kanyebreeze 3392
903 | u/LalhalaGavinradwyn 3401
904 | u/NualvCordalace 3444
905 | u/gordon_br 3447
906 | u/KiririelCebandis 3487
907 | u/UelitheLandagelv 3496
908 | u/dandy1crown 3500
909 | u/GrisidaColak 3512
910 | u/alice_boginski 3512
911 | u/fungon 3518
912 | u/MiraranaMogra 3545
913 | u/uelithelandagelv 3593
914 | u/FoshantBloodstone 3639
915 | u/BeazerneMem 3672
916 | u/mandeyboy 4171
917 | u/AriutusMokazahn 4463
918 | u/clackie 4943
919 | u/reggaebull 5238
920 | u/AlsagelvBuriron 5349
921 | u/deusexmachina112 5485
922 | u/elsie_c 5497
923 | u/TedarYozshujin 5671
924 | u/toneporter 6905
925 | u/SinmoonYggbandis 7270
926 | u/dopplegun 9049
927 | u/Maineylops 12783
928 | u/Maxwel_Terry 14869
929 | u/DeusXYX 15541
930 | u/MasiusShadowshaper 16279
931 | u/MargasGranidor 18313
932 | u/Peter_Hurst 20830
933 | u/erivmalazilkree 21971
934 | u/King_Andersons 27144
935 | u/BerskyN 32979
936 | u/WhatImDoindHere 33095
937 | u/Kevin_Milner 42752
938 | u/shomyo 48619
939 | u/rubinjer 99493
--------------------------------------------------------------------------------