oxidezap/whatspec
GitHub: oxidezap/whatspec
从 WhatsApp Web 的 JS bundle 中提取协议接口并生成语言无关的 IR,供第三方客户端或库构建使用。
Stars: 5 | Forks: 0
# whatspec
**从 WhatsApp Web 的 JavaScript bundle 中提取其协议接口,并生成语言无关的 IR(以及参考 Rust 代码)—— 供任何客户端/库在此基础上构建。**
WhatsApp Web 将其整个协议(IQ stanzas、protobuf schemas、GraphQL operations、app-state actions、feature flags、wire enums)编译到一个巨大的、经过压缩的 JS bundle 中。`whatspec` 使用 [`oxc`](https://oxc.rs) AST 解析该 bundle,并在 [`generated/`](generated) 下生成干净、带版本号且确定性的中间表示(IR)。该 IR 就是契约 —— 可以从 Rust、Go、TypeScript、Python 或任何其他语言来消费它。仓库中提交的 Rust 模块只是一个*参考*消费者,而不是核心目的。
## 它提取的内容
| 领域 | `generated/…` | 它是什么 |
|---|---|---|
| **iq** | `iq/index.json` (+ Rust) | `` 请求构建器和响应解析器,按 namespace 划分 |
| **proto** | `proto/WAProto.proto` | protobuf schemas,以 `.proto` 文件的形式呈现 |
| **mex** | `mex/index.json` (+ Rust) | Relay/GraphQL persisted operations(doc id、kind、类型化变量/响应) |
| **appstate** | `appstate/index.json` (+ Rust) | app-state (syncd) action schemas 和索引 |
| **abprops** | `abprops/index.json` (+ Rust) | A/B-props feature-flag 注册表(约 1.7k 个 flags:code、type、default) |
| **enums** | `enums/index.json` (+ Rust) | wire-enum 目录(nack codes、chat/receipt types 等) |
每个领域都会在 `generated/schema/` 下附带一个 JSON Schema,顶层的 `generated/manifest.json` 会记录 WhatsApp 版本、各领域的计数、内容哈希以及提取诊断信息。
## 快速开始
```
# 获取当前的 web.whatsapp.com bundle 并(重新)生成所有内容:
cargo run --release -p whatspec -- update
# …或处理你已有的 bundle(离线):
cargo run --release -p whatspec -- update --bundles ./my-bundles
# Version-keyed cache:当远程 version 未更改时跳过下载:
cargo run --release -p whatspec -- update --cache .wa-cache
# 比较两个生成的输出(例如跨越 WhatsApp version bump):
cargo run --release -p whatspec -- diff old-generated/ generated/
```
`update` 默认是安全的:如果任何领域的覆盖率下降,它会拒绝覆盖已提交的输出(传入 `--allow-shrink` 可接受真实的缩减),并且如果某个领域没有提取到任何内容,它会明确报错。
## 消费 IR
中立产物是 `generated//index.json`,由 `generated/schema/.schema.json` 进行验证。将你自己的 codegen 指向这些文件 —— 这些 schema 在 WhatsApp 发布的各个版本中都是稳定的(`schemaVersion`),独立于不断变化的 `waVersion`。
Rust 消费者也可以直接使用已提交的参考模块;它们仅依赖于 `serde`,并且支持 tree-shakeable(你只需为你引用的内容买单)。
## 设计
- **确定性:** 相同的 bundle 始终生成字节一致的输出(稳定的排序键,没有偶然的顺序)。
- **无 C 依赖:** 纯 Rust 实现(通过 rustls + RustCrypto 进行 TLS,通过 `sha2` 进行哈希处理),在 CI 中强制执行。
- **WASM 友好:** IR crate 和 bundle 发现层可编译为 `wasm32`,因此基于浏览器的 fetcher 可以复用它们。
## 免责声明
`whatspec` 是一个独立项目,**不附属于、也不受 WhatsApp LLC 或 Meta 认可或赞助**。“WhatsApp” 是其各自所有者的商标,此处仅出于描述性目的使用,用于标识本工具与之互操作的协议。
## 许可证
MIT © 2025 João Lucas de Oliveira Lopes —— 详见 [LICENSE](LICENSE)。
标签:AST解析, Rust, WhatsApp协议, 中间表示, 云资产清单, 协议提取, 可视化界面, 网络流量审计, 逆向工程, 通知系统