Spaces:
Sleeping
Sleeping
Download reddit_client.py from paulhemb/ConsumerIntelligence: direct link, hf CLI and curl.
- Browser
- Download file 2.41 kB
-
https://huggingface.co/spaces/paulhemb/ConsumerIntelligence/resolve/main/reddit_client.py
- Command line
-
hf download hf://spaces/paulhemb/ConsumerIntelligence/reddit_client.py
-
curl -L -o reddit_client.py https://huggingface.co/spaces/paulhemb/ConsumerIntelligence/resolve/main/reddit_client.py
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] |