| Name | Description | Package | Version | |----------------------------|------------------------------------------------------------------|---------|---------| | Reddit.SubmitTextPost | Submit a text-based post to a subreddit | Reddit | 0.0.1 | | Reddit.CommentOnPost | Comment on a Reddit post | Reddit | 0.0.1 | | Reddit.ReplyToComment | Reply to a Reddit comment | Reddit | 0.0.1 | | Reddit.GetPostsInSubreddit | Gets posts titles, links, and other metadata in the specified subreddit | Reddit | 0.0.1 | | Reddit.GetContentOfPost | Get the content (body) of a Reddit post by its identifier. | Reddit | 0.0.1 | | Reddit.GetContentOfMultiplePosts | Get the content (body) of multiple Reddit posts by their identifiers. | Reddit | 0.0.1 | | Reddit.GetTopLevelComments | Get the first page of top-level comments of a Reddit post. | Reddit | 0.0.1 | ### Why not use an SDK? Reddit API does not have an official SDK, although [PRAW](https://github.com/praw-dev/praw) has large community support. I played around with PRAW, but ultimately decided to not use an SDK. PRAW made it incredibly easy to work with Reddit Objects, but there were a few drawbacks that ultimately swayed me to not use it: 1. PRAW assumes that it will do the auth for you. A client ID and secret must be passed to PRAW, but a tool only has the auth token. I was able to hack around this by manipulating private properties - but it felt too hacky 2. PRAW does not support Python 3.13 3. PRAW is not async. There is [AsyncPRAW](https://github.com/praw-dev/asyncpraw), but the community does not look active there.
28 lines
875 B
Python
28 lines
875 B
Python
from typing import Any
|
|
|
|
import httpx
|
|
|
|
|
|
class RedditClient:
|
|
BASE_URL = "https://oauth.reddit.com/"
|
|
|
|
def __init__(self, token: str):
|
|
self.token = token
|
|
|
|
async def request(self, method: str, path: str, **kwargs: Any) -> Any:
|
|
headers = {
|
|
"Authorization": f"Bearer {self.token}",
|
|
"User-Agent": "arcade-reddit",
|
|
}
|
|
async with httpx.AsyncClient() as client:
|
|
response = await client.request(
|
|
method, f"{self.BASE_URL}/{path.lstrip('/')}", headers=headers, **kwargs
|
|
)
|
|
response.raise_for_status()
|
|
return response.json()
|
|
|
|
async def get(self, path: str, **kwargs: Any) -> Any:
|
|
return await self.request("GET", path, **kwargs)
|
|
|
|
async def post(self, path: str, **kwargs: Any) -> Any:
|
|
return await self.request("POST", path, **kwargs)
|