Files
FacereDataset/log.md
Zhang Jiahao a16cb11c7d 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>
2026-04-24 00:11:32 +08:00

13 KiB
Raw Blame History

FacereDataset 执行日志

时间倒序,最新在顶部。


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 源流

关键 headersEditor-Version: 3.2.127 / path: <PROJ_UUID> / Referer: https://pro.lceda.cn/editor / Cookie: lceda_pro_session=...(与 u.lceda.cn 的 session 不共享)

加密细节

  • 算法: AES-128-GCMmodules.lceda.cn/pro-mgr/.../project-worker.jsthis.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 08gunzip 得最终源流

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_NETPCB 电气)
  • 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.tomlpycryptodome>=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.mdForge 消费侧要求 .kicad_sch + 更严 license whitelist

⚠️ 安全

Charles 在聊天里粘过两次 cookieu.lceda.cn 一次 + pro.lceda.cn 一次),已写入 dev1 ~/.secrets/。 当前会话 transcript 含明文 —— 本轮验证完 Charles 应登出再重登一次,让测试期间暴露过的 session invalidate。


2026-04-23 20:10 策略大调:登录内容入场 + 云服务器 + EDA→KiCad 转换

Claude 会话

四项变更落实到文档(暂不写代码,等云服务器到位):

1. 登录态内容纳入范围

原则(CLAUDE.md

  • 合法账号登录后抓,禁止盗号 / 共享号
  • 凭据集中云服务器 ~/.secrets/ (mode 700)不入 git / 日志 / metadata
  • 仍不绕付费墙、不破 DRM、不抓站点明确禁抓的内容
  • 换号 / 重登事件记 docs/secrets.md(只事件、不含值)

2. 云服务器(广州,待交付)

新增 plan.md §0.5 基础设施段:

  • 0.5.1 机器初始化git / git-lfs / uv / python 3.11+,非 root SSH~/.secrets/
  • 0.5.2 调度tmux/nohup 长跑 + systemd timer 增量
  • 0.5.3 登录态获取cookie 导出流程

3. 存储分级演进

plan.md §1.4 改写:

  • 前期 < 50 GB云服务器磁盘 + Gitea LFS
  • 中期 50200 GB评估 Gitea 容量压力;扩容 or 分仓
  • 后期 > 200 GB迁对象存储OSS / COS / MinIOGitea 只存元数据 + 指针
  • 50 GB 是决策评估点,过早迁移

4. 立创 EDA → KiCad 转换

新增 plan.md §1.6(登录态工程源抓取)+ §1.7EDA→KiCad 转换):

  • §1.6 用登录账号抓 u.lceda.cn/api/project/<uuid> 工程源 JSONsource.json
  • §1.7 写 scripts/convert_to_kicad.py,候选工具 easyeda2kicad.pypypi活跃维护
  • 批处理扫 data/raw/oshwhub/ → 输出 data/processed/oshwhub/<uuid>/kicad/
  • kicad-cli sch erc / pcb drc 做语法校验,失败样本记 data/state/convert_failed.jsonl
  • 目的:打通 oshwhub (EasyEDA) 与 bshada/open-schematics (KiCad) 两个生态的训练语料

同步改动

  • docs/sources/oshwhub.md §3.5 从"未开放"改为"需登录,纳入范围"R4 风险更新
  • README.md 数据源表加「登录态」列,加运行环境说明

等待

  • 广州云服务器到位 → 启动 Phase 0.5
  • 账号登录凭据由 Charles 提供

2026-04-23 19:55 oshwhub.md 重写成完整调研文档

Claude 会话

Charles 要求把 12 493 总数验证、90 项目采样结果合进主调研文档。

docs/sources/oshwhub.md 重写为 9 节 + 2 附录的完整调研:

  1. 一页纸 TL;DR 表
  2. 站点架构
  3. robots.txt 与合规
  4. API 与抓取入口(列表 / SSR 详情 / 附件 CDN / 排除项 / 未开放端点)
  5. 项目总数验证(新):三路 sort 一致 + 分页二分搜索250 × 50 = 12 500 吻合)+ grade 覆盖抽样
  6. 抽样语料特征(从 oshwhub_corpus_estimate.md 并入):体积 / 文件类型 / license 分布
  7. Schema 映射
  8. 速率与礼貌
  9. 目录输出约定
  10. 风险与未解决7 条)
  11. 附录:重跑命令、变更历史

