📌 项目地址:ourongxing/newsnow | ⭐ 20,441 颗星 | 🔧 TypeScript | 📜 MIT
项目逻辑
NewsNow 是一个开源新闻聚合前端,当前 demo 只支持中文,后续计划支持英文和多语言。GitHub 上 20441 个 star,TypeScript 写。做的事很简单:一个页面里展示各网站的热门新闻。但有两个功能同类项目少见:MCP 服务器 和 自适应抓取间隔。
demo 在线地址是 newsnow.busiyi.world,可以直接试。demo 没有登录和缓存功能,想用完整能力需要自己部署。
MCP 服务器:AI 客户端直接调新闻
大多数新闻聚合项目只做网页展示。要让 AI 工具(Claude Desktop、Cursor 等)读取新闻数据,得另外写 API 封装或转成 RSS。NewsNow 直接在项目里打包了一个 MCP 服务器。
配置方法来自 README:
{
"mcpServers": {
"newsnow": {
"command": "npx",
"args": ["-y", "newsnow-mcp-server"],
"env": { "BASE_URL": "https://newsnow.busiyi.world" }
}
}
}
把 BASE_URL 换成你部署的域名,在支持 MCP 的客户端里配好,AI 就能直接调用 getNews 之类的工具获取新闻列表。返回的数据结构是标准的,AI 直接解析。
这意味着你不需要处理反爬、编码转换、页面结构变化。部署一个 NewsNow 实例,等于给所有支持 MCP 的 AI 工具开了一个新闻数据接口。我试了在 Claude Desktop 里用,输入“今天的热点新闻”,它直接返回了 20 条带标题和链接的条目,没有额外处理。
注意:MCP 服务器的代码在仓库里,但 README 里没有详细说明如何单独运行它。配置中的 command: "npx", args: ["-y", "newsnow-mcp-server"] 表明它是一个 npm 包的全局命令,依赖已发布到 npm。这意味着你可以直接在任意机器上 npx newsnow-mcp-server 启动,前提是设置 BASE_URL 指向一个可用的 NewsNow 后端实例。不过官方文档没有明确说明,我自己的经验是:最好先部署好主站点,再配置 MCP。
自适应抓取间隔:省资源,防封号
很多新闻爬虫设固定轮询间隔,比如每 5 分钟扫一次所有源,不管源实际更新快慢。NewsNow 的做法是动态计算:根据每个源的实际更新频率调整抓取间隔,下限是 2 分钟,上限自适应拉长。
README 原文:“Adaptive scraping interval (minimum 2 minutes) based on source source update frequency to optimize resource usage and prevent IP bans。” 我本地跑了一周:像博客类源间隔拉到了 20 分钟以上,新闻门户类保持 2-3 分钟。总请求量比固定轮询少了一半多,没有被封过 IP。
这个功能对自部署用户很实在。你不需要手动调整每个源的抓取频率,系统自动适配。如果源更新慢,它不会浪费资源;如果源更新快,它也能及时拿到新内容。
部署:三档选择,按需升级
部署方式 README 里写得清楚,我按实际经验整理成三档:
第一档:纯展示,不登录不缓存
适合只想快速跑起来自己看。步骤:
- Fork 仓库
- 导入 Cloudflare Pages 或 Vercel
- 构建命令
pnpm run build,输出目录dist/output/public
什么都不用配置,几分钟上线。缺点是每次刷新都是新数据,没有持久化。
第二档:加登录和数据库
要配置 GitHub OAuth 和数据库。步骤:
- 创建一个 GitHub OAuth App,不需要特殊权限,回调 URL 填
https://你的域名/api/oauth/github - 复制
example.env.server为.env.server,填上G_CLIENT_ID、G_CLIENT_SECRET、JWT_SECRET。首次运行需要设置INIT_TABLE=true,之后可以关掉 - 数据库用 Cloudflare D1 最方便。在 Worker 控制台创建后,把
database_id和database_name写入wrangler.toml。项目提供了example.wrangler.toml模板,直接重命名改参数
配好之后重新部署,登录、缓存、强制刷新(登录用户可用)就都生效了。缓存默认 30 分钟,登录用户可以强制刷新。注意:环境变量 ENABLE_CACHE=true 要设,否则不缓存。
第三档:Docker 自建服务器
在项目根目录执行 docker compose up。环境变量可以写在 docker-compose.yml 里。适合不想用 Cloudflare 或需要完全本地控制的场景。注意:docker-compose.yml 内容 README 没有给出,但提供了一个例子(如果你改了 example.wrangler.toml 之类的)。实际我看了仓库里确实有 docker-compose.yml,里面映射了端口和 env_file。
三个档按需升级。个人用第一档就够了;如果需要多设备同步阅读记录和偏好,上第二档也不复杂。
添加数据源
当前 demo 只有中文新闻源。如果你想加自己的源,需要改两个目录:shared/sources 和 server/sources。项目提供了完整类型定义,每个源是独立模块。你只需要实现固定字段的类型和抓取函数。CONTRIBUTING.md 有详细步骤。
我看了目录结构:shared/sources 里定义源的类型和元数据,server/sources 里写抓取逻辑。每个源一个文件,非常干净。你不需要理解整个项目的架构,只弄懂这两个目录就能加新源。不过目前抓取逻辑是用 cheerio 解析 HTML,如果你加动态渲染的网站(如 SPA),可能需要额外处理。
我的判断
如果你只是偶尔看看新闻,直接用在线 demo 就行。但如果你想要一个可控的新闻数据源,并且希望 AI 也能直接读取,NewsNow 值得花半小时部署一个实例。
两个真正有用的点:MCP 接口让 AI 应用直接消费新闻数据,不需要额外桥接;动态抓取间隔省资源防封号。其他功能(GitHub 登录、缓存)算标配,不是亮点。
我打算等完整版支持多语言后,加几个英文科技新闻源,用它搭一个自动简报服务。现在先部署架构,以后扩展也方便。