AlanJie/running-location-simulator
GitHub: AlanJie/running-location-simulator
针对校园体测跑步系统的可视化轨迹编辑与加密上报全链路模拟工具,覆盖从路径绘制到接口提交的完整流程。
Stars: 0 | Forks: 0
# Running Location Simulator
## ✨ Features / 功能特性
- 🗺️ **可视化轨迹编辑** — 基于 Leaflet 地图,支持路径控制点 + 手绘两种模式
- 📍 **定位采样模拟** — 真实模拟浏览器 `geolocation` 流,支持位置抖动 / 采样间隔
- 🔐 **完整加密链** — AES-CBC + MD5 签名,与目标接口 100% 兼容
- 🌉 **双模式登录态读取** — Tauri 应用内嵌登录 / 外部 Chrome CDP 桥接(dev)
- ☁️ **OSS 上传链** — STS 取凭证 → 加密轨迹文件 → 阿里云 OSS 上传 → 回填 `record_file`
- ✅ **完整提交流程** — `getOssSts` / OSS upload / `stopRunV278` / `stopFreeRunV220` / `recordDetailV270`
- 🔄 **Replay 回归** — 快照对比 CLI,避免改动破坏链路一致性
## 📦 下载预构建版本 / Prebuilt Downloads
每次推送 `v*` tag 后会自动在 [Releases](https://github.com/AlanJie/running-location-simulator/releases) 发布**未签名**的多平台桌面构建:
| 平台 | 文件 |
|---|---|
| macOS (Apple Silicon) | `*-aarch64.dmg` |
| macOS (Intel) | `*-x64.dmg` |
| Windows | `*.exe` (NSIS) / `*.msi` |
| Linux | `*.AppImage` / `*.deb` / `*.rpm` |
## 🚀 Quick Start / 快速开始
### Prerequisites / 前置条件
- **Node.js ≥ 20**
- 一台 Windows 机器(或可启动 Chrome `--remote-debugging-port` 的环境)
- 在调试 Chrome 中已经登录目标体测系统并能正常进入跑步页
### 1. Install / 安装
git clone https://github.com/AlanJie/running-location-simulator.git
cd running-location-simulator
npm install
### 2. Configure `.env` / 配置密钥
cp .env.example .env
然后编辑 `.env`,填入 3 个密钥:
APP_AES_KEY=<16-char AES key>
APP_AES_IV=<16-char AES iv>
SIGN_SECRET=
### 3. Launch Debug Chrome / 启动调试 Chrome
在 Windows 命令行执行:
"C:\Program Files\Google\Chrome\Application\chrome.exe" ^
--remote-debugging-port=9222 ^
--user-data-dir=%TEMP%\debug-chrome-profile
在这个调试 Chrome 里登录目标体测系统并进入跑步页。
### 4. Build & Run / 构建运行
npm run build # esbuild 构建,自动注入 .env 密钥
npm start # 启动服务到 http://127.0.0.1:4173
### 5. Use the Simulator / 使用模拟器
打开浏览器访问 `http://127.0.0.1:4173`:
1. 切换到 **SSO 模式** — 自动从调试 Chrome 读取登录态和跑步配置(跑区/打卡点/规则)
2. 在地图上画路径:
- **路径控制点** 模式:单击地图逐点添加
- **手绘轨迹** 模式:按住左键拖动绘制
3. 调整 **开始时间 / 实际用时 / 平均配速**
4. 查看右侧规则面板,**全部规则项变绿**后点击 **"生成完整请求"**
5. 确认 OSS 上传成功("上传请求链"区域显示成功)
6. 点 **"真实提交 stop"** 完成提交,查看响应中的 `record_id`
## 🔧 How It Works / 工作原理
┌─────────────────────────────────────────────────────────┐
│ 浏览器登录态 │
│ │ │
│ ▼ (CDP 读取) │
│ beforeRunV260 ── 拉取跑区/打卡点/规则 │
│ │
│ ┌─ 用户在地图上画路径 │
│ │ + 速度画像 │
│ ▼ │
│ 模拟原始定位流 (含位置抖动) │
│ │ │
│ ▼ (2 秒 listener 模拟) │
│ 最终提交轨迹 (record.file) │
│ │ │
│ ▼ (AES-CBC 加密) │
│ encryptedTrack │
│ │ │
│ ▼ getOssSts → OSS 上传 │
│ record_file (相对路径) │
│ │ │
│ ▼ │
│ stopRunV278 / stopFreeRunV220 │
│ │ │
│ ▼ │
│ recordDetailV270 (详情确认) │
└─────────────────────────────────────────────────────────┘
更深入的流程拆解请阅读 [`docs/上传链路接口与实现说明.md`](./docs/上传链路接口与实现说明.md)。
## 📁 Project Layout / 项目结构
.
├── src/
│ ├── contracts/ # 类型 + 接口契约
│ ├── infrastructure/ # 技术实现 (DOM / Leaflet / crypto / state)
│ ├── domain/ # 业务规则 (geometry / auth / analysis / upload)
│ ├── application/ # 页面交互层
│ ├── verification/ # Replay 快照对比 CLI
│ ├── bootstrap/ # DI 注册
│ └── config.ts # 编译期注入的密钥 (来自 .env)
├── docs/ # 详细技术文档 (中文)
├── scripts/ # 调试用 CDP / webpack 探测脚本
├── server.js # 本地代理 (绕 CORS) + CDP 桥接
├── build.mjs # esbuild 构建 (注入 .env)
├── .env.example # 密钥模板
└── MCP.md # 调试 Chrome 启动指南
## 📜 Scripts / 脚本说明
| 命令 | 作用 |
|---|---|
| `npm run build` | esbuild 构建,自动注入 `.env` 密钥 |
| `npm start` | 构建 + 启动本地服务于 `:4173` |
| `npm run typecheck` | TypeScript 类型检查 |
| `npm run replay:generate` | 生成 Replay 快照基线 |
| `npm run replay:diff` | 对比当前生成 vs 基线 |
| `npm run replay:verify` | 验证快照一致性(CI 用) |
## 📚 Further Reading / 深入阅读
仓库 `docs/` 下有 3 份详细技术文档(中文):
- [`当前架构与业务流程说明.md`](./docs/当前架构与业务流程说明.md) — 整体分层与各服务职责
- [`上传链路接口与实现说明.md`](./docs/上传链路接口与实现说明.md) — 结束上报链路的字段来源与本地实现位置
- [`跑步界面接口翻译表.md`](./docs/跑步界面接口翻译表.md) — 12 个核心接口的函数名、路径、字段对照
## 📄 License
MIT — Use at your own risk.
仅作技术研究分享,**对一切违规使用造成的后果,作者概不负责**。
标签:AES-CBC, API重放, Chrome CDP, GPS欺骗, IP 地址批量处理, Leaflet, MD5签名, MITM代理, STS凭证, Tauri, 位置模拟, 体测作弊, 加密上报, 地图可视化, 接口联调, 校园体育, 校园跑, 桌面应用, 浏览器自动化, 自动化攻击, 跑步轨迹模拟器, 路径编辑, 轨迹生成, 运动打卡, 阿里云OSS