📌 项目地址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 里写得清楚,我按实际经验整理成三档:

第一档:纯展示,不登录不缓存

适合只想快速跑起来自己看。步骤:

  1. Fork 仓库
  2. 导入 Cloudflare Pages 或 Vercel
  3. 构建命令 pnpm run build,输出目录 dist/output/public

什么都不用配置,几分钟上线。缺点是每次刷新都是新数据,没有持久化。

第二档:加登录和数据库

要配置 GitHub OAuth 和数据库。步骤:

  1. 创建一个 GitHub OAuth App,不需要特殊权限,回调 URL 填 https://你的域名/api/oauth/github
  2. 复制 example.env.server.env.server,填上 G_CLIENT_IDG_CLIENT_SECRETJWT_SECRET。首次运行需要设置 INIT_TABLE=true,之后可以关掉
  3. 数据库用 Cloudflare D1 最方便。在 Worker 控制台创建后,把 database_iddatabase_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/sourcesserver/sources。项目提供了完整类型定义,每个源是独立模块。你只需要实现固定字段的类型和抓取函数。CONTRIBUTING.md 有详细步骤。

我看了目录结构:shared/sources 里定义源的类型和元数据,server/sources 里写抓取逻辑。每个源一个文件,非常干净。你不需要理解整个项目的架构,只弄懂这两个目录就能加新源。不过目前抓取逻辑是用 cheerio 解析 HTML,如果你加动态渲染的网站(如 SPA),可能需要额外处理。

我的判断

如果你只是偶尔看看新闻,直接用在线 demo 就行。但如果你想要一个可控的新闻数据源,并且希望 AI 也能直接读取,NewsNow 值得花半小时部署一个实例。

两个真正有用的点:MCP 接口让 AI 应用直接消费新闻数据,不需要额外桥接;动态抓取间隔省资源防封号。其他功能(GitHub 登录、缓存)算标配,不是亮点。

我打算等完整版支持多语言后,加几个英文科技新闻源,用它搭一个自动简报服务。现在先部署架构,以后扩展也方便。

这篇文章对你有帮助吗?

发表回复