feat: add fetch_news.py script to aggregate news from HN, Reddit, and GitHub
Co-authored-by: aider (deepseek/deepseek-chat) <aider@aider.chat>
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Quick news fetcher - single file, no deps needed."""
|
||||
import json
|
||||
import urllib.request
|
||||
import ssl
|
||||
import sys
|
||||
|
||||
ctx = ssl.create_default_context()
|
||||
ctx.check_hostname = False
|
||||
ctx.verify_mode = ssl.CERT_NONE
|
||||
|
||||
H = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36"}
|
||||
|
||||
def get(url):
|
||||
try:
|
||||
req = urllib.request.Request(url, headers=H)
|
||||
with urllib.request.urlopen(req, timeout=15, context=ctx) as r:
|
||||
return r.read().decode("utf-8", errors="replace")
|
||||
except Exception as e:
|
||||
return None
|
||||
|
||||
def getj(url):
|
||||
d = get(url)
|
||||
return json.loads(d) if d else None
|
||||
|
||||
def show_results():
|
||||
out = []
|
||||
out.append("=" * 65)
|
||||
out.append(" 🔥 今 日 热 点 新 闻 — 2026年6月20日 (周六)")
|
||||
out.append("=" * 65)
|
||||
|
||||
# 1. Hacker News
|
||||
hn = getj("https://hacker-news.firebaseio.com/v0/topstories.json")
|
||||
if hn:
|
||||
out.append("\n 🌍 Hacker News (科技)")
|
||||
out.append(" " + "─" * 60)
|
||||
for i, sid in enumerate(hn[:10], 1):
|
||||
item = getj(f"https://hacker-news.firebaseio.com/v0/item/{sid}.json")
|
||||
if item:
|
||||
t = item.get("title", "")
|
||||
s = item.get("score", 0)
|
||||
if t:
|
||||
out.append(f" {i:2d}. {t[:75]} (👍{s})")
|
||||
|
||||
# 2. Reddit worldnews
|
||||
rd = get("https://www.reddit.com/r/worldnews/hot/.json?limit=8")
|
||||
if rd:
|
||||
try:
|
||||
data = json.loads(rd)
|
||||
out.append("\n 📰 Reddit /r/worldnews (国际新闻)")
|
||||
out.append(" " + "─" * 60)
|
||||
for i, c in enumerate(data["data"]["children"][:8], 1):
|
||||
p = c["data"]
|
||||
t = p.get("title", "")
|
||||
s = p.get("score", 0)
|
||||
if t:
|
||||
out.append(f" {i:2d}. {t[:75]} (👍{s})")
|
||||
except:
|
||||
pass
|
||||
|
||||
# 3. GitHub
|
||||
gh = getj("https://api.github.com/search/repositories?q=stars:>100000&sort=stars&order=desc&per_page=10")
|
||||
if gh:
|
||||
out.append("\n ⭐ GitHub 超级热门开源项目")
|
||||
out.append(" " + "─" * 60)
|
||||
for i, r in enumerate(gh.get("items", []), 1):
|
||||
n = r.get("full_name", "")
|
||||
s = r.get("stargazers_count", 0)
|
||||
d = (r.get("description") or "")[:60]
|
||||
out.append(f" {i:2d}. {n} (⭐{s})")
|
||||
if d:
|
||||
out.append(f" {d}")
|
||||
|
||||
out.append("\n" + "=" * 65)
|
||||
out.append(" 数据来源: Hacker News API / Reddit / GitHub API")
|
||||
out.append("=" * 65)
|
||||
|
||||
print("\n".join(out))
|
||||
|
||||
if __name__ == "__main__":
|
||||
show_results()
|
||||
Reference in New Issue
Block a user