Guest User

Untitled

a guest
Nov 24th, 2017
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.99 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()
Add Comment
Please, Sign In to add comment