public
Last active

A simple LinkFixerBot clone developed as a demonstration for anyone who is curious how a simple reddit bot might be coded. To kill this code, spam "Ctrl+C" until it catches the exception.

  • Download Gist
LinkFixerClone.py
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
import praw # simple interface to the reddit API, also handles rate limiting of requests
import re
from collections import deque
from time import sleep
 
USERNAME = "Your username here"
PASSWORD = "Your password here"
USERAGENT = "Your useragent string here. It should include your /u/username as a courtesy to reddit"
 
r = praw.Reddit(USERAGENT)
r.login(USERNAME,PASSWORD) # necessary if your bot will talk to people
 
cache = deque(maxlen=200) # To make sure we don't duplicate effort
 
r_pat = re.compile(' r/[A-Za-z0-9]+')
u_pat = re.compile(' u/[A-Za-z0-9]+')
 
def check_condition(comment):
text = comment.body
broken = set(re.findall(r_pat, text))
broken.union( set(re.findall(u_pat, text)) )
condition = False
if broken:
condition = True
return condition, broken
 
def bot_action(c, links):
text = ''
for link in links:
text += "/" + link[1:] + "\n"
print c.author.name, c.subreddit.display_name, c.submission.title
print text
c.reply(text)
 
running = True
while running:
all = r.get_all_comments(limit = None, url_data = {'limit':100})
for c in all:
if c.id in cache:
break
cache.append(c.id)
bot_condition_met, parsed = check_condition(c)
if bot_condition_met:
try:
bot_action(c, parsed)
except KeyboardInterrupt:
running = False
except praw.errors.APIException, e:
print "[ERROR]:", e
print "sleeping 30 sec"
sleep(30)
except Exception, e: # In reality you don't want to just catch everything like this, but this is toy code.
print "[ERROR]:", e
print "blindly handling error"
continue

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.