Initial commit
This commit is contained in:
7
Dockerfile
Normal file
7
Dockerfile
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# Dockerfile for Reddit Test Posts Bot
|
||||||
|
FROM python:3.11-slim
|
||||||
|
WORKDIR /app
|
||||||
|
COPY requirements.txt .
|
||||||
|
RUN pip install --no-cache-dir -r requirements.txt
|
||||||
|
COPY . .
|
||||||
|
CMD ["python", "bot.py"]
|
||||||
24
README.md
Normal file
24
README.md
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# Reddit TestPostsBot
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
1. Fill in your Reddit API credentials and subreddit name in `bot.py`.
|
||||||
|
2. Create a wiki page in your subreddit named `testpostsbot_config` with JSON like:
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"posts": [
|
||||||
|
{"title": "Test Post 1", "body": "Body for post 1"},
|
||||||
|
{"title": "Test Post 2", "body": "Body for post 2"}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Build and run with Docker:
|
||||||
|
|
||||||
|
```
|
||||||
|
docker build -t testpostsbot .
|
||||||
|
docker run --env REDDIT_CLIENT_ID=... --env REDDIT_CLIENT_SECRET=... --env REDDIT_USERNAME=... --env REDDIT_PASSWORD=... --env SUBREDDIT=... testpostsbot
|
||||||
|
```
|
||||||
|
|
||||||
|
Or edit the variables directly in `bot.py` for quick testing.
|
||||||
54
bot.py
Normal file
54
bot.py
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
# Reddit Test Posts Bot
|
||||||
|
# This script reads config from a subreddit wiki page and makes test posts if the bot is a moderator.
|
||||||
|
import praw
|
||||||
|
import json
|
||||||
|
import time
|
||||||
|
import os
|
||||||
|
from config import fetch_config_from_wiki
|
||||||
|
|
||||||
|
REDDIT_CLIENT_ID = os.environ.get('REDDIT_CLIENT_ID')
|
||||||
|
REDDIT_CLIENT_SECRET = os.environ.get('REDDIT_CLIENT_SECRET')
|
||||||
|
REDDIT_USERNAME = os.environ.get('REDDIT_USERNAME')
|
||||||
|
REDDIT_PASSWORD = os.environ.get('REDDIT_PASSWORD')
|
||||||
|
REDDIT_USER_AGENT = os.environ.get('REDDIT_USER_AGENT', f'TestPostsBot/0.1 by {REDDIT_USERNAME}')
|
||||||
|
|
||||||
|
SUBREDDIT = os.environ.get('SUBREDDIT')
|
||||||
|
WIKI_PAGE = os.environ.get('WIKI_PAGE', 'testpostsbot_config')
|
||||||
|
|
||||||
|
|
||||||
|
def is_moderator(reddit, subreddit_name):
|
||||||
|
subreddit = reddit.subreddit(subreddit_name)
|
||||||
|
mods = [str(mod) for mod in subreddit.moderator()]
|
||||||
|
return reddit.user.me().name in mods
|
||||||
|
|
||||||
|
|
||||||
|
def make_posts(reddit, subreddit_name, posts):
|
||||||
|
subreddit = reddit.subreddit(subreddit_name)
|
||||||
|
for post in posts:
|
||||||
|
title = post.get('title', 'Test Post')
|
||||||
|
body = post.get('body', '')
|
||||||
|
print(f"Posting: {title}")
|
||||||
|
subreddit.submit(title, selftext=body)
|
||||||
|
time.sleep(2) # avoid rate limits
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
reddit = praw.Reddit(
|
||||||
|
client_id=REDDIT_CLIENT_ID,
|
||||||
|
client_secret=REDDIT_CLIENT_SECRET,
|
||||||
|
username=REDDIT_USERNAME,
|
||||||
|
password=REDDIT_PASSWORD,
|
||||||
|
user_agent=REDDIT_USER_AGENT
|
||||||
|
)
|
||||||
|
|
||||||
|
config = fetch_config_from_wiki(reddit, SUBREDDIT, WIKI_PAGE)
|
||||||
|
posts = config.get('posts', [])
|
||||||
|
|
||||||
|
if is_moderator(reddit, SUBREDDIT):
|
||||||
|
make_posts(reddit, SUBREDDIT, posts)
|
||||||
|
else:
|
||||||
|
print(f"Bot is not a moderator of r/{SUBREDDIT}. No posts made.")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
14
config.py
Normal file
14
config.py
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# config.py
|
||||||
|
# Fetches config from subreddit wiki page
|
||||||
|
import json
|
||||||
|
|
||||||
|
def fetch_config_from_wiki(reddit, subreddit_name, wiki_page):
|
||||||
|
subreddit = reddit.subreddit(subreddit_name)
|
||||||
|
try:
|
||||||
|
wiki = subreddit.wiki[wiki_page]
|
||||||
|
config_text = wiki.content_md
|
||||||
|
config = json.loads(config_text)
|
||||||
|
return config
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error fetching config from wiki: {e}")
|
||||||
|
return {'posts': []}
|
||||||
6
docker-compose.yml
Normal file
6
docker-compose.yml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
services:
|
||||||
|
testpostbot:
|
||||||
|
image: slfhstd.uk/slfhstd/testpostbot:dev
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
restart: unless-stopped
|
||||||
8
example.env
Normal file
8
example.env
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# Example environment variables for TestPostsBot
|
||||||
|
REDDIT_CLIENT_ID=your_client_id
|
||||||
|
REDDIT_CLIENT_SECRET=your_client_secret
|
||||||
|
REDDIT_USERNAME=your_username
|
||||||
|
REDDIT_PASSWORD=your_password
|
||||||
|
REDDIT_USER_AGENT=TestPostsBot/0.1 by your_username
|
||||||
|
SUBREDDIT=your_subreddit
|
||||||
|
WIKI_PAGE=testpostsbot_config
|
||||||
1
requirements.txt
Normal file
1
requirements.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
praw
|
||||||
Reference in New Issue
Block a user