fix: Reddit 子版块列表页支持 + --version 参数
- reddit.py: 新增 _parse_listing() 处理 /r/sub/hot|new|top 等列表页 之前只能读单个帖子,列表页直接报 ValueError - cli.py: 添加 --version flag (标准 CLI 惯例)
This commit is contained in:
parent
30f11bb6e4
commit
3efc8d1d55
2 changed files with 51 additions and 0 deletions
|
|
@ -74,6 +74,10 @@ class RedditChannel(Channel):
|
|||
|
||||
data = resp.json()
|
||||
|
||||
# Subreddit listing page: /r/sub/, /r/sub/hot, /r/sub/new, /r/sub/top
|
||||
if isinstance(data, dict) and data.get("kind") == "Listing":
|
||||
return self._parse_listing(data, url)
|
||||
|
||||
if isinstance(data, list) and len(data) >= 1:
|
||||
# Post page: [post_listing, comments_listing]
|
||||
post = data[0]["data"]["children"][0]["data"]
|
||||
|
|
@ -103,6 +107,52 @@ class RedditChannel(Channel):
|
|||
|
||||
raise ValueError(f"Could not parse Reddit response for: {url}")
|
||||
|
||||
def _parse_listing(self, data: dict, url: str) -> ReadResult:
|
||||
"""Parse a subreddit listing (hot/new/top/rising)."""
|
||||
children = data.get("data", {}).get("children", [])
|
||||
|
||||
# Extract subreddit name and sort from URL
|
||||
parsed = urlparse(url)
|
||||
path_parts = [p for p in parsed.path.strip("/").split("/") if p]
|
||||
subreddit = path_parts[1] if len(path_parts) >= 2 else "reddit"
|
||||
sort_type = path_parts[2] if len(path_parts) >= 3 else "hot"
|
||||
|
||||
lines = []
|
||||
for i, child in enumerate(children, 1):
|
||||
if child.get("kind") != "t3":
|
||||
continue
|
||||
post = child.get("data", {})
|
||||
title = post.get("title", "")
|
||||
author = post.get("author", "")
|
||||
score = post.get("score", 0)
|
||||
num_comments = post.get("num_comments", 0)
|
||||
permalink = post.get("permalink", "")
|
||||
post_url = post.get("url", "")
|
||||
is_self = post.get("is_self", False)
|
||||
|
||||
lines.append(f"### {i}. {title}")
|
||||
lines.append(f"👤 u/{author} · ⬆ {score} · 💬 {num_comments}")
|
||||
if not is_self and post_url:
|
||||
lines.append(f"🔗 {post_url}")
|
||||
lines.append(f"📎 https://www.reddit.com{permalink}")
|
||||
# Add selftext preview (first 200 chars)
|
||||
selftext = post.get("selftext", "")
|
||||
if selftext:
|
||||
preview = selftext[:200].replace("\n", " ")
|
||||
if len(selftext) > 200:
|
||||
preview += "..."
|
||||
lines.append(f"> {preview}")
|
||||
lines.append("")
|
||||
|
||||
content = "\n".join(lines) if lines else "No posts found."
|
||||
return ReadResult(
|
||||
title=f"r/{subreddit} — {sort_type}",
|
||||
content=content,
|
||||
url=url,
|
||||
platform="reddit",
|
||||
extra={"subreddit": subreddit, "sort": sort_type, "count": len(children)},
|
||||
)
|
||||
|
||||
def _extract_comments(self, comments_data: dict, depth: int = 0, max_depth: int = 3) -> str:
|
||||
"""Recursively extract comments."""
|
||||
lines = []
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@ def main():
|
|||
description="👁️ Give your AI Agent eyes to see the entire internet",
|
||||
)
|
||||
parser.add_argument("-v", "--verbose", action="store_true", help="Show debug logs")
|
||||
parser.add_argument("--version", action="version", version=f"Agent Reach v{__version__}")
|
||||
sub = parser.add_subparsers(dest="command", help="Available commands")
|
||||
|
||||
# ── read ──
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue