Add easyeda_pro_source.md: Pro 工程源完整链 + EPRO2 格式解析
Why:
- pro.lceda.cn (立创 EDA 专业版) 的工程源抓取链已经打通:4 步 API +
AES-128-GCM 解密 + gzip 解压 + EPRO2 消息流解析,所有信息需要落成
文档独立保留,避免丢失;也为后续实现 EPRO2 → KiCad 转换器/选型铺路。
- 与 oshwhub.md(Std 版)并列成为独立调研文档 —— Pro 和 Std 是两套
独立编辑器,cookie/API/格式都不同,混在一起反而乱。
What:
- docs/sources/easyeda_pro_source.md:
* TL;DR 表 + §1 Std vs Pro 对照
* §2 4 步 API 链 + 必需 headers (Editor-Version/path/Referer/Cookie)
+ Python 解密代码 + 实测数据(2.7 MB 源流 / 8357 条消息)
* §3 EPRO2 格式完整分类:40 种 message type 按功能分组
(零件/几何/PCB/层/规则/...) + 每类样例
* §4 安全合规(风控 / license / 密钥泄漏语义)
* §5 接入 Forge (OSHWHUB_INGEST_SPEC.md) 的 gap 表
* §6 已知未验证 7 条
* 附录 A 一键重跑命令
- pyproject.toml: + pycryptodome>=3.23.0(AES-GCM 解密依赖)
- log.md: 本次会话记录
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
70
log.md
70
log.md
@@ -4,6 +4,76 @@
|
||||
|
||||
---
|
||||
|
||||
## 2026-04-24 00:25 打通 pro.lceda.cn 工程源完整链 + EPRO2 格式解析
|
||||
|
||||
**Claude 会话**
|
||||
|
||||
核心成果:**立创 EDA Pro 工程源的 API + 加密 + 格式三层全打通**。
|
||||
|
||||
### 完整链路
|
||||
|
||||
```
|
||||
1. GET /api/v4/projects/<PROJ> → branch_uuid
|
||||
2. GET /api/v4/projects/<PROJ>/branches/<BRANCH> → history_uuid
|
||||
3. GET /api/v4/projects/<PROJ>/branches/<BRANCH>/histories/<HIST> → {key, iv, dataStrUrl}
|
||||
4. GET <dataStrUrl> (modules.lceda.cn) → 417 KB 加密 blob
|
||||
5. AES-128-GCM decrypt (tag=blob[-16:]) → 417 KB gzip
|
||||
6. gunzip → 2.7 MB EPRO2 源流
|
||||
```
|
||||
|
||||
关键 headers:`Editor-Version: 3.2.127` / `path: <PROJ_UUID>` / `Referer: https://pro.lceda.cn/editor` /
|
||||
`Cookie: lceda_pro_session=...`(与 u.lceda.cn 的 session 不共享)
|
||||
|
||||
### 加密细节
|
||||
|
||||
- 算法: AES-128-GCM(从 `modules.lceda.cn/pro-mgr/.../project-worker.js` 里 `this.tool.decrypt({name:"AES-GCM",iv:this.iv,tagLength:128},...)` 反查确认)
|
||||
- key / iv 都是 32 hex = 16 byte
|
||||
- WebCrypto 约定:ciphertext || 16-byte-authTag(末尾附)
|
||||
- 解密后 gzip magic `1f 8b 08`,gunzip 得最终源流
|
||||
|
||||
### EPRO2 格式
|
||||
|
||||
立创 EDA Pro 2 的**事件溯源**格式:消息流按 `\n` 分行,每行 `{"type":...,"ticket":N,"id":...}||{payload}||[extra]`。
|
||||
示例样本(`无界PLUS` BOARD 文档)**8 357 条消息**,**40 种 type**:
|
||||
- PART / COMPONENT / ATTR / PIN(零件与属性)
|
||||
- PAD / VIA / WIRE / NET / PAD_NET(PCB 电气)
|
||||
- LINE / POLY / RECT / ARC / CIRCLE / ELLIPSE / TEXT(几何)
|
||||
- LAYER (1572) / LAYER_PHYS / ACTIVE_LAYER(层堆叠)
|
||||
- FILL / POUR / POURED(铺铜)
|
||||
- RULE / RULE_SELECTOR / RULE_TEMPLATE(设计规则)
|
||||
|
||||
### 与 Std 版对比
|
||||
|
||||
| | u.lceda.cn (Std) | pro.lceda.cn (Pro) |
|
||||
|---|---|---|
|
||||
| Cookie | `lceda_session` | `lceda_pro_session` |
|
||||
| 源 API | 单一 `/api/projects/<uuid>` | 4 步 `/api/v4/...` 链 |
|
||||
| 版本控制 | 无 | branches + histories |
|
||||
| 加密 | 待验证 | AES-128-GCM |
|
||||
| 源格式 | EasyEDA JSON(扁平) | EPRO2 消息流 |
|
||||
| 工具 | `easyeda2kicad.py` 第三方 | **无**现成 KiCad 转换器 |
|
||||
|
||||
### 落地
|
||||
|
||||
- 新建 `docs/sources/easyeda_pro_source.md`(完整调研,见该文档附录 A 一键重跑)
|
||||
- `pyproject.toml` 加 `pycryptodome>=3.23.0`
|
||||
- 清理:dev1 上 `/tmp/source.blob` 与 `/tmp/source.json`(后者含 Charles 私人工程源 2.7 MB)
|
||||
|
||||
### 待验证 / 下一步
|
||||
|
||||
1. **他人公开 Pro 工程**能否同样 4 步通 —— 需 HAR
|
||||
2. **SCHEMATIC docType** 的 API 入口(本次只解出 BOARD)
|
||||
3. **多 document 枚举**(project → documents 列表端点)
|
||||
4. Pro 编辑器"**导出 KiCad**"功能的 API 端点(若存在,能省自写转换器的工作)
|
||||
5. 对齐 `OSHWHUB_INGEST_SPEC.md`(Forge 消费侧要求 `.kicad_sch` + 更严 license whitelist)
|
||||
|
||||
### ⚠️ 安全
|
||||
|
||||
Charles 在聊天里粘过两次 cookie(u.lceda.cn 一次 + pro.lceda.cn 一次),已写入 dev1 `~/.secrets/`。
|
||||
当前会话 transcript 含明文 —— 本轮验证完 Charles 应登出再重登一次,让测试期间暴露过的 session invalidate。
|
||||
|
||||
---
|
||||
|
||||
## 2026-04-23 20:10 策略大调:登录内容入场 + 云服务器 + EDA→KiCad 转换
|
||||
|
||||
**Claude 会话**
|
||||
|
||||
Reference in New Issue
Block a user