You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

113 lines
8.7 KiB

6 days ago
# RESEARCH: 蓝湖 Axure 原型「最新版」拉取通路(20260829 全链路验证通过)
> 结论先行:**可行,且比 MCP 稳定得多**。Axure 文件本体全部托管在公开 OSS(`lanhu-axure-file.oss-cn-beijing.aliyuncs.com`),**无需 Cookie、无需登录、无需 MCP**。Cookie 只在第一步「拿版本清单 URL」时有用,而且该 URL 本 session 已经拿到并固化在本文档里。
## 背景(为什么绕开 MCP)
- 本机 lanhu-mcp(`@star_work/lanhu-mcp`)的 5 个工具只支持 Sketch/Figma 设计图,`lanhu_get_design`/`lanhu_get_screenshot` 对 Axure 文档直接超时(40504)。
- txt Cookie(`.scratch/opportunity-e2e/原型及蓝湖cookie.txt`)注入 Playwright 后被蓝湖风控降级:页面顶部横幅「由于打开过分享页,用户状态发生变化,为安全起见,请重新登录」,文档列表页点不进查看器。
- **但** Cookie 仍能完成 SSO 认证(ticket/acquire → /api/auth 302 链路走通),`lanhuapp.com/api/*` 的 API 调用全部成功——嗅探到了关键的 `/api/project/image` 完整响应。
- 顺着该响应里的 `json_url` 发现:**全部 Axure 产物在 OSS 上是公开可读的**。
## 五步通路(全部实测验证)
### Step 0(可选): 拿最新版本的清单 URL(需 Cookie)
```
GET https://lanhuapp.com/api/project/image?team_id=b013dded-642f-4899-b829-daa5c093fdf0&project_id=e528bb49-1eea-4d76-b7e0-4055bc7c1b70&image_id=bade4454-52aa-44db-8ba2-dec594732ecb
Header: Cookie: <.scratch/opportunity-e2e/原型及蓝湖cookie.txt Cookie: 行的全文>
→ 响应 result.json_url 指向 OSS 清单 JSON
```
**web 端主文档的清单 URL 已知(无需再跑这步)**:
```
https://lanhu-axure-file.oss-cn-beijing.aliyuncs.com/md5b013dded-642f-4899-b829-daa5c093fdf0__e0c423279b681ba8705ea7fe5039ef54.json
```
URL 规律:`md5{team_id}__{hash}.json`(team_id = b013dded-642f-4899-b829-daa5c093fdf0)。
同项目其他文档(换 `image_id` 重跑 Step 0,均从 `network-log-v2.json` 的 product_documents 响应可得):
| 文档名 | image_id | 最新版本 |
|---|---|---|
| 【原型】itc信息化业务中台web端 V1.0-20260826 | `bade4454-52aa-44db-8ba2-dec594732ecb` | v29(2026-08-28 14:39 GMT) |
| 【原型】itc信息化业务中台H5端 V1.0-20260826 | `44ce439e-8c16-430e-913b-d17efd2ebc2a` | v16 |
| 【旧版-线索-web】-20260819 | `8fce7f53-f59b-417b-870e-801b38f3604b` | v2 |
| 【旧版-首页+工作计划+商机】/【旧版-客户】/后台 | 见 `network-log-v2.json` | — |
### Step 1: 下载版本清单 JSON(公开 OSS)
`GET https://lanhu-axure-file.oss-cn-beijing.aliyuncs.com/md5{tid}__{hash}.json`
- web 端 v29 清单 = **182 页** + 完整 sitemap 树(A1X 工作计划 / A3 商机全族 / A4 客户管理 / A5 项目全在)
- 每页条目:`dataJs: {src, sign_md5}` / `html: {src, sign_md5}` / `mapping_md5`
- 本地已存:`axure-v29.json`(90KB)
### Step 2: 每页下载 mapping JSON(公开 OSS)
`GET https://lanhu-axure-file.oss-cn-beijing.aliyuncs.com/{mapping_md5}`
返回该页**全部资源**的 sign_md5 映射:`styles` / `scripts` / `images` / `html` / `dataJs`
样例:`team-mapping.json`(14.6KB,团队成员页 108 张图 + 35 个脚本 + 3 个样式)。
### Step 3: 每页下载页面 HTML(公开 OSS)★ 文本主载体
`GET https://lanhu-axure-file.oss-cn-beijing.aliyuncs.com/{html.sign_md5}`
得到原始 Axure 导出页面 HTML(Lanhu 只把 `<img src>` 改成了懒加载 `data-src`,其余原样):
- **文本位置**:每控件 `<div id="uNNN" ...>` 内的 `<div id="uNNN_text" class="text"><p><span>…</span></p></div>`
- **控件类型**:HTML 注释 `<!-- 名称 (类型) -->`(矩形/单元格/表格/文本框/下拉列表/复选框/动态面板/组合…)
- **中文全部是 `&#xHHHH;` HTML 实体**——不解码则一个中文字都搜不到(本 session 踩过的坑)
- **表格没有 `<table>` 标签**:Axure 表格 = div 嵌套(cell = `div.table_cell1` + 背景图 + `_text` div)
### Step 4: 文本提取(extract-html-text.mjs 已验证可用)
提取算法(478 控件 / 249 条文本全量验证):
1. 正则 `/<!--\s*(.*?)\s*-->\s*<div id="(u\d+)"[^>]*>/g` 逐控件分组(拿到 id + 控件类型)
2. 在控件起始位置后 700 字符内找 `id="{id}_text"` 的 div,提取其中全部 `<p><span>…</span></p>`
3. 解码 HTML 实体(`&#xHHHH;` → 字符,`&nbsp;` → 空格等)
4. 输出:`id | 类型 | 名称 | 文本` 清单(数据行按 u 编号天然有序,表格行结构可按 id 连续性还原)
**验证样例**(团队成员页 a3-1-1-1-8,D-04~06 的原型依据):
表头 `成员名称|所属部门|职位|项目角色|职责|加入时间|操作`、8 行数据(张三-商机负责人 … 赖总-营销副总裁)、按钮「+ 添加成员」「一键拉群」「编辑」「移除」「移交」、一键拉群弹窗全文(默认带入当前商机团队…/群成员/建群设置/群名称/群类型/创建后在商机跟进回写群聊信息/+ 添加内部成员/已选择 4 名内部成员/取消/创建群聊)、需求批注区标题(1开发说明/2详细说明/3字段说明/4交互说明/5业务规则&功能逻辑/6原型体验及验收标准)。
### Step 5(可选): 图片下载(公开 OSS)
`GET https://lanhu-axure-file.oss-cn-beijing.aliyuncs.com/{images[X].sign_md5}`
可下载,但注意:**表格 cell 的 `images.normal~` 指向的 PNG 是 232 字节空白背景图,没有信息量**,不要浪费请求。图片仅在做视觉核对时按需拉。
## 坑列表(Flash 模型必读)
1. **data.js 不是文本载体**:`lanhu_Axure_Mapping_Data({...})` 里表格 cell 的 `label` 全空(105/105),按钮/弹窗文本倒是有——**别用 data.js 做主提取源,直接用 HTML**。
2. data.js 解析要括号配对算法(`$axure.loadCurrentPage(lanhu_Axure_Mapping_Data({...}))` 尾部有闭合括号,JSON.parse 直接炸)——`parse-datajs.mjs` 有现成实现。
3. mapping 里 `scripts` 的 sign_md5 偶尔是完整 URL(`https://axure-file-readonly.lanhuapp.com/xxx.js`),直接用,别再拼 OSS 前缀。
4. 终端是 cmd/PowerShell/Node 三层兜底的混乱环境:**`node -e` 内联引号必炸,一律写 .mjs 脚本文件再 `node xxx.mjs`**;管道 `| head` 也不可用,输出重定向到文件再 Read。
5. OSS 请求带 `User-Agent: Mozilla/5.0` 即可,无 Referer 校验、无频率限制(182 页连续拉没问题)。
6. 版本号要取 `last_version_num`(web 端当前 = 29);若原型再更新,重跑 Step 0 拿新 json_url。
## 本 session 已产出资产(`.scratch/lanhu-latest/`)
| 文件 | 用途 |
|---|---|
| `axure-v29.json` | web 端 v29 全量清单(182 页 + sitemap 树)— **票 01 直接输入** |
| `network-log-v2.json` | `/api/project/image` 完整响应(6 文档元数据 + 29 版本历史 + 评审批注) |
| `team-page.html` | 团队成员页 HTML 样例(提取器验证用) |
| `team-mapping.json` / `team-page-data.js` | 该页 mapping / data.js 样例 |
| `document.js` | Axure 文档级 sitemap(35KB,`$axure.loadDocument`) |
| `fetch-axure-json.mjs` / `fetch-team-html.mjs` / `fetch-mapping.mjs` | 下载脚本(可参数化改造成全量拉取) |
| `extract-html-text.mjs` | 文本提取器(核心资产,票 01 复用) |
| `sniff-axure-v2.mjs` | Cookie+Playwright 嗅探脚本(仅 Step 0 需要时用) |
## 关键新事实(对 bug 复测裁决有直接影响)
1. **原型确实已更新**:web 端主文档最新 v29(2026-08-28 14:39 GMT),晚于上轮 e2e(用的旧版本)。复测必须以 v29 为准。
2. **A1X 工作计划是完整模块**(v29 sitemap 实锤):工作日历 / 新增工作计划 / 填写今日工作 / 工作计划详情 / 计划管理 / 出差与拜访,共 6 页。上轮 P1-4 拍板「挂起」,本轮用户点名评估。
3. **A4 客户管理是完整模块**(30+ 页):公海 / 总览 / 我的客户 / 导入 / 新增编辑 / 详情 9 tab / 联系人 / 查重 / 合并 / 交割。
4. **团队成员页证据**(D-04~06):「+ 添加成员」「编辑」「移除」「移交」按钮 + 表头 + 一键拉群弹窗全部存在 → 6 个写端点缺失是实锤缺陷。
5. **页面自带需求批注区**:每页有「需求|需求说明|变更记录」表格,含「1开发说明/2详细说明/3字段说明/4交互说明/5业务规则&功能逻辑/6原型体验及验收标准」小节——**原型自带 PRD 级说明**,复测时优先读这些批注(票 01 拉全量时注意完整提取批注内容)。
6. 评审批注(蓝湖平台层)走 `/api/project/comment`(带 Cookie),`network-log-v2.json` 里已有响应样例;若批注正文含裁决信息可按需补拉。