├── .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 | 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 | 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 | 62 | 63 | 74 | 75 | 76 | 85 | 86 | 87 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 |