Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2017
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.11 KB | None | 0 0
  1. import praw
  2. import time
  3. import sys
  4. from collections import defaultdict
  5.  
  6. reddit = praw.Reddit(client_id='...',
  7.                      client_secret='...',
  8.                      password='...',
  9.                      user_agent='...',
  10.                      username='...')
  11.  
  12. def loadRecentSubs(filename):
  13.     recent = defaultdict(int)
  14.     with open(filename, 'r') as f:
  15.         for line in f.readlines():
  16.             line = line.strip()
  17.             if line:
  18.                 sub_name, timestamp = line.split(' ')
  19.                 recent[sub_name] = int(timestamp)
  20.     return recent
  21.  
  22. def saveRecentSubs(recent, filename):
  23.     with open(filename, 'w') as f:
  24.         for sub_name, timestamp in sorted(recent.items()):
  25.             f.write('%s %d\n' % (sub_name, timestamp))
  26.  
  27. def loadSubreddits(filename):
  28.     subreddits = set([])
  29.     with open(filename, 'r') as f:
  30.         for line in f.readlines():
  31.             subreddits.add(line.strip())
  32.     return subreddits
  33.  
  34. def saveSubreddits(subreddits, filename):
  35.     with open(filename, 'w') as f:
  36.         for sub in sorted(list(subreddits)):
  37.             f.write('%s\n' % sub)
  38.  
  39. def subName(sub):
  40.     return sub.display_name.lower()
  41.  
  42. def loadSubscriptions():
  43.     print('Loading subscriptions...')
  44.     subscriptions = set(subName(s) for s in reddit.user.subreddits(limit=10000))
  45.     addToRecent(subscriptions - set(loadRecentSubs('recent.txt').keys()))
  46.     return subscriptions
  47.  
  48. def addToRecent(sub_names):
  49.     recent = loadRecentSubs('recent.txt')
  50.     for sub_name in sub_names:
  51.         recent[sub_name] = int(time.time())
  52.     saveRecentSubs(recent, 'recent.txt')
  53.  
  54. def dropFromRecent(sub_names):
  55.     recent = loadRecentSubs('recent.txt')
  56.     for sub_name in sub_names:
  57.         recent.pop(sub_name, None)
  58.     saveRecentSubs(recent, 'recent.txt')
  59.  
  60. def trimSubs():
  61.     sub_names = set()
  62.     for sub_name, timestamp in loadRecentSubs('recent.txt').items():
  63.         if timestamp + 60 * 60 < time.time():
  64.             sub_names.add(sub_name)
  65.     if not sub_names:
  66.         return
  67.     print('Trimming  %s' % ', '.join('r/' + sub_name for sub_name in sub_names))
  68.     dropFromRecent(sub_names)
  69.     subs = [reddit.subreddit(sub_name) for sub_name in sub_names]
  70.     for i in range(0, len(subs), 50):
  71.         print('Sending batched unsubscribe request %d' % (1 + i // 50))
  72.         subs[i].unsubscribe(subs[i + 1:i + 50])
  73.  
  74. def loadBlacklist(subscriptions):
  75.     blacklist = loadSubreddits('unsub.txt') - subscriptions
  76.     to_blacklist = set(loadRecentSubs('recent.txt').keys()) - subscriptions
  77.     for sub_name in to_blacklist:
  78.         print('Blacklist r/%s' % sub_name)
  79.     blacklist |= to_blacklist
  80.     saveSubreddits(blacklist, 'unsub.txt')
  81.     dropFromRecent(blacklist)
  82.     return blacklist
  83.  
  84. def tick():
  85.     subscriptions = loadSubscriptions()
  86.     blacklist = loadBlacklist(subscriptions)
  87.  
  88.     to_update = []
  89.     to_hide = []
  90.     to_subscribe = []
  91.  
  92.     print('Loading front page...')
  93.     for submission in reddit.subreddit('all').hot(limit=1000):
  94.         sub_name = subName(submission.subreddit)
  95.         if sub_name in subscriptions:
  96.             print('Allowing  r/%-30s %s' % (sub_name, submission.title[:100]))
  97.             to_update.append(sub_name)
  98.         elif sub_name in blacklist:
  99.             print('Hiding    r/%-30s %s' % (sub_name, submission.title[:100]))
  100.             to_hide.append(submission)
  101.         else:
  102.             print('Subbing   r/%-30s %s' % (sub_name, submission.title[:100]))
  103.             to_update.append(sub_name)
  104.             to_subscribe.append(submission.subreddit)
  105.  
  106.     for i in range(0, len(to_hide), 50):
  107.         print('Sending batched hide request %d' % (1 + i // 50))
  108.         to_hide[i].hide(to_hide[i + 1:i + 50])
  109.     for i in range(0, len(to_subscribe), 50):
  110.         print('Sending batched subscribe request %d' % (1 + i // 50))
  111.         to_subscribe[i].subscribe(to_subscribe[i + 1:i + 50])
  112.  
  113.     addToRecent(to_update)
  114.     trimSubs()
  115.  
  116. def main():
  117.     while True:
  118.         try:
  119.             tick()
  120.         except:
  121.             print('Ran into an error: %s' % sys.exc_info()[0])
  122.         print('Sleeping...')
  123.         time.sleep(60)
  124.  
  125. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement