打通 oshwhub origin=std 项目的工程源(schematic + PCB dataStr)抓取链路。原
plan.md §1.6 假设需要登录,实测 lceda.cn/api/documents/<doc>?uuid=<doc>&path=<doc>
对公开项目匿名可访问 —— 无需 cookie,无账号封禁风险。
调研:4 轮探测留痕在 data/state/std_probe[1-5]/(gitignored);翻 Std 编辑器
v6.5.51 的 main.min.js bundle 找到 ajaxDetail 端点;按 docType 区分两种
响应 shape(schematic 项目视图 vs PCB 文档视图)。
Crawler:
- make_source_client() 用浏览器 UA + lceda.cn/editor Referer,因为
oshwhub /api/project/<uuid> 端点拒绝 FacereDataset/0.1 UA(CLAUDE.md
UA 例外条款:目标站主动封自定义 UA + 公开静态资源)
- fetch_std_source(): 项目元 → version_documents → 逐文档 dataStr → 落
source/<doc>.json + source/manifest.json
- --with-source(爬新项目时一并抓源)/ --backfill-source(仅扫已有)
- QPS ≤ 0.2 (SLEEP_SOURCE = 5s) 自律
Schema: 加 source_format / source_path / source_documents / editor_version
(前 3 进 enum 锁定,便于后续 Pro / KiCad 源对齐)。
回填结果:10/10 成功,45 个文档,33.2 MB;schema validate 全通。
docTypes 主要是 1 (schematic) 与 3 (pcb);USB 电压电流表只有 PCB 文档(4 个:
主板+盖板+底板+面板,作者未上传原理图源)。
完整调研:docs/sources/easyeda_std_source.md。
1 line
4.0 KiB
JSON
1 line
4.0 KiB
JSON
{"success":true,"code":0,"result":{"uuid":"d3d004c7a55b4817aceac161849a7b62","puuid":"b077573dfb764e95b1d27faba49cca65","title":"面板_垫片","description":"","docType":3,"master":"a4acf24d4c904f1ca758ff2496f6394f","thumb":"//image.lceda.cn/histories/a4acf24d4c904f1ca758ff2496f6394f.png","components":null,"updated_at":"2023-12-25 14:06:34","created_at":"2023-03-26 01:31:52","updateTime":1679765572,"download_times":1,"isAnonymousFile":false,"writable":false,"datastrid":"a4acf24d4c904f1ca758ff2496f6394f","dataStr":{"head":{"docType":"3","editorVersion":"6.5.26","newgId":true,"c_para":[],"x":"4020","y":"3300.5","hasIdFlag":true,"importFlag":0,"transformList":""},"canvas":"CA~1000~1000~#000000~yes~#FFFFFF~1.9685~1000~1000~line~1.9685~mm~0.5~0~visible~0.3937~4020~3300.5~1~yes","shape":["CIRCLE~4020~3300.5~6~0.5~10~gge1913~1~~circle_gge1916,circle_gge1919","CIRCLE~4020~3300.5~19.685~0.5~10~gge1937~1~~circle_gge1940,circle_gge1943"],"layers":["1~TopLayer~#FF0000~true~false~true~","2~BottomLayer~#0000FF~true~false~true~","3~TopSilkLayer~#FFCC00~true~false~true~","4~BottomSilkLayer~#66CC33~true~false~true~","5~TopPasteMaskLayer~#808080~true~false~true~","6~BottomPasteMaskLayer~#800000~true~false~true~","7~TopSolderMaskLayer~#800080~true~false~true~0.3","8~BottomSolderMaskLayer~#AA00FF~true~false~true~0.3","9~Ratlines~#6464FF~true~false~true~","10~BoardOutLine~#FF00FF~true~true~true~","11~Multi-Layer~#C0C0C0~true~false~true~","12~Document~#FFFFFF~true~false~true~","13~TopAssembly~#33CC99~false~false~false~","14~BottomAssembly~#5555FF~false~false~false~","15~Mechanical~#F022F0~false~false~false~","19~3DModel~#66CCFF~false~false~false~","21~Inner1~#999966~false~false~false~~","22~Inner2~#008000~false~false~false~~","23~Inner3~#00FF00~false~false~false~~","24~Inner4~#BC8E00~false~false~false~~","25~Inner5~#70DBFA~false~false~false~~","26~Inner6~#00CC66~false~false~false~~","27~Inner7~#9966FF~false~false~false~~","28~Inner8~#800080~false~false~false~~","29~Inner9~#008080~false~false~false~~","30~Inner10~#15935F~false~false~false~~","31~Inner11~#000080~false~false~false~~","32~Inner12~#00B400~false~false~false~~","33~Inner13~#2E4756~false~false~false~~","34~Inner14~#99842F~false~false~false~~","35~Inner15~#FFFFAA~false~false~false~~","36~Inner16~#99842F~false~false~false~~","37~Inner17~#2E4756~false~false~false~~","38~Inner18~#3535FF~false~false~false~~","39~Inner19~#8000BC~false~false~false~~","40~Inner20~#43AE5F~false~false~false~~","41~Inner21~#C3ECCE~false~false~false~~","42~Inner22~#728978~false~false~false~~","43~Inner23~#39503F~false~false~false~~","44~Inner24~#0C715D~false~false~false~~","45~Inner25~#5A8A80~false~false~false~~","46~Inner26~#2B937E~false~false~false~~","47~Inner27~#23999D~false~false~false~~","48~Inner28~#45B4E3~false~false~false~~","49~Inner29~#215DA1~false~false~false~~","50~Inner30~#4564D7~false~false~false~~","51~Inner31~#6969E9~false~false~false~~","52~Inner32~#9069E9~false~false~false~~","99~ComponentShapeLayer~#00CCCC~false~false~false~0","100~LeadShapeLayer~#CC9999~false~false~false~","101~ComponentMarkingLayer~#66FFCC~false~false~false~","Hole~Hole~#222222~false~false~true~","DRCError~DRCError~#FAD609~false~false~true~"],"objects":["All~true~false","Component~true~true","Prefix~true~true","Name~true~false","Track~true~true","Pad~true~true","Via~true~true","Hole~true~true","Copper_Area~true~true","Circle~true~true","Arc~true~true","Solid_Region~true~true","Text~true~true","Image~true~true","Rect~true~true","Dimension~true~true","Protractor~true~true"],"BBox":{"x":4000.3,"y":3280.8,"width":39.4,"height":39.4},"preference":{"hideFootprints":"","hideNets":""},"DRCRULE":{"Default":{"trackWidth":1,"clearance":0.6,"viaHoleDiameter":2.4,"viaHoleD":1.2},"isRealtime":false,"isDrcOnRoutingOrPlaceVia":false,"checkObjectToCopperarea":true,"showDRCRangeLine":true},"netColors":[]},"owner":{"uuid":"eac388b086064c2087f67a10b524a911","username":"yanranxiaoxi","nickname":"久治明千树汐","avatar":"//image.lceda.cn/pullimage/zXQJtlkjuGCFlTZJdn64muqpPdbvz6PKGX6l7VPt.jpeg","team":false},"public":true,"org_uuid":"","version":"4893896fac7c434eaad16ea31aea7d9c"}} |