ConsumerIntelligence / reddit_client.py
paulhemb's picture
Add application file
0101d63
Raw History Blame Contribute Delete
2.41 kB
import time
import requests
import logging
from typing import List, Dict
from config import REDDIT_RPS
logger = logging.getLogger(__name__)
HEADERS = {"User-Agent": "FounderIntelligenceEngine/4.0 (by /u/yourusername)"}
class RateLimiter:
def __init__(self, requests_per_second: float):
self.interval = 1.0 / requests_per_second if requests_per_second > 0 else 0
self.last_request = 0.0
def wait(self):
if self.interval <= 0: return
now = time.time()
elapsed = now - self.last_request
if elapsed < self.interval:
time.sleep(self.interval - elapsed)
self.last_request = time.time()
class RedditClient:
BASE_URL = "https://www.reddit.com"
def __init__(self):
self.rate_limiter = RateLimiter(REDDIT_RPS)
def _request(self, url: str, params: dict = None) -> dict:
self.rate_limiter.wait()
try:
resp = requests.get(url, headers=HEADERS, params=params, timeout=15)
resp.raise_for_status()
return resp.json()
except Exception as e:
logger.error(f"Reddit request failed: {e}")
return {}
def get_top_posts(self, subreddit: str, limit: int = 30, time_filter="day") -> List[dict]:
all_posts, after = [], None
remaining = limit
per_page = min(limit, 100)
while remaining > 0:
params = {"limit": min(remaining, per_page), "t": time_filter}
if after: params["after"] = after
url = f"{self.BASE_URL}/r/{subreddit}/top.json"
data = self._request(url, params)
if not data: break
children = data.get("data", {}).get("children", [])
if not children: break
for child in children:
all_posts.append(child["data"])
remaining -= 1
if remaining == 0: break
after = data.get("data", {}).get("after")
if not after: break
return all_posts
def get_post_comments(self, post_id: str, limit: int = 5) -> List[dict]:
url = f"{self.BASE_URL}/comments/{post_id}.json"
data = self._request(url)
if not data or not isinstance(data, list) or len(data) < 2:
return []
comments_data = data[1].get("data", {}).get("children", [])
return [c["data"] for c in comments_data if c["kind"] == "t1"][:limit]