NewsRadar · 全网新闻雷达
这个 Skill 解决什么
一句话:把「几十个平台今天在说什么」压缩成一份能读完的简报,并告诉你哪件事最出圈。
关键不是信源多,而是多做了一步——事件聚类。多数新闻工具把标题按行排出来就完事了;
NewsRadar 会把同一件事的多源报道归并成一个「事件」,然后统计有多少家不同媒体在报。
「12 家媒体同时在报」和「1 家自媒体在说」显然不是一回事,这个数字才是全网热点的真实刻度。
核心能力
- 78 个信源并发采集:微博/知乎/抖音/B站/头条/百度/贴吧/虎扑/豆瓣等国内热榜,
华尔街见闻/财联社/雪球/金十/法布等财经快讯,GitHub Trending/Hacker News/V2EX/
Product Hunt 等开发者源,IT之家/少数派/Solidot/量子位/雷峰网等科技源,
以及 Nature/Science/ScienceDaily/WSJ/Ars Technica/The Verge/TechCrunch 等英文源,
外加 60 秒读懂世界。11 个频道、中英双语。 - 事件聚类 + 多源互证:同一件事并成一个事件,用「家数」衡量出圈程度。
- 八维评分:时效性 / 热度 / 权威性 / 深度性 / 故事性 / 时代感 / 趣味性 / 独特性,
可调权重、可换词表。 - 跨天去重:昨天推过的今天不会再当头条。
--dedup-days控制回看天数。 - 趋势对比:🆕新上榜 / 🔥飙升 / 📈上升 / ➡️持平 / 📉回落 / 💤降温。
- 突发识别:措辞命中 + 多家互证双条件,避免每天都「暴跌」。
- 关键词订阅追踪:
track add 大模型后,简报里会长出「🎯 订阅追踪」专区。 - 深度阅读:
deep命令抓取原文正文并抽取主干,最多 8000 字。 - 四种文本产物 + 播客 MP3:Markdown / HTML(单文件、自动明暗主题)/ JSON / 纯文本,
以及「半拿铁」风格双人对话播客。 - 零第三方依赖:主引擎只用 Python 标准库,不需要 pip install 就能跑。
环境
> 本 Skill 不依赖任何写死的绝对路径,换台机器、换操作系统都能跑。下面给出的是
> 「如何在你的环境里定位解释器 / 依赖」的通用做法,而不是某个具体路径。
- 引擎(
newsradar.py):任意 Python 3.10+,只用标准库、零第三方依赖。
直接用系统或运行环境的python3即可,无需pip install。 - 播客 TTS(
podcast.py):需要一个装了edge-tts的 Python 解释器。 - 若当前解释器里没有
edge-tts:新建一个 venv 并装进去,然后用该 venv 的
python跑podcast.py(python3 -m venv <某目录>/default && <某目录>/default/bin/pip install edge-tts,Windows 用…\default\Scripts\pip)。 - 引擎那个解释器只用来生成脚本(
podcast script)没问题,真正合成音频
必须走装了edge-tts的解释器。 - ffmpeg / ffprobe:脚本通过
PATH自动查找(shutil.which("ffmpeg")),
找不到时再回退到 Homebrew / Linuxbrew 常见路径。未安装请自行安装:
macOSbrew install ffmpeg,Debian/Ubuntusudo apt install ffmpeg。
运行前先定位这几个变量(示例,按你本机实际情况填,不要照抄路径):
# ① 引擎:任选一个 Python 3.10+
PY="$(command -v python3)"
# ② 播客 TTS:改成你「装了 edge-tts」的那个解释器路径
PYTTS="$(command -v python3)" # ← 指向含 edge-tts 的解释器
# ③ Skill 目录:动态查找,千万别写死
SKILL="$(cd "$(dirname "$(find ~/.workbuddy/skills/news-radar -name SKILL.md 2>/dev/null | head -1)")" && pwd)"
# Windows 上等价位置是 %USERPROFILE%\.workbuddy\skills\news-radar
标准流程
1. 采集(约 10~15 秒抓完 78 个信源)
$PY $SKILL/scripts/newsradar.py fetch
产物落在 ~/.workbuddy/newsradar/news.db(SQLite)。这是增量的:重复抓取只有新条目
才算新增,并且保留历史用于趋势对比与跨天去重。
常用变体:
# 只抓 AI 和财经两个频道
$PY … fetch --channels ai,finance
# 跳过 RSS,只要热榜(更快,约 5 秒)
$PY … fetch --no-rss
# 网络慢时放宽超时、提高并发
$PY … fetch --timeout 25 --workers 32
2. 出报
$PY … build --hours 24 --top 20 --format md,html
产物:./newsradar-out/newsradar-<style>-<时间戳>.<ext>
常用变体:
# 早报 / 晚报 / 日报(只影响标题措辞)
$PY … build --style morning
$PY … build --style evening
# 只要 AI 频道,出 HTML 和 JSON
$PY … build --channels ai --format html,json
# 时间窗口收窄到 6 小时,看最近发生了什么
$PY … build --hours 6 --style evening
# 聚类更严(不相关的事件不容易并到一起)
$PY … build --threshold 0.5
# 新手预设:一键选定频道/风格/头条数,不必面对全部 78 源
$PY … build --preset tech # 科技速览
$PY … build --preset finance # 财经日报
$PY … build --preset world # 国际视野
$PY … build --preset comprehensive # 综合早报
# 质量分级筛选:只保留权威权重 ≥3 的源(w 见 sources 列表)
$PY … fetch --min-weight 3
$PY … build --min-weight 3
# 透明度调参:覆盖单个八维权重,无需改代码
$PY … build --weights '{"depth":0.16,"fun":0.12}'
> 聚类阈值分频道:财经快讯标题短、token 少,默认 0.40 偏松会把盘口播报并成一坨,
> 故 finance 频道在 sources.py 的 CHANNEL_THRESHOLDS 里已自动收紧到 0.50。
>
> 热度时间轴:HTML 报告里每个头条事件附带「📶 热度走势」火花线,展示它在最近若干次
> 出报里的排名走势(历史不足则不显示)。
3. 播客(可选)
$PY $SKILL/scripts/podcast.py script --report newsradar-out/xxx.json --out podcast
$PYTTS $SKILL/scripts/podcast.py tts --script podcast/xxx.script.txt --out podcast
合成是逐句串行的,一分钟音频约需 40 秒,整期 5~8 分钟。务必用后台运行,别
让它卡住前台。
一条命令搞定(脚本 + 音频):
$PYTTS $SKILL/scripts/podcast.py all --report newsradar-out/xxx.json --out podcast
4. 维护与反馈
# 订阅关键词(下次 build 长出「订阅追踪」专区)
$PY … track add 大模型 固态电池 星舰
$PY … track list
$PY … track remove 星舰
# 阅读反馈 → 调信源亲和度,下次排序更贴身
$PY … mark like --query "世界模型"
$PY … mark skip --query "不想看的内容"
# 信源体检
$PY … sources --test
# 历史统计
$PY … stats
命令速查
| 命令 | 作用 |
|---|---|
fetch |
并发抓取全部信源,落库 |
build |
聚类 + 评分 + 趋势 + 出报 |
deep |
抓取指定条目正文全文(--query / --url / --item-id) |
track |
关键词订阅管理(add / list / remove) |
mark |
阅读反馈(read / like / skip / keep) |
sources |
列出信源;--test 并发探活 |
stats |
历史统计与信源产出排行 |
定时自动化
用户要「每天早上八点给我一份」这类需求时,创建 recurring automation,让它在指定时间
执行本 Skill 的 fetch + build,并把 HTML 产物呈现给用户。不要把调度写进脚本里。
使用要点
- 先 fetch 再 build。
build只读数据库,不会自己抓。 fetch的频次不用太密:热榜源本身有分钟级缓存,一天 2~3 次(早/晚/夜)足够。- 首次运行会一次性写入约 1600~3200 条,之后每次增量几百条。
- 极少数源偶发不可达(如 Hacker News RSS 抖动、上游网关临时拦截),
引擎会自动降级跳过并计入stats,不需要处理。之前在 newsnow 网关侧废弃的
10 个热榜源(36kr / kuaishou / linuxdo / 什么值得买 / 中国新闻网 / 果核剥壳等)
已从信源表移除,不会再有无效请求。 - 默认输出目录是当前工作目录下的
newsradar-out/,所以要在用户期望的位置
执行(或显式--out)。
排错
| 现象 | 原因与处理 |
|---|---|
build 报「没有可用条目」 |
还没 fetch,或频道过滤后为空。先跑 fetch |
| 抓取日志「返回 0 条」 | 不一定是失败,可能是上游无新内容 / 归档型 feed 被时间过滤 |
| 所有新闻都带上同一天的日期 | 某个 feed 的 pubDate 被刷成了抓取时间,date_hint() 会兜底 |
| 头条里出现「恒生科技指数跌 1%」这类碎句 | is_trivial() 已过滤;若仍出现,扩充 TRIVIAL_RE |
| 一个事件里塞了好几件不相关的事 | 聚类过松。提高 --threshold,或调 refine_groups() 的 0.88 系数 |
| 播客音频时长离谱(几十分钟) | 踩了 SSML 或重试堆叠,检查是否给 Communicate 传了 SSML 字符串 |
播客 Invalid volume |
volume 必须写百分比("+5%"),不能写 "+1dB" |
播客报 a coroutine was expected |
Communicate.stream() 是异步生成器,要用 async 函数包一层消费 |
deep 抓到的正文很短 |
该站是 JS 渲染,extract_main_text() 只能拿到静态 HTML |
参考文档
references/sources.md—— 78 个信源清单、频道/权重/出品方去重规则、如何加源references/scoring.md—— 聚类算法、八维评分公式与标定过程、词表位置references/output-spec.md—— 五种产物的格式规范、JSON 字段说明、播客脚本格式与踩坑
版本记录
- 1.0.4(2026-10-09):依据虾评平台 23 条评分反馈做的针对性优化——①
deep正文抽取新增质量分级(ok/empty/boilerplate),样板/导航文字不再被当正文引用并显式告警;② 突发区「N 家媒体同报」截断名补「等」字,家数与名单对齐;③stats新增信源历史成功率面板,暴露长期不可达源;④ 简报页脚输出本次实际生效的全局/分频道聚类阈值与八维权重,参数透明闭环;⑤is_trivial收紧口号式热搜短语过滤;⑥ 新增保守的频道语义校正(地质灾害/航天/赛事/文娱等标题从来源站打标校正到对应频道)。 - 1.0.3(2026-09-30):修复
quality_label()用精确字典匹配导致权重落在 1~5 之外(自定义 RSS 写 4.5、6 等浮点)时塌成「其他」的缺陷,改为阈值区间分级,对整数与浮点都稳健。 - 1.0.2(2026-09-30):4 星评测驱动的 10 项优化——信源质量分级筛选(
--min-weight)+ 新手预设(--preset)、播客去机械感与依赖降级、热度趋势时间轴火花线、八维权重透明调参(--weights)、newsnow 备用网关、SSRF 防护与白名单、分频道聚类阈值、weight 字符串崩溃健壮性、碎句噪声过滤扩充。 - 1.0.1(2026-09-29):首发上架版本,78 信源并发采集、跨源聚类、八维评分、多格式简报与双人播客。