breaching/krill-watch
GitHub: breaching/krill-watch
针对工业磷虾捕捞、捕鲸和 IUU 非法捕鱼船队的海事 OSINT 仪表板,整合 AIS、GFW 交汇与 OpenSanctions 制裁数据,提供 CCAMLR 转运评分和每周调查报告生成能力。
Stars: 0 | Forks: 0
# krill-watch
针对工业磷虾、捕鲸和 IUU(非法、不报告和不管制)捕鱼船队的独立海事 OSINT 仪表板。
[](https://github.com/breaching/krill-watch/actions/workflows/ci.yml)
[](LICENSE)
[](requirements-core.txt)
[](web/package.json)


## 功能简介
四项活动共享一个 pipeline。
- CCAMLR 公约区的南极磷虾。Aker BioMarine 船队和中国船队。
- 商业捕鲸。日本的 Kangei Maru,冰岛的 Hvalur 8 和 9。
- 加拉帕戈斯群岛。聚集在保护区边界的中国鱿鱼钓船。
- 西非。塞内加尔、毛里塔尼亚和几内亚专属经济区 (EEZ) 内的中国和俄罗斯超级拖网渔船。
该工具接收公开的 AIS 数据、Global Fishing Watch 的交汇和空白事件以及官方注册信息。它会标记跨越保护区边界的船只,对滚动交汇运行六信号转运评分器,并在支持法语和英语的 Next.js 仪表板上发布结果。
## 从哪里开始看
三个文件包含了大部分技术信息:
- [`calibration.md`](calibration.md) :冻结的评分权重 v0.4.2,包含针对 CM 10-09 / 10-04 / 10-06 的逐信号论证和验证案例集。
- [`INVESTIGATOR_PLAYBOOK.md`](INVESTIGATOR_PLAYBOOK.md) :为 CPWF 分析师提供的三个完整演练(周一分类、交汇深入调查、档案准备)。
- `python main.py --mode transhipment-review --since 7d` :生成每周调查员的 HTML 报告。此文件独立完整,可通过电子邮件发送,打印为 A4 尺寸,或存档在调查案卷旁。
## 界面截图
Live tracker. MapLibre dark basemap. Filter panel for severity, zone overlays (CCAMLR areas, proposed MPAs), FIRMS hotspots, NASA satellite passes. Click a vessel to open its dossier.
|
Vessel dossier. One page per vessel. Severity badge, current zones, 30-day MapLibre track with a scrubbable timeline, event log filtered by zone entry, severity change, AIS gap, AIS regain.
|
## 本地运行
```
git clone https://github.com/breaching/krill-watch.git
cd krill-watch
# Python deps (FastAPI, DuckDB, shapely)
pip install -r requirements-core.txt
# Node deps (root launcher 和 web/)
npm run setup
# 启动两者:API 在 :8000,UI 在 :3000
npm run dev
```
打开 `http://localhost:3000/fr`。
可选环境变量。如果没有提供这些变量,UI 会降级使用种子数据。
| 变量 | 用途 |
|---|---|
| `GFW_API_KEY` | Global Fishing Watch v3。启用交汇和空白事件充实功能。 |
| `AISSTREAM_API_KEY` | AISStream.io WebSocket。启用实时 AIS。 |
| `DISCORD_WEBHOOK_URL` | Discord 警报分发。 |
| `SLACK_WEBHOOK_URL` | Slack 警报分发。 |
`GFW_REFRESH_HOURS`、`DISABLE_WORKERS` 和 `LOG_LEVEL` 在 [`server/workers.py`](server/workers.py) 中有文档说明。
仅 API:`npm run dev:api`。针对现有 API 的 UI:`npm run dev:web-only`。
## 技术栈
**后端 (Backend)。** 基于 Python 3.11 的 FastAPI 和 DuckDB。位于 `data/krill_watch.duckdb` 的单个文件存储了位置、区域转换、船只状态、自动事件和贡献。后台 worker 负责 AISStream 订阅和 GFW 配置文件刷新。
关键文件:[`server/app.py`](server/app.py)、[`server/store.py`](server/store.py)、[`server/workers.py`](server/workers.py)。
**前端 (Frontend)。** 使用 TypeScript 的 Next.js 15 App Router。使用 MapLibre GL 显示地图和 dark-matter 底图。Server 组件在页面加载时获取 API。Client 组件订阅 `/api/stream` 以获取 SSE 更新。
关键文件:[`web/app/[locale]/page.tsx`](web/app/%5Blocale%5D/page.tsx)、[`web/lib/krill-watch.ts`](web/lib/krill-watch.ts)。
**检测器 (Detector)。** [`src/transhipment_detector.py`](src/transhipment_detector.py) 和 [`src/reefer_watch.py`](src/reefer_watch.py)。校准版本 v0.4.2。权重和验证案例位于 [`calibration.md`](calibration.md)。
本地开发不需要外部服务。船只注册表、CCAMLR 区域 GeoJSON 和监视列表作为静态 JSON 随附在 [`config/`](config/) 中。
```
krill-watch/
├── server/ FastAPI app, DuckDB store, AIS and GFW workers
├── src/ Shared library: detector, monitor, profiler, notifier
├── web/ Next.js investigator UI
├── config/ Vessel registry, zone GeoJSONs, watchlists
├── tests/ pytest suite
├── scripts/ Utilities (zone builder, fleet verifier, seed)
├── docs/ Screenshots, audit notes, integration plans
└── data/ Runtime DuckDB and cache (gitignored)
```
## 转运审查
每周的调查交付物。对 CCAMLR 公约区内可疑的海上转运进行多信号审查。
```
python main.py --mode transhipment-review --since 7d --out output/transhipments_$(date +%Y-W%V).html
```
HTML 报告是自包含的。可以作为电子邮件附件发送、打印为 A4 尺寸,或存档在调查案卷旁。`/transhipments` 页面通过日期和等级过滤器以交互方式提供相同的视图。
等级阈值。得分达到或超过 0.50 为 FLAGGED。得分达到或超过 0.75 为 CRITICAL。最高可达:0.90。
信号权重 (v0.4.2):
| 信号 | 权重 | 参考 |
|---|---|---|
| 运输船不在 CM 10-09 授权名单中 | 0.25 | CM 10-09 |
| 交汇期间出现 AIS 盲区 | 0.20 | CM 10-04 |
| 命中 IUU 名单或受到制裁 | 0.20 | CM 10-06/07, OFAC SDN |
| 位于授权转运区域之外 | 0.15 | CM 10-09 空间 |
| 便利旗 (Flag of Convenience) | 0.05 | ITF FOC 列表 |
| 持续时间超过 6 小时 | 0.05 | 操作上下文 |
权重论证、验证案例和重新校准程序位于 [`calibration.md`](calibration.md)。
为评分器提供数据的实时来源。
- **OpenSanctions** ([`src/sanctions_client.py`](src/sanctions_client.py))。在构建船只时查询 SDN、EU、UK、UN、FOC 和 NCP-IUU 匹配项。冻结的 `config/ofac_fishing_sanctions.json` 是在无法访问 OpenSanctions API(隔离网络运行、无网络的每周摘要作业)时的离线备用方案。
- **GFW v3 事件区域块** ([`src/osint_profiler._summarise_event_regions`](src/osint_profiler.py))。根据 MPA、禁捕区、FAO 和 RFMO 地理围栏对捕鱼事件进行分类。`config/ccamlr_areas.geojson` 中简化的 bbox 仅作为 AIS 盲区区域分类的备用方案。
- **Marine Regions** EEZ、GMR 和 IWC 保护区 GeoJSON 位于 `config/maritime_zones/`。涵盖加拉帕戈斯、塞内加尔、毛里塔尼亚、几内亚和 IWC 南大洋鲸鱼保护区。
已知空白。`config/ccamlr_transhipment_authorized.json` 为空,因为 CM 10-09 授权运输船名单位于 CCAMLR 成员国门户之后。`config/reefer_watchlist.json` 涵盖了在我们测试用例中使用的 Aker BioMarine 声明的运输船。当交汇无法与任一列表匹配时,报告会显示警告横幅,而不是断言其未获授权。
## 调查员手册
[`INVESTIGATOR_PLAYBOOK.md`](INVESTIGATOR_PLAYBOOK.md) 涵盖了每周船队分类、交汇深入调查以及为外部合作伙伴准备档案的方法。
## 状态
| 功能 | 状态 | 备注 |
|---|---|---|
| 实时 AIS 分类仪表板 | 已发布 | 分类、船队地图、船只详情、转运 UI |
| 转运检测器 | 已发布 | v0.4.2,六个信号,107 项测试,每周 HTML 报告 |
| 每周 HTML 审查报告 | 已发布 | `python main.py --mode transhipment-review` |
| 调查员 UI (`web/`) | 已发布 | 主分类,`/vessels`,`/vessels/{slug}`,`/transhipments` |
| 数据集编译 | 实时且精选 | OpenSanctions 实时,GFW 原生 MPA/RFMO 区域,Marine Regions EEZ。CM 10-09 授权运输船名单仍需 CCAMLR 成员国访问权限。 |
| RPi / 离线船只模式 | 已推迟 | 架构已记录,硬件集成未实现 |
## 贡献
提交 Issue 或 Pull Request。请遵循 [Conventional Commits](https://www.conventionalcommits.org/)(`feat:`、`fix:`、`docs:`、`chore:`)。提交前:在 `web/` 目录下运行 `npx tsc --noEmit` 并且 `python -m pytest tests/` 必须通过。CI 门禁会强制执行这两项检查。
当 UI 发生变化时刷新 README 截图。在 `npm run dev` 运行的情况下:
```
cd web
node scripts/capture-readme-screenshots.mjs
```
输出将存放在 `docs/screenshots/` 中。在同一 PR 中提交重新生成的 PNG。该脚本的文档记录在 [`docs/SCREENSHOTS.md`](docs/SCREENSHOTS.md)。
## 许可证
[GPL-3.0](LICENSE)。
## 作者
个人、独立项目。由 [CPWF](https://www.paulwatsonfoundation.org/) 和 [Sea Shepherd](https://seashepherd.org/) 的支持者构建。与这两个组织没有官方隶属关系。
标签:AIS, AIS缺口, AV绕过, CCAMLR, DuckDB, FastAPI, GFW, Global Fishing Watch, GNU通用公共许可证, IUU, NGO工具, Node.js, OpenSanctions, Python, 仪表板, 保护区边界, 全栈, 南极海洋生物资源养护委员会, 南极磷虾, 合规审查, 后端开发, 工业捕鱼, 情报分析, 捕鲸, 数据管道, 无后门, 海事OSINT, 海洋环境保护, 海洋生态, 海洋调查, 渔业监管, 环保科技, 网络诊断, 船舶自动识别系统, 调查工具, 转运评分, 软件工程, 逆向工具, 非法捕捞