Search code examples
pythonredditpraw

Getting reddit bot to generate a random reply to submission


I'm working on a bot using PRAW to generate a link from a text file. Here's my code:

import praw
from random import choice
import re

reddit = praw.Reddit(user_agent='XXX',
                  client_id='XXX',
                  client_secret='XXX',
                  username='XXX',
                  password='XXX')

with open("links.txt") as f:
    lines = [l.rstrip() for l in f]

subreddit = reddit.subreddit('SUBREDDIT')

for submission in subreddit.stream.submissions:
    if re.search("!TRIGGER WORD", submission.title, re.IGNORECASE):
        submission.reply(choice(lines))

After running my script, I get this error message:

Traceback (most recent call last):
  File "main.py", line 16, in <module>
    for submission in subreddit.stream.submissions:
TypeError: 'method' object is not iterable

Any ideas?

Edit: I forgot my parentheses after this line:

for submission in subreddit.stream.submissions:

It should look like this:

for submission in subreddit.stream.submissions():

or this:

for submission in subreddit.stream.submissions(skip_existing=True):

The latter will only look for new submissions after the stream was started. If you want to reply with a random choice, but not using a file, you could do this:

  • import your libraries:

    import praw
    
    import random
    

Create reddit instance:

reddit = praw.Reddit(client_id="my client id",
                     client_secret="my client secret",
                     user_agent="my user agent",
                     username="my username",
                     password="my password")
  • Create a list like this:

    choices = ['choice', 'choice2', 'choice3']
    
  • Then check if your trigger is in the title and reply with random choice:

    for submission in subreddit.stream.submissions():
       if "trigger" in submission.title:
         submission.reply(random.choice(choices))
    

Solution

  • The code you posted is different than the code in your traceback. The code you posted should work; while the code in your traceback indicates you forgot to call submissions. That line should be

    for submission in subreddit.stream.submissions():
    

    or

    for submission in subreddit.stream.submissions(skip_existing=True):
    

    but not

    for submission in subreddit.stream.submissions: