frankea/adsbtrack
GitHub: frankea/adsbtrack
一款离线聚合多源 ADS-B 历史数据并结构化航班记录的分析工具。
Stars: 5 | Forks: 0
# adsbtrack
从多个追踪网络获取历史 ADS-B 轨迹数据,并将其转换为结构化的飞行历史记录。给它一个 ICAO 十六进制码和日期范围,它将获取每一天的轨迹数据,提取单个航班,匹配起降坐标到机场,对每次降落按质量进行分类,并提供旅行模式统计信息。
专为 OSIST 和航空爱好者设计,旨在超越实时追踪,深入挖掘飞机在过去数月或数年中实际飞行过的区域——提供足够丰富的信号质量元数据以确保结果可信。
## 安装
需要 Python 3.12+。使用 [uv](https://github.com/astral-sh/uv):
```
git clone https://github.com/frankea/adsbtrack.git
cd adsbtrack
uv sync
```
## 用法
### 获取追踪数据
```
uv run python -m adsbtrack.cli fetch --hex a66ad3 --start 2020-01-01
```
下载每日追踪数据并自动提取航班。选项:`--source`(adsbx、adsbfi、airplaneslive、adsblol、theairtraffic、opensky)、`--end`、`--rate`、`--db`、`--tail`(将 N 号转换为十六进制)。跳过已获取的日期。WAL 模式允许多个提取任务并行运行。
### 查看统计信息
```
uv run python -m adsbtrack.cli status --hex a66ad3
```
```
Status for a66ad3
Registration: N512WB
Type: Pilatus PC-XII 45
Date range: 2020-01-01 to 2026-04-10
Days w/ data: 392
Total flights: 628
Data quality:
Confirmed landings: 361 (54%)
Signal lost: 74 (11%)
Utilization:
Total hours: 1843.5
Avg flight: 166.4 min
Distinct airports: 47
```
展示数据质量分布、任务类型占比、利用情况汇总、夜间/紧急指示以及主要机场信息。
### 查看航班历史
```
uv run python -m adsbtrack.cli trips --hex a66ad3 --from 2026-03-27
```
```
Flights for a66ad3
Date | From | To | Duration | Callsign | Mission | Conf | Type
2026-03-27 | 67FL | KSPG | 10m | N512WB | XFER | 76% | OK
2026-03-27 | KSPG | KHKY | 1h 53m | N512WB | XFER | 89% | OK
2026-03-28 | KHKY | KVNC | 2h 41m | N512WB | XFER | 86% | OK
2026-03-29 | KSPG | ~KFXE | 12m | N512WB | | 0% | DROP
```
`Conf` 表示降落置信度(0-100%),`Type` 表示降落分类(OK/SIG LOST/DROP/UNCERT/ALT ERR)。选项:`--from`、`--to`、`--airport`。
### 重新提取航班
```
uv run python -m adsbtrack.cli extract --hex a66ad3 --reprocess
```
根据原始追踪数据重建航班表,适用于代码变更后重新处理。
## FAA 飞机注册信息
加载 FAA 批量注册文件(`ReleasableAircraft.zip`),使十六进制码能够解析为注册人姓名、地址、证书日期以及注销历史。使用 `faa` 额外依赖安装,以便绕过 Akamai TLS 指纹屏蔽:
```
uv sync --extra faa
uv run python -m adsbtrack.cli registry update
```
如果不安装 `curl_cffi`(即 `faa` 额外依赖),在线下载通常会返回 503。可改用浏览器下载 ZIP 文件,并将命令指向该文件:
```
uv run python -m adsbtrack.cli registry update --zip /path/to/ReleasableAircraft.zip
```
然后查询:
```
uv run python -m adsbtrack.cli registry lookup --hex a66ad3 # full record by hex
uv run python -m adsbtrack.cli registry lookup --tail N512WB # or by N-number
uv run python -m adsbtrack.cli registry owner --name "BANK OF UTAH" # LIKE match
uv run python -m adsbtrack.cli registry address --state MT --city BILLINGS
```
加载注册表后,`status` 命令会在行内显示 FAA 注册人、地址和证书信息,并标记仅出现在 `faa_deregistered` 中的飞机。
## ACARS 摄入
从 [airframes.io](https://app.airframes.io) 获取某架飞机的 ACARS / VDL2 / HFDL 消息,并将 OOOI 事件关联到其航班:
```
export AIRFRAMES_API_KEY=... # or put "airframesApiKey" in credentials.json
uv run python -m adsbtrack.cli acars --hex a66ad3 --start 2026-01-01
```
提取器会将十六进制码解析为 airframes.io 的数字机身 ID,遍历指定范围内的每个航班,并插入原始消息。当 OOOI 标签(14 / 44 / 4T / H1)位于航班时间窗口内时,解析器会填充 `acars_out`、`acars_off`、`acars_on`、`acars_in` 字段。
`trips` 会显示 ACARS 列及消息计数,并在存在 OOOI 信息时显示绿色 OOOI 标识;`status` 会为每架飞机显示 ACARS 汇总块。
## 十六进制码交叉引用增强
将 FAA + [Mictronics](https://github.com/Mictronics/readsb-protobuf/tree/dev/webapp/src/db) + [hexdb.io](https://hexdb.io) 合并到单个 `hex_crossref` 表中,使数据库中的每个十六进制码都能获得最佳匹配的识别信息,并标记已知军用分配区间的飞机。
```
uv run python -m adsbtrack.cli enrich all --download-mictronics # backfill everything
uv run python -m adsbtrack.cli enrich hex --hex a66ad3 # one at a time
uv run python -m adsbtrack.cli mil hex --hex ae1234 # check mil range
uv run python -m adsbtrack.cli mil scan # flag every mil hex
```
合并顺序为:FAA(优先)→ Mictronics → hexdb.io;增强器会标记冲突以便查看来源差异。25 个有充分文档记录的军用分配范围(如美国国防部、英国皇家空军、德国空军、日本航空自卫队、澳大利亚皇家空军、加拿大皇家空军、俄罗斯空天军等)在数据库初始化时自动加载;可通过向 `mil_hex_ranges` 表添加自定义行来扩展覆盖范围。
## 查找十六进制码
直接转换美国 N 号:
```
uv run python -m adsbtrack.cli lookup --tail N512WB
```
或对任意命令使用 `--tail` 替代 `--hex`:
```
uv run python -m adsbtrack.cli fetch --tail N512WB --start 2020-01-01
```
外部查询站点:[aircraftdata.org](https://aircraftdata.org)、[FAA Aircraft Registry](https://registry.faa.gov/aircraftinquiry)、[ADS-B Exchange](https://globe.adsbexchange.com/)
## 生成追踪 URL
```
uv run python -m adsbtrack.cli links --hex a66ad3
```
```
2026-03-27 67FL -> KSPG https://globe.adsbexchange.com/?icao=a66ad3&showTrace=2026-03-27
2026-03-27 KSPG -> KHKY https://globe.adsbexchange.com/?icao=a66ad3&showTrace=2026-03-27
```
使用 `--urls-only` 可输出每行一个原始 URL(无前缀或标记),便于用于 shell 循环管道。
## 多数据源
从不同网络获取数据以获得更好覆盖:
```
uv run python -m adsbtrack.cli fetch --hex a66ad3 --source adsbfi --start 2020-01-01
```
追踪数据在提取过程中会自动合并。
| 来源 | 标志 | 说明 |
|------|------|------|
| [ADS-B Exchange](https://globe.adsbexchange.com/) | `--source adsbx` | 默认 |
| [adsb.fi](https://globe.adsb.fi/) | `--source adsbfi` | |
| [airplanes.live](https://globe.airplanes.live/) | `--source airplaneslive` | |
| [adsb.lol](https://adsb.lol/) | `--source adsblol` | |
| [TheAirTraffic](https://globe.theairtraffic.com/) | `--source theairtraffic` | |
| [OpenSky Network](https://opensky-network.org/) | `--source opensky` | 需设置 `OPENSKY_CLIENT_ID` 与 `OPENSKY_CLIENT_SECRET` 环境变量 |
| 自定义 | `--url ` | 任何 readsb globe_history 实例 |
## 文档
面向贡献者和分析师的详细参考文档:
- **[数据库架构](docs/schema.md)** - 所有表(traces / flights / registry / stats / airports / helipads / FAA registry / ACARS / hex crossref / mil ranges)的完整列说明
- **[功能与评分](docs/features.md)** - 降落类型、置信度评分算法、每个派生列、任务分类规则、信号预算、ACARS OOOI、来源分布
- **[内部机制](docs/internals.md)** - 提取器如何工作:追踪合并、航班提取状态机、片段拼接、机场匹配、FAA 注册表解析、十六进制交叉引用合并
## 开发
```
uv sync --extra dev
uv run pytest
uv run ruff check .
uv run ruff format .
uv run mypy adsbtrack
```
CI 在推送和拉取请求时运行(Python 3.12 与 3.13)。
## 注意事项
- 数据可用性取决于 ADS-B 接收机覆盖范围。飞越海洋或偏远地区的航班会出现数据缺口,表现为 `signal_lost` 或 `dropped_on_approach`,而非缺失航班。
- 不同接收网络覆盖范围不同,因此从多个来源获取可获得最佳结果。
- 限流策略自适应:遇到 429 会增加延迟,连续成功会逐步恢复。
- `extract --reprocess` 会清除并从头重建所有航班表,数据库架构会自动迁移。
标签:ADS-B, DNS解析, ESC4, ICAO hex, OSINT, Python, Python 3.12+, SQLite, UV工具链, WAL模式, 信号质量元数据, 历史轨迹, 并行处理, 开源项目, 数据库, 数据提取, 数据质量分类, 旅行模式统计, 无后门, 机场匹配, 航班分类, 航班统计, 航空数据, 航空数据挖掘, 航空爱好者, 起降坐标, 起降机场识别, 逆向工具, 飞机监控, 飞行历史, 飞行追踪