这几天 GitHub 上冒出一个叫 WorldMonitor 的项目,一天内飙到 5.9 万星。我第一反应是蹭热度,但仔细看了仓库的代码结构和 README,发现它确实解决了一个实在的问题:把散布在全网的新闻、地缘政治事件、基础设施状态,统一展示在一张地图上,并且用 AI 做实时分类和摘要。

今天我们不吹不黑,从后端工程师的角度把它的技术栈、架构、部署步骤、以及实际坑位都捋一遍。读完你能立刻决定要不要在自己项目里用,或者拿来改造成团队内部监控面板。

它到底用来干什么

传统上,如果你想监控全球某个区域的政治动荡、网络中断、或者重大新闻,你需要同时盯着路透社、BBC、Twitter、Cloudflare Status 等多个来源。WorldMonitor 做的就是把这些 feeds 聚合进一个前端仪表盘,通过地图和列表视图展示事件,还调用 LLM(默认是 OpenAI)对每条新闻做摘要和归类(经济、军事、环境等)。

本质上它是一个定制化的事件聚合 + AI 处理管道,输出是一个可交互的实时面板。

open source world map with event markers

核心功能与亮点

1. AI 驱动的新闻处理

项目默认使用 OpenAI GPT-4o 来提取新闻中的关键实体、事件类型、地理坐标。如果你没有 OpenAI 的 key,也可以换成开源的 LLM(比如 Ollama 本地模型),但精度会下降。

src/ai/pipeline.ts 中可以看到它定义了一个简单的处理链:

typescript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
// 来源: https://github.com/koala73/worldmonitor/blob/main/src/ai/pipeline.ts
export async function processArticle(article: Article): Promise<ProcessedEvent> {
  const prompt = `
    Given the following news article, extract:
    1. Main event type (one of: political, military, economic, environmental, tech, other)
    2. Geopolitical entities involved (countries, regions, organizations)
    3. Latitude and longitude of the primary location
    4. A one-sentence summary in Chinese or English
    ---
    Title: ${article.title}
    Content: ${article.content?.slice(0, 2000)}
  `;

  const response = await openai.chat.completions.create({
    model: 'gpt-4o',
    messages: [{ role: 'user', content: prompt }],
    temperature: 0.3,
  });

  return JSON.parse(response.choices[0].message.content ?? '{}');
}

这里有个明显的缺陷:JSON.parse 没有错误处理,如果 LLM 返回格式不对,整个流程会崩。我建议生产环境加一段校验和 fallback 逻辑。

2. 内置数据源调度

项目内置了多个数据源的抓取器(RSS、Twitter API、Cloudflare Radar 等)。调度器在 src/scheduler/ 下,用 node-cron 每 15 分钟跑一次。数据储存在 SQLite(默认)或 PostgreSQL。

3. 地图可视化

前端用 React + Leaflet,标记点根据事件类别用不同颜色(军事:红色,经济:绿色)。点击标记弹出 AI 摘要和原文链接。这部分中规中矩,但胜在开箱即用。

和同类项目的区别

我拿它和两个常见方案做了对比:

功能 WorldMonitor GDELT Project EarthTV (商业)
数据源 RSS + Twitter + Status GDELT 自有数据库 付费新闻 API
AI 处理 OpenAI / 本地 LLM 无内置 AI 无 AI 摘要
部署难度 Docker 一键 需要 Hadoop 集群 不开源
可定制性 中等(改配置文件) 低(只查询 API)
成本 服务器 + API 费用 免费但数据量巨大 按年订阅

个人观点:如果只是个人研究,WorldMonitor 是性价比最高的选择。但如果要监控国内舆情或需要 7×24 生产级可靠性,它还不够成熟——比如没有告警通知、没有用户权限管理。

适用场景与局限

适合谁

  • 对外新闻舆情感兴趣的开发者,想搭一个私人情报面板
  • 研究如何用 LLM 自动化信息处理的朋友,代码架构值得借鉴
  • 需要快速验证“AI + 地图”聚合想法的原型

不适合什么场景

  • 对数据实时性要求为秒级:调度器最小间隔是 5 分钟,RSS 更新也有延迟。
  • 国内网络环境:默认数据源很多被墙,必须自己配国内镜像或替换源。
  • 企业级多用户:没有登录、权限、审计日志,直接暴露到公网很危险。
  • 预算敏感:每天处理 1000 条新闻大约消耗 20 万 tokens,按 OpenAI 现在价格约 3 美元/天,一个月 90 美元。长期跑成本不低。

快速上手步骤

下面是在你自己的 Linux 服务器或 Mac 上运行的步骤(我测试时的环境是 Ubuntu 22.04 + Docker 24)。

第一步:克隆项目并配置环境变量

bash
1 2 3 4 5 6 7
git clone https://github.com/koala73/worldmonitor.git
cd worldmonitor

cp .env.example .env
# 编辑 .env,至少填入以下两项:
# OPENAI_API_KEY=sk-xxx
# TZ=Asia/Shanghai

第二步:启动 Docker Compose

bash
1
docker compose up -d

等待镜像拉取和构建。第一次启动会比较久,因为要编译 Next.js 和安装依赖。

第三步:查看仪表盘

打开 http://localhost:3000。如果一切正常,地图上会显示最近 24 小时的事件标记。后台调度器默认 15 分钟执行一次抓取。

第四步(可选):替换数据源

config/sources.json 里可以增删 RSS 或 API 源。例如想添加一个国内新闻源,可以这样:

json
1 2 3 4 5 6
{
  "name": "cctv-news",
  "type": "rss",
  "url": "http://news.cctv.com/rss/chinanews.xml",
  "interval": 30
}

注意:CCTV 的 RSS 可能不支持 CORS,需要在项目的 scheduler 服务里用 cheerio 直接抓取。我提了个 PR 增加这个支持,目前还没合并。

总结一句话

如果你需要快速搭建一个全球事件监控面板,并且愿意每月付几十美元的 API 费,WorldMonitor 是目前 GitHub 上最易用、最完整的开源方案。但它不适合对数据准确性和实时性有硬性要求的场景。

(P.S. 项目 star 数高有一部分原因是对“全球监控”这个概念的好奇,实际技术难度并不高。给新手提个醒:不要被 stargazer 数量迷惑,先看 issue 关闭率和代码质量再决定是否深度使用。)