删除重复文件 oshwhub_corpus_estimate.md(内容已并入 §5


2026-04-23 19:50 加入 HF bshada/open-schematics 计划

Claude 会话

Charles 点名把 https://huggingface.co/datasets/bshada/open-schematics 纳入第一批。

调研结论:

  • 这是已预处理的 HF 数据集,非待爬网站
  • 78 parquet shards 6.4 GBCC-BY-4.0(商用友好)
  • 10K+ 条记录,每条含 .kicad_sch 源 / PNG / 组件列表 / JSON / YAML / name / description
  • 与 oshwhub (EasyEDA) 互补,补 KiCad 生态

决定:

  • 整包镜像data/external/huggingface/bshada--open-schematics/拆 per-project 目录
  • huggingface-cli download ... --repo-type datasetparquet 走 LFS
  • 维护单独的 datasets.md,不与 per-project 的 projects.md

改动:

  • 新增 docs/sources/hf_bshada_open_schematics.md 完整调研
  • plan.md 加 Phase 1.5
  • README.md 数据源表加一行

未下载,等拍板 6.4 GB LFS 预算。


2026-04-23 19:30 Phase 1 MVP10 个高质量 oshwhub 项目入库

Claude 会话:承接仓库初始化

API 调研结论

  • 列表 APIGET https://oshwhub.com/api/project?page=N&pageSize=M&sort=hot,无鉴权,返回 12493 个项目元数据(含 grade / likes / stars / views / forks
  • 详情:GET https://oshwhub.com/<path> 是 SSR HTML嵌入 escaped JSONlicense + attachments[](每个带 name / src / size / md5 / ext / mime / download_count
  • 附件 CDNhttps://image.lceda.cn{src} — 已验证无鉴权直接下载
  • EasyEDA 工程源 JSONu.lceda.cn需登录v0.1 不抓
  • 详细调研见 docs/sources/oshwhub.md

选 10 个高质量项目

判据:grade == 4(平台精品徽章) + likes ≥ 100 + 应用领域多样(避免同类堆叠)+ 排除 _copy 派生仓。

10 个项目覆盖调试器、加热台、盖革计数器、可调电源、焊台、智能手表、USB 测电流、ZVS 感应加热、AI 开发板、红外热成像。

MVP 爬虫

位置:crawlers/oshwhub/crawler.py

  • list_projects() — 列表 API 分页
  • pick_top() — 按 like×3 + star + fork×2 + views/100 + comments×2 + grade×50 排序
  • parse_detail_html() — 从 SSR HTML 提取 title / license / description / attachments
  • crawl_one() — 每项目产出:metadata.json / description.md / cover.* / files/* / _urls.json
  • QPS ≤ 0.5SLEEP_BETWEEN = 2.0UA 显式声明 FacereDataset/0.1

抓取与入库

  • 10/10 成功52 个附件,524 MB
  • Gitea LFSv25.4.3 原生支持)+ 本地 git-lfs 3.5.1(用户态二进制装在 ~/.local/bin/
  • .gitattributes 规则:data/raw/**/files/** 一律走 LFS元数据metadata.json / description.md / _urls.json / cover.*)走普通 git
  • 每项目目录结构:
    data/raw/oshwhub/<uuid>/
    ├── metadata.json      # 按 schemas/project.schema.json
    ├── description.md
    ├── cover.{jpg,png,jpeg}
    ├── _urls.json         # 所有原始 URL 清单
    └── files/*            # 原始附件LFS
    

改动汇总

  • 新增:crawlers/oshwhub/{__init__,__main__,crawler}.pyschemas/project.schema.jsondocs/sources/oshwhub.mdpyproject.toml
  • 修改:.gitattributes(缩窄到 data/raw/**/files/**)、.gitignore(移除 data/raw/* 排除)

下一步建议

  1. 验收 10 个项目元数据质量(随机抽 2-3 条对照原站)
  2. 决定 Phase 1.4 放量目标50500全量 12493
  3. Phase 2 准备GitHub KiCad repo 调研

2026-04-23 19:40 fs-web-stream 排查 + schema 自动校验

Claude 会话(自主推进)

fs-web-stream.jlc.com 定性

重新抓 /CYIIOT/ST_LINK-V2_1 并看 13 个 fs-web-stream.jlc.com 链接的上下文:全部是嘉立创服务侧栏/推广图标3D 打印、发热片、Ican、EDA 扩展广场、开源硬件平台 badge 等),与项目本身无关image.lceda.cn/attachments/ 就是项目附件的唯一入口,已确认闭环。docs/sources/oshwhub.md 对应章节已更新。

scripts/validate.py

jsonschema 做两层校验:

  • 默认:所有 data/raw/**/metadata.jsonschemas/project.schema.json 的结构校验
  • --check-files:另外验证每条 file 的本地 path 存在且 sha256 匹配

结果10/10 项目两项全通过。

新增

  • scripts/validate.py
  • pyproject.tomljsonschema>=4.26

待决策

  • 放量规模 —— 已提供实测数据:median ≈ 110 GBp90 上界 ≈ 660 GB建议预算 150180 GB(见 docs/sources/oshwhub_corpus_estimate.md
  • 是否需要抓 u.lceda.cn 的 EasyEDA 源 JSON需登录v0.1 跳过)

2026-04-23 19:45 全量规模实测 + License 分布

Claude 会话(自主推进)

scripts/estimate_size.py,只抓详情 HTML 解析 attachments[].size,不下载;采样 90 个 hot 项目3 页 × 30

关键发现

  • 单项目 median 9 MB / mean 22 MB / p90 54 MB / max 204 MB12493 全量 median 估算 110 GBp90 上界 660 GB
  • 视频 (.mp4 + .qt) 占 54% 存储!如果训练只要 PCB/原理图/BOM--skip-ext mp4,qt 存储直接砍半
  • License 分布健康GPL 3.0 占 49%Public Domain 21%CC 系列 ~20%CERN/TAPR OHL 6%;样本内无闭源
  • NC (Non-Commercial) 占 ~11%,商用场景必须过滤

结果固化到 docs/sources/oshwhub_corpus_estimate.md,可随时重跑验证。

建议

  1. 存储预算定 180 GBmedian + 15% buffer
  2. Phase 1.4 前给 crawler 加 --skip-ext 开关滤视频
  3. 下游建立 license whitelist 过滤 NC / 未知

2026-04-23 18:50 仓库初始化 & 数据源调研

Claude 会话:初始化

完成:

  • git.deepknow.site/Facere/FacereDataset 克隆空仓到 ~/repo/FacereDataset
  • 调研立创开源平台oshwhub.com初步数据
    • robots.txt 仅 Disallow /posts,其他路径允许
    • 存在 sitemap.xml(首页 + explore + activities + market 等入口已列出)
    • 项目详情页路径为 /detail/<uuid>(示例 f0652fd2ae3e40b8a0ecc8dc773e3512
    • 图片 CDNimage.lceda.cn/oshwhub/pullImage/...
    • 文件下载:fs-web-stream.jlc.com/fs-web-stream/file-operation/download/<snowflake-id>
    • 页面是 Next.js SPA首屏 HTML 800KB但数据加载具体 API 入口需要浏览器 trace留给 Phase 1.1
  • 创建项目骨架:
    • README.md — 项目简介与数据源表
    • CLAUDE.md — 项目级 Claude 指令爬虫规约、合规红线、schema 要求)
    • plan.md — 6 阶段建设计划Phase 0 骨架 → Phase 5 数据清洗 → Phase 6 持续运营)
    • log.md — 本文件
    • .gitignore — 排除 data/raw data/processed data/state Python 缓存等
    • 目录骨架 crawlers/ schemas/ scripts/ data/{raw,processed,state} docs/{sources,}
    • 每个空目录放 .gitkeep
  • 首次提交 & 推送到 origin main

下一步建议

  1. 拍板存储方案(本地盘 / Gitea LFS / 外部 OSS—— 影响 Phase 1.4 放量时机
  2. 目标规模1 万 / 10 万 / 全量)
  3. 决定是否保留二进制附件或只存 URL
  4. 完成上述 3 项后启动 Phase 1.1(用 chrome-devtools MCP 录 oshwhub 的 network trace 定位真实 API