
# 🇫🇷 法国监控器
**面向公共利益基础设施和领土数据的开源地理空间监控平台**
[](LICENSE)
[](https://www.typescriptlang.org/)
[](https://vitejs.dev/)
[](https://vercel.com)
[](https://github.com/FraidFraid/France-Monitor)
[](https://github.com)
[实时应用](https://www.francemonitor.com) · [关于](https://www.francemonitor.com/about) · [法律](https://www.francemonitor.com/legal)
[功能](#-features) · [架构](#-architecture) · [入门](#-getting-started) · [文档](#-documentation) · [路线图](#-roadmap) · [贡献](#-contributing)
## 什么是法国监控器?
法国监控器是一个开源的地理空间监控平台,用于公共利益基础设施和领土数据。当前的实现是一个以法国为重点的参考部署:它将来自公共API、开放数据、技术流和RSS源的真实时间信号聚合到一个交互式地图仪表板中,涵盖基础设施、环境、交通、健康、网络威胁、市场和公共信息流。
目标是不要取代主要来源、官方警报或新闻室验证。该项目设计为一个面向公众的监控和关联工具,供分析师、记者、研究人员和希望对法国的弱信号和公共数据进行统一视图的技术好奇用户使用。
法国监控器**不是一个媒体机构,也不是新闻出版物**。应用中显示的项目应被视为需要从主要来源确认的监控信号。
长期目标是将法国原型转变为可重用的欧洲公共资源:文档化的摄取模式、可审计的来源归属、可部署的API代理和特定国家的连接器,其他公民技术或研究团队可以对其进行调整。
## ✨ 功能
### 🗺️ 3D交互式地图
- 通过**MapLibre GL + Deck.gl**(桌面)进行WebGL渲染
- 移动和低内存设备使用D3/SVG回退
- 白天/黑夜终止符和实时太阳位置
- 卫星底图切换(Copernicus Sentinel-2 NDWI叠加)
- 基于Supercluster的新闻标记聚类
- 军事飞行轨迹、船只轨迹、AIS实时位置、GPS干扰热图
### ⚡ 能源与基础设施
| 面板 | 数据 | 频率 |
|-------|------|---------|
| 电网(Ecowatt) | RTE按部门压力水平 | 5分钟 |
| 核能舰队 | RTE不可用性 + REMIT/IIP RSS通知 | 15分钟 |
| 气网 | GRTgaz / Teréga流量 + 生命器官设施 | 10分钟 |
| 石油与燃料 | 炼油厂库存、燃料紧张、每日官方价格历史 | 10分钟 |
| 风能 | RTE实时风能生产按公园 | 5分钟 |
| 水利骨干 | 水库水位、坝信号、Hub'Eau水文学 | 10分钟 |
| DROM能源 | 海外领土电网数据(留尼汪、马提尼克…) | 15分钟 |
| 公民停电 | infocoupure.fr抓取 — 真实电力停电报告 | 10分钟 |
### 🛡️ 网络与数字主权
- **CyberBreachPanel** — 实时漏洞和勒索软件事件地图(RansomwareLive流)
- **暴露评分** — Shodan + Censys OSINT聚合的暴露法国基础设施
- **威胁评分引擎** — 每个来源/域的复合网络压力指数
- **网络气压计** — Cloudflare Radar + IODA互联网异常检测
- **互联网中断** — ISP级连接性监控(ARCEP / IODA)
- 具有严重程度分类的网络安全事件流
### 🌦️ 环境
- **Météo-France** 监视警报(1-4级,所有危害类型)
- **Vigicrues** 洪水段与匹配的OSM水道几何形状
- 活跃的野火热点(NASA FIRMS MODIS + VIIRS,DBSCAN聚类)
- 空间天气(NOAA Kp指数,地磁风暴警报)
- EnvironmentPanel — 天气、洪水、火灾和空间天气的统一视图
### 🚂 交通
- **SNCF** 实时中断与受影响的铁路段在地图上
- **空中交通**(OpenSky ADS-B)— 民用和军事飞行分离
- **海事AIS** 实时船只位置 + 异常检测(保持模式、GPS漂移)
- **道路交通**事件按需(TomTom / Bison Futé)
### 📰 新闻智能
- 来自**60+法国国家和区域(PQR)**来源的RSS聚合
- 两阶段分类:基于关键词(即时)然后LLM覆盖(异步)
- AI摘要:Ollama(本地)→ Groq(云)→ Transformers.js(浏览器)
- 新闻条目的地理编码到地图位置
- 在轮询周期中保护过时文章和去重
### 🔭 防御与主权
- 军事飞行跟踪与呼号到任务分类
- GPS干扰信号检测(异常位置聚类)
- 海底电缆邻近威胁分析(基于AIS)
- 限制空域区(ZIT/ZRT/ZIA)
- 军事船只跟踪(海军 + 盟军舰队)
### 🏥 健康
- **SPF / ISS** 按部门卫生压力指标
- SOS Médecins和OSCOUR紧急呼叫指标
- APL(医疗可及性评分 — déserts médicaux)按部门
- 医院密度叠加(FINESS)
- 健康气压计与部门级钻取
- **汉坦病毒层** — 活跃集群地图(MV Hondius,已确认的法国病例)+ 历史SPF风险区域(2005-2023)作为部门多边形,从DGS-Urgent和SPF实时流自动分类
### 🧠 情境智能(ISNR)
- **ISNR** — 法国国家稳定指数(综合评分,0-100)
- AI生成的情境简报(FR/EN可切换)
- **情境监控器** — 自动警报检测与严重程度评分
- **情境历史面板** — IndexedDB支持的过去快照的时间线
- **气压计小部件** — 多领域实时健康指标
- 法国国家情报 — 结构化国家级别情报摘要
### 📊 金融与市场
- CAC 40 + 主要欧洲指数
- 关键商品价格(布伦特原油、天然气、小麦、金属)
- 欧元/美元和战略货币对
- 专门的商品条和市场监管小部件
### 🗳️ 治理面板
- **ÉlusPanel** — 按市镇划分的当选官员及其政治隶属关系
- **MinistresPanel** — 当前政府组成及其职责跟踪
## 🏗️ 架构
```
┌─────────────────────────────────────────────────────────────────┐
│ Browser │
│ │
│ App.ts (orchestrator ~2500 lines) │
│ ├── MapContainer → DeckGLMap (WebGL) / Map (D3/SVG) │
│ ├── 50 components (energy, news, health, cyber, intel…) │
│ ├── RSS Pipeline (stage 1: keywords · stage 2: AI async) │
│ ├── 12 polling loops (military, AIS, finance, cyber, health…) │
│ ├── ISNR engine (stability index, situation detection) │
│ └── Watchdog — centralised observability registry │
│ │
│ State: in-memory + localStorage + IndexedDB (history) │
└──────────────────────────┬──────────────────────────────────────┘
│ fetch /api/*
┌──────────────────────────▼──────────────────────────────────────┐
│ Vercel Serverless Functions (api/) │
│ │
│ Proxy + cache layer (Upstash Redis, TTL per route) │
│ ├── energy/ RTE Ecowatt, Eco2mix, nuclear REMIT │
│ ├── transport/ SNCF disruptions, air traffic, AIS relay │
│ ├── health/ SPF / ISS, SOS Médecins, OSCOUR │
│ ├── finance/ Boursorama scrape, commodities │
│ ├── fires/ NASA FIRMS MODIS + VIIRS │
│ ├── outages/ citizen scraping, ORE, Cloudflare, IODA │
│ ├── threats.js Cyber OSINT aggregation (Shodan/Censys) │
│ ├── exposure.js Technical exposure scoring │
│ ├── intelligence/ LLM summarisation (Groq, server-side) │
│ └── rss / rss-proxy CORS-bypass + Scrapling bypass │
│ │
└─────────────────────────────────────────────────────────────────┘
```
### 关键设计决策
| 决策 | 理由 |
|----------|-----------|
| **Vanilla TypeScript,无框架** | 零虚拟DOM开销;直接DOM用于60fps地图交互 |
| **Vercel Functions作为API代理** | CORS绕过,Redis缓存,秘密隔离,无需专用后端 |
| **Ollama-first AI** | 没有PII离开机器;云LLM仅作为回退 |
| **Watchdog注册表** | 中心化可观察性 — 所有服务自我报告;StatusPanel自动更新 |
| **非阻塞初始化** | 关键层(能源、天气、洪水)首先加载;可选层在后台 |
| **DeckGLMap懒加载** | 移动用户永远不会下载1MB WebGL堆栈 |
| **Service Worker(Workbox)** | API路由NetworkFirst(4秒超时);地图瓦片CacheFirst 30天;PWA可安装 |
| **`hasEverSucceeded`标志** | 区分“首次加载正在进行中”和“持续失败”在IIP/REMIT中 |
## 🚀 入门
### 先决条件
- **Node.js** 20+
- **npm** 10+
- 一个[Vercel](https://vercel.com)账户(免费层有效)
- 一个[Upstash](https://upstash.com) Redis数据库(免费层)
- 一个[RTE Open Data](https://data.rte-france.com)应用程序(免费,用于能源和核数据)
对于完整功能覆盖是可选的:
- [Météo-France API](https://portail-api.meteofrance.fr) — 天气警报
- [AISstream.io](https://aisstream.io) — 实时海事交通
- [NASA FIRMS](https://firms.modaps.eosdis.nasa.gov/api) — 野火热点
- [TomTom](https://developer.tomtom.com) — 道路交通
- [OpenSky](https://opensky-network.org) — 民用航空交通
- [Groq](https://console.groq.com) — 云LLM回退
- [Ollama](https://ollama.com)本地运行 — 推荐本地LLM
- [Shodan](https://shodan.io) + [Censys](https://censys.io) — 网络暴露OSINT
### 安装
```
git clone https://github.com/FraidFraid/France-Monitor.git
cd France-Monitor
npm install
cp .env.example .env.local
# 编辑 .env.local 并填写您的密钥
```
### 开发
```
# 仅 Vite 开发服务器(端口 3001)
npm run dev
# Vite + Scrapling 代理(Cloudflare 保护的 RSS,端口 8080)
npm run dev:full
# 为 Scrapling 安装 Python 依赖(首次安装)
npm run scrapling:install
```
应用将在**http://localhost:3001**上可用。
### 构建 & 类型检查
```
npm run typecheck # strict, 0 errors required
npm run build # outputs to dist/ with Brotli pre-compression
npm run preview # preview production build locally
```
### 部署
```
vercel
vercel env add UPSTASH_REDIS_REST_URL
vercel env add UPSTASH_REDIS_REST_TOKEN
# … 对每个所需的变量重复操作(参见 .env.example)
```
## ⚙️ 环境变量
将`.env.example`复制到`.env.local`进行本地开发。在Vercel上,在**设置 → 环境变量**中进行配置。
### 必需的
| 变量 | 描述 |
|----------|-------------|
| `UPSTASH_REDIS_REST_URL` | Upstash Redis REST端点 |
| `UPSTASH_REDIS_REST_TOKEN` | Upstash Redis身份验证令牌 |
| `RTE_CLIENT_ID` | RTE Open Data OAuth客户端ID(Ecowatt,核能) |
| `RTE_CLIENT_SECRET` | RTE Open Data OAuth客户端密钥 |
| `VITE_METEOFRANCE_API_KEY` | Météo-France监视API密钥 |
### 可选的(如果不存在则优雅回退)
| 变量 | 描述 | 回退 |
|----------|-------------|----------|
| `VITE_AISSTREAM_KEY` | AISstream.io海事AIS | 层禁用 |
| `VITE_TOMTOM_API_KEY` | TomTom道路交通瓦片 | 层禁用 |
| `OPENSKY_CLIENT_ID / SECRET` | OpenSky网络 | 匿名配额 |
| `SNCF_API_KEY` | SNCF实时中断 | 层禁用 |
| `NASA_FIRMS_API_KEY` | NASA FIRMS野火 | 层禁用 |
| `GROQ_API_KEY` | Groq云LLM(仅服务器端) | 浏览器Transformers.js |
| `SHODAN_API_KEY` | Shodan OSINT(网络暴露) | 网络面板降级 |
| `CENSYS_API_ID / SECRET` | Censys OSINT | 网络面板降级 |
| `CLOUDFLARE_RADAR_TOKEN` | Cloudflare雷达异常 | 层禁用 |
| `CDSE_CLIENT_ID / SECRET` | Copernicus Sentinel-2影像 | 卫星叠加禁用 |
| `SCRAPLING_PROXY_URL` | Python Scrapling侧车URL | 直接获取(可能触达CF) |
## 📡 数据源
| 领域 | 来源 | 类型 |
|--------|--------|------|
| 电网 | [RTE Open Data](https://data.rte-france.com) | REST OAuth |
| 核能REMIT | [IIP RTE](https://iip.cloud-rte-france.com) | RSS(公共) |
| 气网 | [GRTgaz / GIE](https://www.gie.eu) | REST |
| 天气警报 | [Météo-France](https://portail-api.meteofrance.fr) | REST |
| 洪水水平 | [Vigicrues / Hub'Eau](https://hubeau.eaufrance.fr) | REST |
| 海事交通 | [AISstream.io](https://aisstream.io) | WebSocket |
| 民用航空交通 | [OpenSky Network](https://opensky-network.org) | REST |
| 军事飞行 | ADS-B + 内部呼号数据库 | 内部 |
| 野火 | [NASA FIRMS](https://firms.modaps.eosdis.nasa.gov) | REST |
| 铁路中断 | [SNCF Open Data](https://numerique.sncf.com/startup/api) | REST |
| 道路交通 | [TomTom](https://developer.tomtom.com) | REST + 瓦片 |
| 健康指标 | [Santé Publique France](https://www.santepubliquefrance.fr) | REST |
| 公民停电 | [infocoupure.fr](https://infocoupure.fr) | HTML抓取 |
| 燃料价格 | [data.economie.gouv.fr](https://data.economie.gouv.fr) | REST |
| 互联网中断 | [IODA](https://ioda.inetintel.cc.gatech.edu) + [Cloudflare Radar](https://radar.cloudflare.com) | REST |
| 网络暴露 | [Shodan](https://shodan.io) + [Censys](https://censys.io) | REST |
| 勒索软件漏洞 | [RansomwareLive](https://data.ransomware.live/posts.json) | REST(公共) |
| 金融 | Boursorama(服务器端代理) | HTML抓取 |
| 新闻 | 60+ RSS源(国家和区域 + PQR) | RSS(CORS代理) |
| 卫星影像 | [Copernicus CDSE](https://dataspace.copernicus.eu) | OData |
| 空间天气 | [NOAA SWPC](https://www.swpc.noaa.gov) | REST |
| Élus / communes | [data.gouv.fr](
标签:API集成, OSV, TypeScript, Vercel, Vite, WSL, 交互式地图, 公共信息流, 公共数据, 分析工具, 可观测性, 地理信息系统, 基础设施监控, 安全可观测性, 安全插件, 实时数据, 市场信息, 开放数据, 开源平台, 数据关联, 数据展示, 数据整合, 数据监控, 数据聚合, 法国, 活跃开发, 版本控制, 研究工具, 红队, 网络安全, 自动化攻击, 记者工具, 隐私保护, 领土数据, 黄金证书