chore: 根目录非 SDK 迁入开发文档与机擎,补项目总览图
将 docs/tools/截图/挂载 Skill 等从根目录归位到 8部署/6测试/机擎阿服; 修复 publish_wiki、sync_when_online、run_live_verification 路径; 新增 00-项目总览 与 Obsidian 配色扩展;gitignore 仅忽略根 /scripts/。 Co-authored-by: Cursor <cursoragent@cursor.com>
2
.gitignore
vendored
@@ -3,7 +3,7 @@
|
||||
|
||||
# 不上传的目录
|
||||
.cursor/
|
||||
scripts/
|
||||
/scripts/
|
||||
*.py[cod]
|
||||
__pycache__/
|
||||
.idea/
|
||||
|
||||
24
.obsidian/snippets/workphone-devdoc.css
vendored
@@ -97,6 +97,30 @@
|
||||
color: #F9A825 !important;
|
||||
font-weight: 600;
|
||||
}
|
||||
.nav-folder-title[data-path^="开发文档/6、测试/scripts"] > .nav-folder-title-content {
|
||||
color: #FFB300 !important;
|
||||
}
|
||||
.nav-folder-title[data-path^="开发文档/6、测试/screenshots"] > .nav-folder-title-content {
|
||||
color: #FF8F00 !important;
|
||||
}
|
||||
.nav-folder-title[data-path="开发文档/00-项目总览"] > .nav-folder-title-content {
|
||||
color: #1565C0 !important;
|
||||
font-weight: 700;
|
||||
}
|
||||
.nav-folder-title[data-path="开发文档/8、部署/04-Gitea门户"] > .nav-folder-title-content {
|
||||
color: #33691E !important;
|
||||
}
|
||||
.nav-folder-title[data-path="机擎"] > .nav-folder-title-content {
|
||||
color: #6A1B9A !important;
|
||||
font-weight: 600;
|
||||
}
|
||||
.nav-folder-title[data-path^="机擎/"] > .nav-folder-title-content {
|
||||
color: #8E24AA !important;
|
||||
}
|
||||
.nav-folder-title[data-path="sdk"] > .nav-folder-title-content {
|
||||
color: #D84315 !important;
|
||||
font-weight: 600;
|
||||
}
|
||||
.nav-folder-title[data-path="开发文档/平台分析"] > .nav-folder-title-content {
|
||||
color: #AD1457 !important;
|
||||
font-weight: 600;
|
||||
|
||||
102
.obsidian/workspace.json
vendored
@@ -13,12 +13,12 @@
|
||||
"state": {
|
||||
"type": "markdown",
|
||||
"state": {
|
||||
"file": "开发文档/2、架构/03-通道与设备/Hook通道与多设备多服务器架构.md",
|
||||
"file": "开发文档/9、手册/工作手机·五图总览与使用手册.md",
|
||||
"mode": "source",
|
||||
"source": false
|
||||
},
|
||||
"icon": "lucide-file",
|
||||
"title": "Hook通道与多设备多服务器架构"
|
||||
"title": "工作手机·五图总览与使用手册"
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -94,7 +94,7 @@
|
||||
"state": {
|
||||
"type": "backlink",
|
||||
"state": {
|
||||
"file": "开发文档/2、架构/images/02-控制通道/本地控制模式_5_scrcpy可视化控制模式.png",
|
||||
"file": "开发文档/2、架构/本地控制模式_5_scrcpy可视化控制模式.png",
|
||||
"collapseAll": false,
|
||||
"extraContext": false,
|
||||
"sortOrder": "alphabetical",
|
||||
@@ -113,7 +113,7 @@
|
||||
"state": {
|
||||
"type": "outgoing-link",
|
||||
"state": {
|
||||
"file": "开发文档/2、架构/images/02-控制通道/本地控制模式_5_scrcpy可视化控制模式.png",
|
||||
"file": "开发文档/2、架构/本地控制模式_5_scrcpy可视化控制模式.png",
|
||||
"linksCollapsed": false,
|
||||
"unlinkedCollapsed": true
|
||||
},
|
||||
@@ -156,7 +156,7 @@
|
||||
"state": {
|
||||
"type": "outline",
|
||||
"state": {
|
||||
"file": "开发文档/2、架构/images/02-控制通道/本地控制模式_5_scrcpy可视化控制模式.png",
|
||||
"file": "开发文档/2、架构/本地控制模式_5_scrcpy可视化控制模式.png",
|
||||
"followCursor": false,
|
||||
"showSearch": false,
|
||||
"searchQuery": ""
|
||||
@@ -183,53 +183,53 @@
|
||||
"bases:新建数据库": false
|
||||
}
|
||||
},
|
||||
"active": "214e9888679abd96",
|
||||
"active": "dcfc7855fc8fae84",
|
||||
"lastOpenFiles": [
|
||||
"开发文档/2、架构/images/01-整体总览/工作手机项目目录总览.png",
|
||||
"开发文档/00-项目总览/README.md",
|
||||
"开发文档/8、部署/04-Gitea门户/README.md",
|
||||
"开发文档/6、测试/screenshots/README.md",
|
||||
"开发文档/6、测试/scripts/README.md",
|
||||
"开发文档/6、测试/README.md",
|
||||
"开发文档/6、测试/scripts/legacy/real_class_discovery_20260518.json",
|
||||
"开发文档/6、测试/scripts/legacy/hook_find_send_20260518.json",
|
||||
"开发文档/6、测试/scripts/legacy/debug_data_20260518.json",
|
||||
"开发文档/6、测试/scripts/legacy/db_full_scan_20260518.json",
|
||||
"开发文档/6、测试/scripts/legacy/verification_v8fix_results.json",
|
||||
"开发文档/6、测试/scripts/legacy/verification_v8_results.json",
|
||||
"开发文档/6、测试/scripts/legacy/verification_v6_results.json",
|
||||
"开发文档/6、测试/scripts/legacy/verification_v5_results.json",
|
||||
"开发文档/6、测试/scripts/legacy/verification_v4_20260518.json",
|
||||
"开发文档/6、测试/scripts/legacy/verification_screenshot_v2_20260518.json",
|
||||
"开发文档/6、测试/screenshots/test_img/t.png",
|
||||
"开发文档/6、测试/screenshots/verification_110/系统_Hook状态_get_wechat_version_1779086290.png",
|
||||
"开发文档/6、测试/screenshots/verification_110/系统_Hook状态_get_hook_status_1779086288.png",
|
||||
"开发文档/6、测试/screenshots/verification_110/系统_Hook状态_get_process_info_1779086289.png",
|
||||
"开发文档/6、测试/screenshots/verification_110/H39_设备信息_get_storage_info_1779086285.png",
|
||||
"开发文档/6、测试/screenshots/verification_110/H39_设备信息_get_network_info_1779086286.png",
|
||||
"开发文档/6、测试/screenshots/verification_110/H36_公众号_get_official_accounts_1779086283.png",
|
||||
"开发文档/6、测试/screenshots/verification_110/H39_设备信息_get_device_info_1779086284.png",
|
||||
"开发文档/6、测试/screenshots/verification_110/H35_注册登录_get_sim_phone_1779086281.png",
|
||||
"开发文档/6、测试/screenshots/verification_110/H35_注册登录_check_login_state_1779086280.png",
|
||||
"机擎/阿服/local-mount-sync/SKILL.md",
|
||||
"开发文档/8、部署/04-Gitea门户/wiki-gitea/架构一览.md",
|
||||
"开发文档/8、部署/04-Gitea门户/wiki-gitea/更新动态.md",
|
||||
"开发文档/8、部署/04-Gitea门户/wiki-gitea/快速开始.md",
|
||||
"开发文档/8、部署/04-Gitea门户/wiki-gitea/完整整合手册.md",
|
||||
"开发文档/8、部署/04-Gitea门户/wiki-gitea/下载中心.md",
|
||||
"开发文档/8、部署/04-Gitea门户/wiki-gitea/Home.md",
|
||||
"开发文档/8、部署/04-Gitea门户/wiki-gitea/Hook与Frida.md",
|
||||
"开发文档/8、部署/04-Gitea门户/gitea/WIKI_SYNC.md",
|
||||
"开发文档/8、部署/04-Gitea门户/gitea/RELEASES.md",
|
||||
"开发文档/8、部署/04-Gitea门户/gitea/README.md",
|
||||
"开发文档/8、部署/04-Gitea门户/gitea/PROJECTS.md",
|
||||
"开发文档/8、部署/04-Gitea门户/gitea/PACKAGES.md",
|
||||
"资料/archive/README.md",
|
||||
"local-mount-sync/SKILL.md",
|
||||
"docs/gitea/PROJECTS.md",
|
||||
"docs/gitea/PACKAGES.md",
|
||||
"开发文档/2、架构/03-通道与设备/Hook通道与多设备多服务器架构.md",
|
||||
"开发文档/9、手册/04-专项/README.md",
|
||||
"开发文档/9、手册/03-验证/README.md",
|
||||
"开发文档/9、手册/02-操作指南/README.md",
|
||||
"开发文档/9、手册/04-专项/安装前配置检查规范.md",
|
||||
"开发文档/9、手册/04-专项/会议电视192.168.0.5接入说明.md",
|
||||
"开发文档/9、手册/04-专项/设备端Agent安装与公司设备说明.md",
|
||||
"开发文档/9、手册/03-验证/微信消息E2E验证指南.md",
|
||||
"开发文档/9、手册/02-操作指南/使用与落地方案.md",
|
||||
"开发文档/9、手册/02-操作指南/工作手机·一键接入与存客宝对接操作手册.md",
|
||||
"开发文档/9、手册/02-操作指南/SDK操作手册.md",
|
||||
"开发文档/9、手册/04-专项",
|
||||
"开发文档/9、手册/03-验证",
|
||||
"开发文档/9、手册/02-操作指南",
|
||||
"开发文档/7、数据库/images",
|
||||
"开发文档/7、数据库/02-规范/数据库管理规范.md",
|
||||
"开发文档/7、数据库/02-规范",
|
||||
"开发文档/7、数据库/01-设计/数据库设计文档.md",
|
||||
"开发文档/7、数据库/01-设计",
|
||||
"开发文档/4、前端/images",
|
||||
"开发文档/4、前端/03-工具/v0配置.md",
|
||||
"开发文档/4、前端/03-工具",
|
||||
"开发文档/4、前端/02-管理端/管理端前端开发规范(毛玻璃风格).md",
|
||||
"开发文档/4、前端/02-管理端",
|
||||
"开发文档/4、前端/01-通用规范/前端开发规范.md",
|
||||
"开发文档/4、前端/01-通用规范",
|
||||
"开发文档/3、原型/01-规范/原型设计规范.md",
|
||||
"开发文档/1、需求/images/README.md",
|
||||
"开发文档/1、需求/03-调研/README.md",
|
||||
"开发文档/1、需求/02-业务/README.md",
|
||||
"开发文档/1、需求/01-概述/README.md",
|
||||
"开发文档/1、需求/03-调研/技术调研与方案选型.md",
|
||||
"开发文档/1、需求/02-业务/业务需求.md",
|
||||
"开发文档/1、需求/01-概述/项目概述.md",
|
||||
"开发文档/10、项目管理/03-计划与专项/README.md",
|
||||
"开发文档/10、项目管理/02-测试报告/README.md",
|
||||
"开发文档/8、部署/03-运维同步/README.md",
|
||||
"开发文档/2、架构/images/02-控制通道/本地控制模式_3_Agent_WebSocket远控模式.png",
|
||||
"开发文档/2、架构/images/04-防封/防封服务端核心能力拆细图.png",
|
||||
"开发文档/2、架构/images/04-防封/防封模块架构图.png",
|
||||
"开发文档/2、架构/images/03-微信与Hook/Hook与服务器交互流程图.png",
|
||||
"开发文档/2、架构/images/03-微信与Hook/设备与服务器交互流程_微信控制.png",
|
||||
"开发文档/2、架构/images/02-控制通道/本地控制模式_5_scrcpy可视化控制模式.png",
|
||||
"开发文档/2、架构/images/02-控制通道/本地控制模式_4_AI_Agent自然语言模式.png",
|
||||
"开发文档/2、架构/images/02-控制通道/本地控制模式_3_Agent_WebSocket远控模式.png",
|
||||
"开发文档/2、架构/images/02-控制通道/本地控制模式_2_ADB静默控制模式.png",
|
||||
"开发文档/2、架构/images/02-控制通道/本地控制模式_1_Hook_Frida模式.png"
|
||||
"开发文档/9、手册/03-验证/README.md"
|
||||
]
|
||||
}
|
||||
13
README.md
@@ -5,8 +5,9 @@
|
||||
| 入口 | 地址 |
|
||||
|------|------|
|
||||
| **📖 完整整合手册(必读)** | [开发文档/9、手册/工作手机·五图总览与使用手册.md](开发文档/9、手册/工作手机·五图总览与使用手册.md) · `./开发文档/9、手册/open_handbook.sh` |
|
||||
| **🗂️ 项目目录总览** | [开发文档/00-项目总览/README.md](开发文档/00-项目总览/README.md) |
|
||||
| **本仓库(Gitea)** | http://open.quwanzhi.com:3000/fnvtk/workphone-sdk |
|
||||
| **百科(Wiki)** | 仓库内同步源:`docs/wiki-gitea/` → 见下方「Wiki 同步」 |
|
||||
| **百科(Wiki)** | 仓库内同步源:`开发文档/8、部署/04-Gitea门户/wiki-gitea/` → 见下方「Wiki 同步」 |
|
||||
| **本地 SDK 控制台(Hub)** | 启动服务后:`http://127.0.0.1:8899/hub` |
|
||||
| **API 文档(Swagger)** | `http://127.0.0.1:8899/docs` |
|
||||
|
||||
@@ -31,16 +32,16 @@ cd app && python -m uvicorn main:app --host 0.0.0.0 --port 8899
|
||||
## Gitea:Actions / 百科 / 发行版 / 软件包
|
||||
|
||||
- **Actions**:`.gitea/workflows/sdk-ci.yml`(需 Gitea 管理员配置 `act_runner` 后才会跑绿)
|
||||
- **百科正文**:`docs/wiki-gitea/*.md` — 用脚本或手动粘贴到 Gitea Wiki
|
||||
- **发行版清单**:`docs/gitea/RELEASES.md` — 创建 Release 时对照上传资产
|
||||
- **软件包说明**:`docs/gitea/PACKAGES.md`
|
||||
- **项目看板建议**:`docs/gitea/PROJECTS.md`
|
||||
- **百科正文**:`开发文档/8、部署/04-Gitea门户/wiki-gitea/*.md` — 用脚本或手动粘贴到 Gitea Wiki
|
||||
- **发行版清单**:`开发文档/8、部署/04-Gitea门户/gitea/RELEASES.md` — 创建 Release 时对照上传资产
|
||||
- **软件包说明**:`开发文档/8、部署/04-Gitea门户/gitea/PACKAGES.md`
|
||||
- **项目看板建议**:`开发文档/8、部署/04-Gitea门户/gitea/PROJECTS.md`
|
||||
|
||||
一键同步 Wiki(推荐 `GITEA_TOKEN`;**勿把令牌写进仓库**):
|
||||
|
||||
```bash
|
||||
export GITEA_TOKEN='你的 Gitea 访问令牌'
|
||||
python3 docs/gitea/publish_wiki.py
|
||||
python3 开发文档/8、部署/04-Gitea门户/gitea/publish_wiki.py
|
||||
# 若未设变量,脚本会尝试从 git remote gitea 解析(本地开发机可用)
|
||||
```
|
||||
|
||||
|
||||
@@ -25,7 +25,10 @@ if not os.path.exists(SCRIPT_PATH):
|
||||
SCRIPT_PATH = os.path.expanduser("~/Documents/GitHub/workphone-sdk/sdk/agent/hook/wechat_hook_v2.js")
|
||||
|
||||
# 截图保存目录
|
||||
SCREENSHOT_DIR = os.path.join(os.path.dirname(__file__), '..', '..', 'verification_screenshots')
|
||||
SCREENSHOT_DIR = os.path.join(
|
||||
os.path.dirname(__file__), '..', '..', '..',
|
||||
'开发文档', '6、测试', 'screenshots', 'verification_110',
|
||||
)
|
||||
os.makedirs(SCREENSHOT_DIR, exist_ok=True)
|
||||
|
||||
# 结果文件
|
||||
|
||||
43
开发文档/00-项目总览/README.md
Normal file
@@ -0,0 +1,43 @@
|
||||
---
|
||||
obsidian-color: "#1565C0"
|
||||
cssclasses:
|
||||
- devdoc-index
|
||||
---
|
||||
|
||||
# 00 · 项目总览
|
||||
|
||||
**工作手机 SDK v3.0** 仓库顶层结构(Obsidian 配色见 `.obsidian/snippets/workphone-devdoc.css`)。
|
||||
|
||||
---
|
||||
|
||||
## 根目录一览
|
||||
|
||||
```text
|
||||
工作手机/
|
||||
├── sdk/ ★ 代码真源(app / agent / android-app / tests)
|
||||
├── 开发文档/ ★ 文档真源(1~10 + 平台分析 + 00总览)
|
||||
├── 机擎/ ★ 项目管理 SKILL(五人小组)
|
||||
├── 资料/ 外部调研与归档(非运行时代码)
|
||||
├── scripts/ 仓库级 Git 双推(sync_to_gitea_github.sh)
|
||||
├── README.md 项目入口
|
||||
└── .obsidian/ Obsidian 配色 snippet
|
||||
```
|
||||
|
||||
**已迁入开发文档**(根目录不再散落):
|
||||
|
||||
| 原路径 | 新路径 |
|
||||
|--------|--------|
|
||||
| `docs/` | `开发文档/8、部署/04-Gitea门户/` |
|
||||
| `tools/` | `开发文档/6、测试/scripts/` |
|
||||
| `verification_screenshots/` | `开发文档/6、测试/screenshots/verification_110/` |
|
||||
| `local-mount-sync/` | `机擎/阿服/local-mount-sync/` |
|
||||
|
||||
---
|
||||
|
||||
## 架构图
|
||||
|
||||

|
||||
|
||||
详细模块拆解:[2、架构/01-总览/系统架构.md §3.0](../2、架构/01-总览/系统架构.md)
|
||||
|
||||
规范 Skill:[机擎/阿表/开发文档结构规范/SKILL.md](../../机擎/阿表/开发文档结构规范/SKILL.md)
|
||||
@@ -5,6 +5,41 @@
|
||||
|
||||
---
|
||||
|
||||
## 2026-05-24 15:30 | 根目录非 SDK 整理 · 项目总览图
|
||||
|
||||
### 执行人:阿表(文档)+ 阿服(Gitea/挂载)+ 阿端(Obsidian)
|
||||
|
||||
### 完成内容
|
||||
- [x] `docs/` → `开发文档/8、部署/04-Gitea门户/`;`publish_wiki.py` / `sync_when_online.sh` 路径修复
|
||||
- [x] `tools/` → `开发文档/6、测试/scripts/` + `_repo_root.py`;根目录 46 个 legacy 脚本/JSON → `scripts/legacy/`
|
||||
- [x] `verification_screenshots/` → `screenshots/verification_110/`;`sdk/tests/run_live_verification.py` 对齐
|
||||
- [x] `local-mount-sync/` → `机擎/阿服/local-mount-sync/`
|
||||
- [x] 新增 `开发文档/00-项目总览/README.md`、各层 README;Skill §九 根目录迁入速查
|
||||
- [x] Obsidian `workphone-devdoc.css` 扩展(00总览/6测试/scripts/机擎/sdk);workspace 去旧路径
|
||||
- [x] 架构图 `2、架构/images/01-整体总览/工作手机项目目录总览.png`
|
||||
|
||||
### 进度
|
||||
- 根目录非 SDK 整理:**100%**
|
||||
- 总进度:**99.5%**
|
||||
|
||||
---
|
||||
|
||||
### 执行人:阿机(代码收编)+ 阿表(文档)+ 火炬(CodeGraph)
|
||||
|
||||
### 完成内容
|
||||
- [x] 唯一未收编资产 `wechat_hook_bridge.js` → `sdk/agent/hook/wechat_hook_bridge.js`
|
||||
- [x] 历史 ZIP → `资料/archive/微信Frida_SDK_20260518_补全包.zip` + `资料/archive/README.md`
|
||||
- [x] 移除根目录 `补全包/`、`工作手机SDK补全包_微信Frida/`(代码已在主线 `sdk/`)
|
||||
- [x] `tools/extract_wechat_sdk_control_interfaces_1838.py` 扫描源仅保留 `sdk/` + `tools/`
|
||||
- [x] 主手册 v2.2、Wiki 摘要、hook README 路径对齐
|
||||
- [x] `.cursor/rules/codegraph.mdc` + `npx @colbymchenry/codegraph init -i` 初始化符号索引
|
||||
|
||||
### 进度
|
||||
- 项目结构整理:**100%**(根目录无补全包冗余)
|
||||
- 总进度:**99.5%**(不变)
|
||||
|
||||
---
|
||||
|
||||
## 2026-05-24 12:00 | 补全包并入开发文档 · 统一手册 v2.0
|
||||
|
||||
### 执行人:阿端(手册)+ 阿桥(接口收敛)+ 阿表(索引)
|
||||
|
||||
BIN
开发文档/2、架构/images/01-整体总览/工作手机项目目录总览.png
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
33
开发文档/6、测试/README.md
Normal file
@@ -0,0 +1,33 @@
|
||||
---
|
||||
obsidian-color: "#F9A825"
|
||||
cssclasses:
|
||||
- devdoc-index
|
||||
---
|
||||
|
||||
# 6、测试
|
||||
|
||||
验收脚本、真机证据、矩阵报告与截图归档。
|
||||
|
||||
---
|
||||
|
||||
## 目录树
|
||||
|
||||
```text
|
||||
6、测试/
|
||||
├── scripts/ 验收/矩阵生成 Python 脚本(原根目录 tools/)
|
||||
│ └── legacy/ 历史一次性调试脚本(原根目录 *.py)
|
||||
├── screenshots/
|
||||
│ ├── verification_110/ 110 项视觉验证截图(原 verification_screenshots/)
|
||||
│ └── test_img/ 临时测试图
|
||||
├── 110项功能逐项确认/ 按日期的追加报告
|
||||
└── … 各轮 wireless_frida / live_verify 目录
|
||||
```
|
||||
|
||||
**运行示例**(在项目根目录):
|
||||
|
||||
```bash
|
||||
python3 开发文档/6、测试/scripts/wireless_frida_wechat_batch_verify.py
|
||||
python3 开发文档/6、测试/scripts/real_device_110_effect_verify.py
|
||||
```
|
||||
|
||||
脚本内 `ROOT` 由 `scripts/_repo_root.py` 自动解析,无需 `cd`。
|
||||
6
开发文档/6、测试/screenshots/README.md
Normal file
@@ -0,0 +1,6 @@
|
||||
# screenshots
|
||||
|
||||
| 子目录 | 来源 |
|
||||
|--------|------|
|
||||
| `verification_110/` | sdk/tests/run_live_verification 与 110 项视觉验收 |
|
||||
| `test_img/` | 临时测试图 |
|
||||
|
Before Width: | Height: | Size: 510 KiB After Width: | Height: | Size: 510 KiB |
|
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 500 KiB |
|
Before Width: | Height: | Size: 501 KiB After Width: | Height: | Size: 501 KiB |
|
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 500 KiB |
|
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 500 KiB |
|
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 500 KiB |
|
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 500 KiB |
|
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 500 KiB |
|
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 500 KiB |
|
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 500 KiB |
|
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 500 KiB |
|
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 500 KiB |
|
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 500 KiB |
|
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 500 KiB |
|
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 500 KiB |
|
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 500 KiB |
|
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 500 KiB |
|
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 500 KiB |
|
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 500 KiB |
|
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 500 KiB |
|
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 500 KiB |
|
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 500 KiB |
|
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 500 KiB |
|
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 500 KiB |
|
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 500 KiB |
|
Before Width: | Height: | Size: 501 KiB After Width: | Height: | Size: 501 KiB |
|
Before Width: | Height: | Size: 501 KiB After Width: | Height: | Size: 501 KiB |
|
Before Width: | Height: | Size: 501 KiB After Width: | Height: | Size: 501 KiB |
|
Before Width: | Height: | Size: 501 KiB After Width: | Height: | Size: 501 KiB |
|
Before Width: | Height: | Size: 501 KiB After Width: | Height: | Size: 501 KiB |
|
Before Width: | Height: | Size: 501 KiB After Width: | Height: | Size: 501 KiB |
|
Before Width: | Height: | Size: 501 KiB After Width: | Height: | Size: 501 KiB |
|
Before Width: | Height: | Size: 501 KiB After Width: | Height: | Size: 501 KiB |
|
Before Width: | Height: | Size: 501 KiB After Width: | Height: | Size: 501 KiB |
11
开发文档/6、测试/scripts/README.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# scripts
|
||||
|
||||
验收与矩阵生成脚本。`from _repo_root import repo_root` 解析仓库根目录。
|
||||
|
||||
| 脚本 | 用途 |
|
||||
|------|------|
|
||||
| `wireless_frida_wechat_batch_verify.py` | 无线 Frida 批量验证 |
|
||||
| `real_device_110_effect_verify.py` | 110 项真机效果验证 |
|
||||
| `build_wechat_sdk_true_control_matrix_v*.py` | 接口矩阵生成 |
|
||||
|
||||
历史调试脚本见 `legacy/`。
|
||||
13
开发文档/6、测试/scripts/_repo_root.py
Normal file
@@ -0,0 +1,13 @@
|
||||
"""Resolve workphone-sdk repository root from scripts under 开发文档/6、测试/scripts/."""
|
||||
from __future__ import annotations
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def repo_root() -> Path:
|
||||
p = Path(__file__).resolve().parent
|
||||
for _ in range(8):
|
||||
if (p / "sdk" / "app" / "main.py").is_file() and (p / "开发文档").is_dir():
|
||||
return p
|
||||
p = p.parent
|
||||
raise FileNotFoundError("workphone-sdk repository root not found")
|
||||
@@ -2,6 +2,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""复核110项真机证据、资料读取摘要、截图非黑屏与锁屏后台链路;只新增文档。"""
|
||||
from __future__ import annotations
|
||||
from _repo_root import repo_root
|
||||
|
||||
import json
|
||||
from collections import Counter
|
||||
@@ -15,7 +16,7 @@ except Exception:
|
||||
Image = None
|
||||
ImageStat = None
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
ROOT = repo_root()
|
||||
LATEST = ROOT / '开发文档/6、测试/real_device_110_effect_verify_20260518/20260518_180227'
|
||||
RESULT_JSON = LATEST / 'real_device_110_effect_results.json'
|
||||
BACKEND_LOG = LATEST / 'backend_logs/backend_execution_events.jsonl'
|
||||
@@ -8,13 +8,14 @@
|
||||
3. 每项功能是否属于高风险,只能在测试对象或空数据下验证。
|
||||
"""
|
||||
from __future__ import annotations
|
||||
from _repo_root import repo_root
|
||||
|
||||
import json
|
||||
import re
|
||||
from pathlib import Path
|
||||
from datetime import datetime
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
ROOT = repo_root()
|
||||
OUT = ROOT / "开发文档" / "6、测试" / "wireless_frida_real_device_acceptance_20260518"
|
||||
OUT.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
@@ -25,7 +26,7 @@ CANDIDATE_FILES = [
|
||||
ROOT / "sdk/app/routers/devices.py",
|
||||
ROOT / "sdk/app/services/wechat_adb_engine.py",
|
||||
ROOT / "sdk/app/agent/hook/wechat_hook_v2.js",
|
||||
ROOT / "tools/wireless_frida_wechat_batch_verify.py",
|
||||
ROOT / "开发文档" / "6、测试" / "scripts/wireless_frida_wechat_batch_verify.py",
|
||||
]
|
||||
|
||||
HIGH_RISK_RE = re.compile(r"add|accept|delete|remove|post|send|forward|revoke|register|login|logout|switch|invite|quit|set|clear|follow|unfollow|like|comment|share|batchExecute|getSimPhone|moments|friend|group|official|phone|sim|feedback|report|unblock|手机号|添加好友|朋友圈|群发|解封|支付|转账|红包|举报|反馈|外发|删除|清空|资料改写", re.I)
|
||||
@@ -5,6 +5,7 @@
|
||||
口径:只统计“SDK服务器 HTTP/API -> 手机端微信”的真实控制接口;非微信、纯展示、纯文档、纯设备管理不纳入核心完成率。
|
||||
"""
|
||||
from __future__ import annotations
|
||||
from _repo_root import repo_root
|
||||
|
||||
import ast
|
||||
import json
|
||||
@@ -13,9 +14,7 @@ from datetime import datetime
|
||||
from pathlib import Path
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
ROOT = Path('/Users/karuo/Documents/开发/2、私域银行/工作手机')
|
||||
if not ROOT.exists():
|
||||
ROOT = Path('/mnt/desktop/工作手机')
|
||||
ROOT = repo_root()
|
||||
|
||||
SDK_APP = ROOT / 'sdk' / 'app'
|
||||
DOC_DIR = ROOT / '开发文档' / '6、测试' / '110项功能逐项确认' / '2026-05-18'
|
||||
@@ -1,13 +1,14 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import annotations
|
||||
|
||||
from _repo_root import repo_root
|
||||
import ast, csv, json, re
|
||||
from collections import OrderedDict
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
|
||||
ROOT=Path('/Users/karuo/Documents/开发/2、私域银行/工作手机')
|
||||
if not ROOT.exists(): ROOT=Path('/mnt/desktop/工作手机')
|
||||
ROOT=repo_root()
|
||||
APP=ROOT/'sdk/app'; ROUTERS=APP/'routers'; MAIN=APP/'main.py'
|
||||
DOC=ROOT/'开发文档/6、测试/110项功能逐项确认/2026-05-18'; DOC.mkdir(parents=True,exist_ok=True)
|
||||
TS=datetime.now().strftime('%H%M%S')
|
||||
@@ -9,6 +9,7 @@
|
||||
4. 有真实执行通道但涉及发送、删除、支付、解封、清空等高风险动作,标为需人工确认和安全闸。
|
||||
"""
|
||||
from __future__ import annotations
|
||||
from _repo_root import repo_root
|
||||
|
||||
import ast
|
||||
import csv
|
||||
@@ -19,9 +20,7 @@ from datetime import datetime
|
||||
from pathlib import Path
|
||||
from typing import Dict, List, Optional, Tuple
|
||||
|
||||
ROOT = Path('/Users/karuo/Documents/开发/2、私域银行/工作手机')
|
||||
if not ROOT.exists():
|
||||
ROOT = Path('/mnt/desktop/工作手机')
|
||||
ROOT = repo_root()
|
||||
|
||||
DOC_DIR = ROOT / '开发文档/6、测试/110项功能逐项确认/2026-05-18'
|
||||
DOC_DIR.mkdir(parents=True, exist_ok=True)
|
||||
@@ -332,7 +331,7 @@ def main() -> None:
|
||||
lines.append('')
|
||||
lines.append(f'- CSV矩阵:`{CSV_OUT}`')
|
||||
lines.append(f'- JSON矩阵:`{JSON_OUT}`')
|
||||
lines.append(f'- 生成脚本:`{ROOT / "tools/build_wechat_sdk_true_control_matrix_v3_1858.py"}`')
|
||||
lines.append(f'- 生成脚本:`{ROOT / "开发文档" / "6、测试" / "scripts/build_wechat_sdk_true_control_matrix_v3_1858.py"}`')
|
||||
lines.append('')
|
||||
MD_OUT.write_text('\n'.join(lines) + '\n', encoding='utf-8')
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
本脚本只生成追加文档,不覆盖既有文档。
|
||||
"""
|
||||
from __future__ import annotations
|
||||
from _repo_root import repo_root
|
||||
|
||||
import csv
|
||||
import importlib.util
|
||||
@@ -15,14 +16,12 @@ from dataclasses import asdict
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path('/Users/karuo/Documents/开发/2、私域银行/工作手机')
|
||||
if not ROOT.exists():
|
||||
ROOT = Path('/mnt/desktop/工作手机')
|
||||
ROOT = repo_root()
|
||||
DOC_DIR = ROOT / '开发文档/6、测试/110项功能逐项确认/2026-05-18'
|
||||
DOC_DIR.mkdir(parents=True, exist_ok=True)
|
||||
TS = datetime.now().strftime('%H%M%S')
|
||||
|
||||
V3_PATH = ROOT / 'tools/build_wechat_sdk_true_control_matrix_v3_1858.py'
|
||||
V3_PATH = ROOT / '开发文档' / '6、测试' / 'scripts/build_wechat_sdk_true_control_matrix_v3_1858.py'
|
||||
spec = importlib.util.spec_from_file_location('v3matrix', str(V3_PATH))
|
||||
v3 = importlib.util.module_from_spec(spec)
|
||||
sys.modules['v3matrix'] = v3
|
||||
@@ -201,7 +200,7 @@ def main() -> None:
|
||||
lines.append('')
|
||||
lines.append(f'- CSV:`{CSV_OUT}`')
|
||||
lines.append(f'- JSON:`{JSON_OUT}`')
|
||||
lines.append(f'- 脚本:`{ROOT / "tools/build_wechat_sdk_true_control_matrix_v4_1905.py"}`')
|
||||
lines.append(f'- 脚本:`{ROOT / "开发文档" / "6、测试" / "scripts/build_wechat_sdk_true_control_matrix_v4_1905.py"}`')
|
||||
MD_OUT.write_text('\n'.join(lines) + '\n', encoding='utf-8')
|
||||
|
||||
print(json.dumps({'md': str(MD_OUT), 'csv': str(CSV_OUT), 'json': str(JSON_OUT), 'rows': len(rows), 'core_count': core_count, 'by_scope': by_scope, 'by_priority': by_pri, 'by_category': by_cat}, ensure_ascii=False, indent=2))
|
||||
@@ -12,6 +12,7 @@
|
||||
3. 非核心接口:泛设备、非微信、项目管理、注册中心、经验库等不直接控制手机微信端的接口。
|
||||
"""
|
||||
from __future__ import annotations
|
||||
from _repo_root import repo_root
|
||||
|
||||
import ast
|
||||
import csv
|
||||
@@ -23,7 +24,7 @@ from datetime import datetime
|
||||
from pathlib import Path
|
||||
from typing import Iterable
|
||||
|
||||
ROOT = Path.cwd()
|
||||
ROOT = repo_root()
|
||||
OUT_DIR = ROOT / "开发文档" / "6、测试" / "110项功能逐项确认" / "2026-05-18"
|
||||
OUT_DIR.mkdir(parents=True, exist_ok=True)
|
||||
TS = datetime.now().strftime("%H%M%S")
|
||||
@@ -33,14 +34,10 @@ PY_SOURCES = [
|
||||
ROOT / "sdk" / "app" / "services",
|
||||
ROOT / "sdk" / "agent" / "hook",
|
||||
ROOT / "sdk" / "tests",
|
||||
ROOT / "tools",
|
||||
ROOT / "工作手机SDK补全包_微信Frida",
|
||||
ROOT / "补全包" / "微信Frida_SDK_20260518",
|
||||
ROOT / "开发文档" / "6、测试" / "scripts",
|
||||
]
|
||||
JS_SOURCES = [
|
||||
ROOT / "sdk" / "agent" / "hook",
|
||||
ROOT / "工作手机SDK补全包_微信Frida",
|
||||
ROOT / "补全包" / "微信Frida_SDK_20260518",
|
||||
]
|
||||
|
||||
BUSINESS_KEYWORDS = {
|
||||
@@ -280,7 +277,7 @@ def write_outputs(items: list[InterfaceItem]) -> tuple[Path, Path, Path]:
|
||||
|
||||
## 一、扫描结论
|
||||
|
||||
本次从 `sdk/app/routers`、`sdk/app/services`、`sdk/agent/hook`、`sdk/tests`、`tools`、`工作手机SDK补全包_微信Frida`、`补全包/微信Frida_SDK_20260518` 中提取服务器路由、Python 符号和 Frida/JS 符号。扫描结果仅作为接口矩阵初稿,下一步还必须结合真实调用链和真机证据复核。
|
||||
本次从 `sdk/app/routers`、`sdk/app/services`、`sdk/agent/hook`、`sdk/tests`、`tools` 中提取服务器路由、Python 符号和 Frida/JS 符号。扫描结果仅作为接口矩阵初稿,下一步还必须结合真实调用链和真机证据复核。
|
||||
|
||||
| 指标 | 数量 |
|
||||
|---|---:|
|
||||
@@ -2,6 +2,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""生成工作手机110项功能清单与只追加开发文档。"""
|
||||
from __future__ import annotations
|
||||
from _repo_root import repo_root
|
||||
|
||||
import json
|
||||
import re
|
||||
@@ -9,7 +10,7 @@ from datetime import datetime
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
ROOT = repo_root()
|
||||
MATRIX = ROOT / '开发文档/6、测试/wireless_frida_real_device_acceptance_20260518/真机110功能验收矩阵.json'
|
||||
LATEST_BASE = ROOT / '开发文档/6、测试/real_device_110_effect_verify_20260518'
|
||||
DOC_DIR = ROOT / '开发文档/6、测试/110项功能逐项确认/2026-05-18'
|
||||
@@ -2,6 +2,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""按日期新增110项功能定义与逐项验收口径文档,绝不覆盖旧文档。"""
|
||||
from __future__ import annotations
|
||||
from _repo_root import repo_root
|
||||
|
||||
import json
|
||||
import re
|
||||
@@ -10,7 +11,7 @@ from datetime import datetime
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
ROOT = repo_root()
|
||||
MATRIX = ROOT / '开发文档/6、测试/wireless_frida_real_device_acceptance_20260518/真机110功能验收矩阵.json'
|
||||
LATEST_BASE = ROOT / '开发文档/6、测试/real_device_110_effect_verify_20260518'
|
||||
DOC_DIR = ROOT / '开发文档/6、测试/110项功能逐项确认/2026-05-18'
|
||||
@@ -2,13 +2,14 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""盘点工作手机 SDK 的 FastAPI 路由,并按真机验证优先级分类。"""
|
||||
from __future__ import annotations
|
||||
from _repo_root import repo_root
|
||||
|
||||
import ast
|
||||
import json
|
||||
import re
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
ROOT = repo_root()
|
||||
SCAN_DIRS = [ROOT / "sdk" / "app"]
|
||||
OUT_DIR = ROOT / "开发文档" / "6、测试" / "live_verify_20260518"
|
||||
OUT_DIR.mkdir(parents=True, exist_ok=True)
|
||||