DailyHot,让热点资讯变成一组干净的 API
我做 DailyHot Go版本,一开始想解决的是个很朴素的问题。
每天能看的热榜太多了。知乎有知乎热榜,微博有微博热搜,B 站有热门,GitHub 有 Trending,科技媒体、论坛、视频平台也各有一套榜单。真要把这些内容接到自己的网站、机器人、RSS 阅读器或者信息看板里,就会发现事情没那么舒服。
每个平台的数据格式不一样,更新时间不一样,有的有接口,有的只能解析页面。最后很容易变成一堆临时脚本,能跑,但不好维护。
DailyHot Go版本就是把这件事收拾了一下。
它用 Go 写了一个轻量的热点资讯聚合服务,把不同平台的热榜统一整理成 API。目前已经接入 59 个资讯源,覆盖新闻资讯、科技资讯、技术社区、视频娱乐、游戏资讯、阅读、公共信息等常见分类。
启动服务后,访问首页就能看到完整的接口目录。每个资讯源都有独立路径,比如这些。
/zhihu
/weibo
/bilibili
/github
/aihot默认返回 JSON。想控制数量,可以加 limit。
/zhihu?limit=10想跳过缓存,可以加 cache=false。
/zhihu?cache=false想给 RSS 阅读器用,也可以直接切成 RSS。
/zhihu?rss=true这块我自己挺喜欢。因为它没有把使用场景锁死。前端页面可以调 JSON,阅读器可以订 RSS,自动化脚本也能拿来做日报、推送、摘要,怎么接都比较顺手。
Go 版本还有一个现实好处,部署省心。
本地跑起来只需要一条命令。
go run ./cmd/server默认端口是 6688。编译后就是一个独立可执行文件,放到服务器上,带上 config/config.yaml 就能运行。对个人 VPS 或小机器来说,这种形态会轻不少。
项目里也做了缓存处理。Redis 能连上就用 Redis,Redis 不可用就回退到进程内缓存。定时刷新也可以通过配置控制,比如每小时刷新一次全部资讯源。服务不会每次请求都直接打到上游,对稳定性和响应速度都更友好。
代码结构也尽量保持清楚。
cmd/server 服务入口
internal/server 路由、首页、JSON 和 RSS 输出
internal/source 资讯源注册和具体实现
internal/cache 内存缓存和 Redis 缓存
config 配置文件后面要加新的资讯源,基本就是在 internal/source/providers 下面放一个独立实现,再注册进去。每个来源各管各的,不会把项目搅成一团。
我觉得 DailyHot Go版本适合这几类场景。
个人网站想放一个热点模块,可以用它。
导航站、Halo 插件、内容聚合页想接入实时热榜,可以用它。
想做每日热点推送、AI 摘要、RSS 订阅补充,也可以用它。
它不是一个复杂的大系统,更像一个干净的数据底座。把全网分散的热门内容拉到一起,再用统一的方式交给你。
鸣谢和参考
DailyHot Go版本在项目思路、接口设计和部分资讯源实现上,参考了这些优秀项目。
imsyy/DailyHotApi,项目思路、接口设计和资讯源实现参考
DIYgod/RSSHub,RSS 路由设计和部分资讯源实现参考