project-89/veritas
GitHub: project-89/veritas
Veritas 是一个开源叙事情报 OSINT 平台,用于追踪和对比同一事件跨媒体来源的叙事分歧,并提供基于证据的可审计验证。
Stars: 0 | Forks: 0
# Veritas — 叙事情报平台
Veritas 追踪叙事如何在开放式网络中出现、分化并传播。这是一个免费、开源的 OSINT 平台,其构建基于一个核心原则:**任务是看清谁在说什么——而不是决定什么是真相。** 来源被视作一种结构性事实(谁控制着媒体、谁为其提供资金、它的受众是谁);绝不预设立场。当平台提出事实性主张时,它会以证据为基础并展示其推导过程;如果无法做到,它就会选择弃权并如实相告。
## Veritas 的功能
- **揭示叙事分歧** — 跨媒体平台聚合同一个现实世界的报道,并按*视角类别*(国内官方媒体、国际官方媒体、公共广播机构、独立媒体)并排展示其报道内容。官方如何向本国民众与世界传达信息,与独立媒体对同一事件的报道之间存在的差异,正是核心信号所在。
- **接入实时全球事件 feed** — 持续轮询来自 8 个信号源(地震、灾害、天气、冲突、市场、新闻)和约 160 个精选 RSS feed 的全球数据流,并在交互式地球仪和 NERV 风格的战术地图上呈现,同时带有分区域的**激增检测**(仅当某个区域超过其*自身*基线时才会被标记,而非仅凭绝对数量)。
- **执行定向扫描** — 覆盖 11 个平台 connector,具备严格的词汇匹配功能,并包含一个 LLM **查询优化**层,能将模糊的主题转化为敏锐且词汇匹配的查询,所有结果均基于实时网络数据。
- **提取基于证据的案例** — 例如,一个追踪来源的真实世界 AI 模型失败语料库。每个条目都引用了其原始帖子的逐字摘录(经过机器验证),并经过对抗性怀疑测试的考验,以剔除无实质互动的内容。
- **调查行为者** — 跨 connector 的单用户时间线,跨平台身份发现(Sherlock,400+ 网络),协同操纵与机器人检测,以及“谁受益”(cui-bono)推理分析。
- **检测操纵** — 17 种政治宣传技术(基于技术特征,而非针对行为者),基于证据的主张验证(链上数据 / SEC / GitHub / Wayback / Wikipedia),以及平台可信度评分。
- **翻译与留存** — 非英语官方媒体(俄语、波斯语)的内容在接入时会进行机器翻译,并始终保留原文;append-only 的历史记录会捕捉编辑修改(隐蔽重命名),并且无 TTL 的归档会保留新闻框架数据以进行纵向分析。
- **支持 Agent 操作** — 整个 pipeline 通过 MCP 暴露,因此外部 agent 可以自主执行扫描、分析、验证、优化查询以及提取案例。
## 设计原则
- **诚实的降级。** 每个基于 LLM 的阶段都有明确的 fallback,并会说明结果是由哪种模式生成的(语义匹配还是 hash-fallback embeddings,基于 LLM 的验证还是启发式验证)。缺少关键依赖项时会以可见的方式降级某项功能,而不是伪造输出。
- **来源重于观点。** 所有权分类体系(`independent` / `public-broadcaster` / `state-media` / `state-official`)是结构性的,且**与阵营无关** — 对华盛顿、布鲁塞尔、莫斯科和北京一视同仁。美国政府的 feed 会被标记为 `state-official`,这与标记俄罗斯政府部门 feed 的方式完全相同。
- **零漂移。** UI 的能力展示(connectors、feed 统计、信号源、LLM 状态)均基于实时的 `/capabilities` endpoint 构建出来,绝不使用硬编码列表 — 如果某个 connector 掉线,各处均会自动显示其为离线状态。
- **有据可依或保持沉默。** 提出主张和提取案例时必须引用可验证的证据;无法验证的内容会被丢弃并*计入统计*,因此输出结果会明确说明过滤了哪些内容,而不是悄无声息地减少数量。
## 架构
```
11 platform connectors ─┐
8 signal sources ────────┼─► BullMQ scan queue ─► MongoDB (live + append-only history/archive)
~160 RSS feeds ──────────┘ │
▼
Analysis (libs/analysis): Gemini semantic clustering · claim verification ·
propaganda · deep investigation · divergence clustering · failure extraction ·
translation · surge aggregation
│
Memgraph (MAGE) social graph ── Redis (queues + scan events)
▼
NestJS API (apps/api) ─► Next.js NERV dashboard (apps/veritas-client)
└► MCP server (apps/veritas-mcp) for agent control
```
**Monorepo (Nx):** `apps/{api, veritas-client, veritas-mcp}` · `libs/{analysis, ingestion, database, shared, content-classification, visualization}` · `packages/atlas-plugin`。
## 数据源
### 平台 connector(已注册 11 个 — 实时状态请参见 `GET /capabilities`)
| 平台 | 方法 | 认证 |
|----------|--------|------|
| Twitter/X | `@haruhunab1320/twitter-scraper` | Cookies 或登录 |
| Bluesky | AT Protocol AppView API | 无 |
| 4chan | 公开 JSON API | 无 |
| YouTube | yt-dlp CLI (+ 字幕) | 无 |
| Farcaster | Neynar API v2 | 免费密钥 |
| Telegram | t.me 网页预览抓取 | 无 |
| Wikipedia | 时事门户 API | 无 |
| GDELT | GDELT DOC 2.0 API | 无 |
| RSS / 新闻 | 约 160 个精选 feed | 无 |
| Reddit | Application-only OAuth | `REDDIT_CLIENT_ID` + `SECRET` |
| Facebook | 通过 Jina Reader 进行主页监控 | `FACEBOOK_PAGE_URLS` |
### RSS 目录(约 160 个 feed,89 个 tier-1)
包含独立媒体,加上 **19 个公共广播机构**(BBC、DW、France 24、NPR、Al Jazeera 等)以及 **14 个官方媒体**(Xinhua/CGTN、RT/Sputnik/TASS、Press TV、Anadolu、teleSUR),并标记了其所有权和受众属性。**9 个面向国内受众的 feed**(俄语和波斯语,如 RIA Novosti、TASS-ru、Lenta、Rossiyskaya Gazeta、IRNA)在接入时会进行机器翻译,同时保留原文。
### 全球事件信号源(8 个,无需密钥)
USGS(地震) · GDACS(灾害) · NASA EONET(自然事件) · NOAA/NWS(天气预警) · ACLED(冲突) · GDELT(新闻) · CoinGecko(市场) · RSS tier-1。
### 证据与关联适配器
主张验证基于 Etherscan、DexScreener、GitHub、SEC EDGAR、Wayback Machine 和 Wikipedia 进行交叉比对。下游影响关联分析接入了 Yahoo Finance、World Bank 和 FRED。
### 网络搜索(无需密钥)
使用 DuckDuckGo HTML + Google News RSS 进行查询扩充;当设置了 `BRAVE_SEARCH_API_KEY` 时,会自动使用 Brave Search API。
## 快速开始
### 前置条件
- Node.js 18+、MongoDB、Redis
- Python 3(用于 yt-dlp、sherlock)
- 可选:安装带有 MAGE 的 Memgraph 以使用图算法
```
npm install
pip install yt-dlp sherlock-project
cp .env.example .env # edit — minimum: GEMINI_API_KEY, MONGODB_URI
docker compose -f docker-compose.dev.yml up -d # MongoDB, Redis, Memgraph (MAGE)
npx nx serve api # backend → :3000
npx nx serve veritas-client # frontend → :4200
```
### 环境变量
**必填**
```
GEMINI_API_KEY= # analysis (clustering, verification, translation, refinement)
MONGODB_URI=mongodb://localhost:27017
REDIS_HOST=localhost
REDIS_PORT=6379
```
如果没有 `GEMINI_API_KEY`,应用程序依然可以运行 — 分析功能会降级为启发式/弃权模式,并会明确提示。
**可选(每一项都会解锁一项功能,并在 `/capabilities` 和 Monitor 面板中展示)**
```
TWITTER_COOKIES= # or TWITTER_USERNAME/PASSWORD/EMAIL — Twitter/X
REDDIT_CLIENT_ID= # + REDDIT_CLIENT_SECRET — Reddit (free script app)
NEYNAR_API_KEY= # Farcaster
FACEBOOK_PAGE_URLS= # Facebook page monitoring
FRED_API_KEY= # Federal Reserve data
ETHERSCAN_API_KEY= # on-chain evidence
GITHUB_TOKEN= # GitHub evidence (higher rate limit)
BRAVE_SEARCH_API_KEY= # upgrades web search ranking
MEMGRAPH_HOST= # graph database
```
## 仪表盘
- **指令 / 战术** — 主页仪表盘和 NERV 六边形战术地图(分类六边形、激增环、严重性雷达、区域滚动条)。
- **世界地图** — 带有分类/严重性过滤器和搜索飞至功能的实时全球事件 feed 交互式 3D 地球仪。
- **视角** — 叙事分歧视图:在可选时间窗口(24小时/48小时/7天)内,争议最大新闻的主从明细列表,按视角类别进行拆分。
- **搜索** — 基于能力驱动的扫描构建器,带有查询优化功能。
- **监控** — 调查、警报以及实时的系统功能面板。
- **图集** — 可复用的推理透镜提取(plugin)。
## MCP 工具
`veritas_scan` · `veritas_wait_for_scan` · `veritas_get_scan(_posts)` · `veritas_analyze_narratives` · `veritas_verify_claim` · `veritas_extract_failure_examples` · `veritas_web_search` · `veritas_refine_query` · `veritas_coverage_probe` · `veritas_recent_scans`。
## 测试
```
npx nx test analysis # ~560 tests
npx nx test ingestion # ~390 tests
npx nx test api
npx tsc --noEmit # type check
```
## 许可证
参见仓库的许可证。
标签:叙事分析, 媒体监测, 搜索引擎查询, 数据溯源, 版权保护, 自动化攻击, 舆情监测, 身份溯源, 逆向工具