crawler: --skip-ext + --max-source-mb gates for batch-50 expansion
Two CLI gates needed before scaling Pro batch beyond top-5:
--skip-ext mp4,qt,mov (attachment filter)
Skips video extensions in attachment download. Phase 1 measurements
showed mp4+qt occupy ~54% of attachment storage. Entry still recorded
in metadata.json with skipped:ext:<token> so we can re-fetch later if
the policy changes. Honors both server-declared `ext` and filename
suffix, case-insensitively.
--max-source-mb N (Pro source size cap)
Trips inside the chain replay loop on encrypted-blob total. On trip:
raise ProjectOversizeError, wipe partial source/, append a row to
data/state/oshwhub_pro_oversize.jsonl. Lets us shortlist 50+ Pro
projects without one X86-board-class outlier (~500 MB) blowing the
LFS budget. Std and Pro 2.x legacy are not capped (both <2 MB in
sample).
Verified:
- cap=0 trips on first blob (1.2 MB), source/ wiped, state recorded
- cap=100 runs full ESP-VoCat (7.5 MB plain, 278 docs)
- skip-ext microtest: 8/8 cases (case-insensitive, declared/suffix
fallback, empty-token edge cases)
Plan + frozen candidate list for the next 50 projects:
- docs/plans/oshwhub_batch50.md
- data/state/oshwhub_batch50_candidates.jsonl (gitignore exception added)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -5,6 +5,8 @@ data/state/*
|
|||||||
!data/state/.gitkeep
|
!data/state/.gitkeep
|
||||||
# 例外:oshwhub 全量 listing 索引快照入库(28 MB jsonl,可重抓但要钉个版本)
|
# 例外:oshwhub 全量 listing 索引快照入库(28 MB jsonl,可重抓但要钉个版本)
|
||||||
!data/state/oshwhub_listing_full.jsonl
|
!data/state/oshwhub_listing_full.jsonl
|
||||||
|
# 例外:扩抓批次的"冻结候选清单"——计划文档以这份为准,可重生成
|
||||||
|
!data/state/oshwhub_batch50_candidates.jsonl
|
||||||
|
|
||||||
# data/raw 入库(工程二进制走 LFS,见 .gitattributes)
|
# data/raw 入库(工程二进制走 LFS,见 .gitattributes)
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import hashlib
|
|||||||
import html as _html
|
import html as _html
|
||||||
import json
|
import json
|
||||||
import re
|
import re
|
||||||
|
import shutil
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
import urllib.parse
|
import urllib.parse
|
||||||
@@ -428,11 +429,42 @@ def _order_history_chain(chain: list[dict]) -> list[dict]:
|
|||||||
return ordered
|
return ordered
|
||||||
|
|
||||||
|
|
||||||
|
class ProjectOversizeError(Exception):
|
||||||
|
"""Raised when a Pro project's chain replay would exceed the configured cap.
|
||||||
|
|
||||||
|
`cap_mb` is the trip threshold; `bytes_so_far` is the *encrypted blob* total
|
||||||
|
accumulated when we tripped (pre-decompression, pre-partition).
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, bytes_so_far: int, cap_mb: int) -> None:
|
||||||
|
super().__init__(
|
||||||
|
f"oversize: blob bytes {bytes_so_far // 1024 // 1024} MB > cap {cap_mb} MB"
|
||||||
|
)
|
||||||
|
self.bytes_so_far = bytes_so_far
|
||||||
|
self.cap_mb = cap_mb
|
||||||
|
|
||||||
|
|
||||||
|
def _record_oversize(out_root: Path, uuid: str, err: ProjectOversizeError) -> None:
|
||||||
|
"""Append one row to data/state/oshwhub_pro_oversize.jsonl for later review."""
|
||||||
|
state_path = Path("data/state/oshwhub_pro_oversize.jsonl")
|
||||||
|
state_path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
row = {
|
||||||
|
"uuid": uuid,
|
||||||
|
"out_root": str(out_root),
|
||||||
|
"bytes_so_far": err.bytes_so_far,
|
||||||
|
"cap_mb": err.cap_mb,
|
||||||
|
"ts": datetime.now(timezone.utc).isoformat(),
|
||||||
|
}
|
||||||
|
with state_path.open("a") as f:
|
||||||
|
f.write(json.dumps(row, ensure_ascii=False) + "\n")
|
||||||
|
|
||||||
|
|
||||||
def fetch_pro_source(
|
def fetch_pro_source(
|
||||||
pro_client: httpx.Client,
|
pro_client: httpx.Client,
|
||||||
project_uuid: str,
|
project_uuid: str,
|
||||||
proj_dir: Path,
|
proj_dir: Path,
|
||||||
sleep: float = SLEEP_PRO,
|
sleep: float = SLEEP_PRO,
|
||||||
|
max_source_mb: int | None = None,
|
||||||
) -> dict:
|
) -> dict:
|
||||||
"""Dispatcher: pick modern (3.x branch+EPRO2) vs legacy (2.x v2/documents/lists)
|
"""Dispatcher: pick modern (3.x branch+EPRO2) vs legacy (2.x v2/documents/lists)
|
||||||
based on whether project meta contains a non-null branch_uuid.
|
based on whether project meta contains a non-null branch_uuid.
|
||||||
@@ -440,11 +472,16 @@ def fetch_pro_source(
|
|||||||
Pro 3.x stores in git-style branch+history with AES-encrypted EPRO2 streams;
|
Pro 3.x stores in git-style branch+history with AES-encrypted EPRO2 streams;
|
||||||
Pro 2.x predates that and uses Std-style per-doc dataStr served from
|
Pro 2.x predates that and uses Std-style per-doc dataStr served from
|
||||||
/api/v2/documents/lists. See docs/sources/easyeda_pro_source.md §1.1.
|
/api/v2/documents/lists. See docs/sources/easyeda_pro_source.md §1.1.
|
||||||
|
|
||||||
|
`max_source_mb` only gates modern-path projects (legacy is always tiny: <2 MB
|
||||||
|
in our 2/2 sample) and trips before any blob is written to disk past the cap.
|
||||||
"""
|
"""
|
||||||
proj = _pro_get_json(pro_client, f"{PRO_API}/projects/{project_uuid}", project_uuid)
|
proj = _pro_get_json(pro_client, f"{PRO_API}/projects/{project_uuid}", project_uuid)
|
||||||
time.sleep(sleep)
|
time.sleep(sleep)
|
||||||
if proj.get("branch_uuid"):
|
if proj.get("branch_uuid"):
|
||||||
return _fetch_pro_modern(pro_client, project_uuid, proj, proj_dir, sleep)
|
return _fetch_pro_modern(
|
||||||
|
pro_client, project_uuid, proj, proj_dir, sleep, max_source_mb=max_source_mb
|
||||||
|
)
|
||||||
return _fetch_pro_legacy(pro_client, project_uuid, proj, proj_dir, sleep)
|
return _fetch_pro_legacy(pro_client, project_uuid, proj, proj_dir, sleep)
|
||||||
|
|
||||||
|
|
||||||
@@ -454,6 +491,7 @@ def _fetch_pro_modern(
|
|||||||
proj: dict,
|
proj: dict,
|
||||||
proj_dir: Path,
|
proj_dir: Path,
|
||||||
sleep: float = SLEEP_PRO,
|
sleep: float = SLEEP_PRO,
|
||||||
|
max_source_mb: int | None = None,
|
||||||
) -> dict:
|
) -> dict:
|
||||||
"""Modern Pro 3.x fetcher: full history chain, AES-GCM decrypted, gunzipped,
|
"""Modern Pro 3.x fetcher: full history chain, AES-GCM decrypted, gunzipped,
|
||||||
and partitioned into per-document EPRO2 streams.
|
and partitioned into per-document EPRO2 streams.
|
||||||
@@ -513,11 +551,19 @@ def _fetch_pro_modern(
|
|||||||
cur_doc: str | None = None
|
cur_doc: str | None = None
|
||||||
bytes_blob_total = 0
|
bytes_blob_total = 0
|
||||||
bytes_plain_total = 0
|
bytes_plain_total = 0
|
||||||
|
cap_bytes = max_source_mb * 1024 * 1024 if max_source_mb is not None else None
|
||||||
for h in ordered:
|
for h in ordered:
|
||||||
blob_r = pro_client.get(h["dataStrUrl"], headers={"path": project_uuid})
|
blob_r = pro_client.get(h["dataStrUrl"], headers={"path": project_uuid})
|
||||||
blob_r.raise_for_status()
|
blob_r.raise_for_status()
|
||||||
blob = blob_r.content
|
blob = blob_r.content
|
||||||
bytes_blob_total += len(blob)
|
bytes_blob_total += len(blob)
|
||||||
|
# Trip cap on the encrypted blob total. Hits *after* the offending
|
||||||
|
# download, but before we decrypt/gunzip/partition (those scale with
|
||||||
|
# plain bytes which is even larger). Wipe any partial source/ so disk
|
||||||
|
# doesn't accumulate junk on multi-project runs.
|
||||||
|
if cap_bytes is not None and bytes_blob_total > cap_bytes:
|
||||||
|
shutil.rmtree(src_dir, ignore_errors=True)
|
||||||
|
raise ProjectOversizeError(bytes_blob_total, max_source_mb)
|
||||||
if len(blob) < 16:
|
if len(blob) < 16:
|
||||||
raise RuntimeError(f"history {h['uuid']} blob too short ({len(blob)} B)")
|
raise RuntimeError(f"history {h['uuid']} blob too short ({len(blob)} B)")
|
||||||
ct, tag = blob[:-16], blob[-16:]
|
ct, tag = blob[:-16], blob[-16:]
|
||||||
@@ -849,6 +895,8 @@ def crawl_one(
|
|||||||
fetch_files: bool = True,
|
fetch_files: bool = True,
|
||||||
source_client: httpx.Client | None = None,
|
source_client: httpx.Client | None = None,
|
||||||
pro_source_client: httpx.Client | None = None,
|
pro_source_client: httpx.Client | None = None,
|
||||||
|
skip_exts: set[str] | None = None,
|
||||||
|
max_source_mb: int | None = None,
|
||||||
) -> CrawlResult:
|
) -> CrawlResult:
|
||||||
uuid = list_item["uuid"]
|
uuid = list_item["uuid"]
|
||||||
path = list_item["path"]
|
path = list_item["path"]
|
||||||
@@ -916,6 +964,14 @@ def crawl_one(
|
|||||||
"size": a.get("size"),
|
"size": a.get("size"),
|
||||||
"md5": a.get("md5"),
|
"md5": a.get("md5"),
|
||||||
}
|
}
|
||||||
|
# ext gate: declared `ext` first, fall back to filename suffix. Lower-case
|
||||||
|
# compare; entry kept in metadata so we can re-fetch later if policy changes.
|
||||||
|
ext_token = (a.get("ext") or Path(safe_name).suffix.lstrip(".")).lower()
|
||||||
|
if skip_exts and ext_token in skip_exts:
|
||||||
|
entry["skipped"] = f"ext:{ext_token}"
|
||||||
|
skipped.append(f"{name}: ext:{ext_token}")
|
||||||
|
files_meta.append(entry)
|
||||||
|
continue
|
||||||
if fetch_files:
|
if fetch_files:
|
||||||
try:
|
try:
|
||||||
size, sha = download_to(client, file_url, local_path)
|
size, sha = download_to(client, file_url, local_path)
|
||||||
@@ -950,11 +1006,17 @@ def crawl_one(
|
|||||||
origin = list_item.get("origin")
|
origin = list_item.get("origin")
|
||||||
if origin == "pro" and pro_source_client is not None:
|
if origin == "pro" and pro_source_client is not None:
|
||||||
try:
|
try:
|
||||||
src_meta = fetch_pro_source(pro_source_client, uuid, proj_dir)
|
src_meta = fetch_pro_source(
|
||||||
|
pro_source_client, uuid, proj_dir, max_source_mb=max_source_mb
|
||||||
|
)
|
||||||
print(
|
print(
|
||||||
f" pro source: {len(src_meta.get('source_documents', []))} docs, "
|
f" pro source: {len(src_meta.get('source_documents', []))} docs, "
|
||||||
f"editor={src_meta.get('editor_version')}"
|
f"editor={src_meta.get('editor_version')}"
|
||||||
)
|
)
|
||||||
|
except ProjectOversizeError as e:
|
||||||
|
print(f" pro source SKIPPED (oversize): {e}", file=sys.stderr)
|
||||||
|
skipped.append(f"pro_source: oversize ({e.bytes_so_far // 1024 // 1024} MB > {e.cap_mb} MB)")
|
||||||
|
_record_oversize(out_root, uuid, e)
|
||||||
except Exception as e: # noqa: BLE001
|
except Exception as e: # noqa: BLE001
|
||||||
print(f" pro source FAIL: {e}", file=sys.stderr)
|
print(f" pro source FAIL: {e}", file=sys.stderr)
|
||||||
skipped.append(f"pro_source: {e}")
|
skipped.append(f"pro_source: {e}")
|
||||||
@@ -1088,7 +1150,27 @@ def main(argv: list[str] | None = None) -> int:
|
|||||||
default=PRO_COOKIE_PATH_DEFAULT,
|
default=PRO_COOKIE_PATH_DEFAULT,
|
||||||
help="path to file with Cookie header for pro.lceda.cn",
|
help="path to file with Cookie header for pro.lceda.cn",
|
||||||
)
|
)
|
||||||
|
ap.add_argument(
|
||||||
|
"--skip-ext",
|
||||||
|
type=str,
|
||||||
|
default=None,
|
||||||
|
help="comma-separated list of attachment extensions to skip (e.g. mp4,qt,mov). "
|
||||||
|
"Saves ~30-50%% LFS storage on average. Entry still recorded in metadata.json "
|
||||||
|
"with skipped:ext:<token> so we can re-fetch later.",
|
||||||
|
)
|
||||||
|
ap.add_argument(
|
||||||
|
"--max-source-mb",
|
||||||
|
type=int,
|
||||||
|
default=None,
|
||||||
|
help="skip Pro modern projects whose chain blob total exceeds N MB. "
|
||||||
|
"Trips inside the chain loop, wipes partial source/, records to "
|
||||||
|
"data/state/oshwhub_pro_oversize.jsonl. No effect on Std or Pro 2.x legacy.",
|
||||||
|
)
|
||||||
args = ap.parse_args(argv)
|
args = ap.parse_args(argv)
|
||||||
|
skip_exts: set[str] | None = (
|
||||||
|
{x.strip().lower().lstrip(".") for x in args.skip_ext.split(",") if x.strip()}
|
||||||
|
if args.skip_ext else None
|
||||||
|
)
|
||||||
|
|
||||||
n_target = args.limit if args.limit is not None else args.top
|
n_target = args.limit if args.limit is not None else args.top
|
||||||
args.out.mkdir(parents=True, exist_ok=True)
|
args.out.mkdir(parents=True, exist_ok=True)
|
||||||
@@ -1099,7 +1181,10 @@ def main(argv: list[str] | None = None) -> int:
|
|||||||
return _run_backfill_source(args.out, only_uuids=args.uuids)
|
return _run_backfill_source(args.out, only_uuids=args.uuids)
|
||||||
if args.backfill_pro_source:
|
if args.backfill_pro_source:
|
||||||
return _run_backfill_pro_source(
|
return _run_backfill_pro_source(
|
||||||
args.out, only_uuids=args.uuids, cookie_path=args.pro_cookie
|
args.out,
|
||||||
|
only_uuids=args.uuids,
|
||||||
|
cookie_path=args.pro_cookie,
|
||||||
|
max_source_mb=args.max_source_mb,
|
||||||
)
|
)
|
||||||
|
|
||||||
with make_client() as client:
|
with make_client() as client:
|
||||||
@@ -1149,6 +1234,8 @@ def main(argv: list[str] | None = None) -> int:
|
|||||||
fetch_files=not args.no_files,
|
fetch_files=not args.no_files,
|
||||||
source_client=source_client_ctx,
|
source_client=source_client_ctx,
|
||||||
pro_source_client=pro_source_client_ctx,
|
pro_source_client=pro_source_client_ctx,
|
||||||
|
skip_exts=skip_exts,
|
||||||
|
max_source_mb=args.max_source_mb,
|
||||||
)
|
)
|
||||||
print(
|
print(
|
||||||
f" OK: {r.files_count} files, {r.bytes_total / 1024 / 1024:.1f} MB "
|
f" OK: {r.files_count} files, {r.bytes_total / 1024 / 1024:.1f} MB "
|
||||||
@@ -1217,6 +1304,7 @@ def _run_backfill_pro_source(
|
|||||||
out_root: Path,
|
out_root: Path,
|
||||||
only_uuids: str | None = None,
|
only_uuids: str | None = None,
|
||||||
cookie_path: str = PRO_COOKIE_PATH_DEFAULT,
|
cookie_path: str = PRO_COOKIE_PATH_DEFAULT,
|
||||||
|
max_source_mb: int | None = None,
|
||||||
) -> int:
|
) -> int:
|
||||||
"""Walk per-project dirs in out_root, fetch Pro source for origin=pro projects.
|
"""Walk per-project dirs in out_root, fetch Pro source for origin=pro projects.
|
||||||
|
|
||||||
@@ -1253,7 +1341,13 @@ def _run_backfill_pro_source(
|
|||||||
meta = json.loads(meta_path.read_text(encoding="utf-8"))
|
meta = json.loads(meta_path.read_text(encoding="utf-8"))
|
||||||
print(f"[{i}/{len(targets)}] {uuid} ({meta.get('title', '?')})")
|
print(f"[{i}/{len(targets)}] {uuid} ({meta.get('title', '?')})")
|
||||||
try:
|
try:
|
||||||
src_meta = fetch_pro_source(pro_client, uuid, proj_dir)
|
src_meta = fetch_pro_source(
|
||||||
|
pro_client, uuid, proj_dir, max_source_mb=max_source_mb
|
||||||
|
)
|
||||||
|
except ProjectOversizeError as e:
|
||||||
|
print(f" SKIPPED (oversize): {e}", file=sys.stderr)
|
||||||
|
_record_oversize(out_root, uuid, e)
|
||||||
|
continue
|
||||||
except Exception as e: # noqa: BLE001
|
except Exception as e: # noqa: BLE001
|
||||||
print(f" FAIL: {e}", file=sys.stderr)
|
print(f" FAIL: {e}", file=sys.stderr)
|
||||||
continue
|
continue
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"project_uuid": "ba64bd6f1c9c467ba3b674a54943557d",
|
"project_uuid": "ba64bd6f1c9c467ba3b674a54943557d",
|
||||||
"branch_uuid": "ef5f58bd0f1245b0a808c07e541a1b5c",
|
"branch_uuid": "ef5f58bd0f1245b0a808c07e541a1b5c",
|
||||||
"head_uuid": "764dd8b722a44914a915493277e204c9",
|
"head_uuid": "764dd8b722a44914a915493277e204c9",
|
||||||
"fetched_at": "2026-04-28T16:06:55.434479+00:00",
|
"fetched_at": "2026-04-28T16:23:06.697278+00:00",
|
||||||
"editor_version": "3.2.91",
|
"editor_version": "3.2.91",
|
||||||
"chain_length": 12,
|
"chain_length": 12,
|
||||||
"blob_bytes_total": 1195716,
|
"blob_bytes_total": 1195716,
|
||||||
|
|||||||
50
data/state/oshwhub_batch50_candidates.jsonl
Normal file
50
data/state/oshwhub_batch50_candidates.jsonl
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
{"owner": {"nickname": "pengzhihui", "avatar": "/image/avatar-default.png", "team": false, "uuid": "07d6c15e714c4f6aaba8aa0c3737379e", "username": "pengzhihui"}, "thumb": "//image.lceda.cn/pullimage/3X5wPID5TfY2QATyzcLAeXExhakaDHZSGnFrsTC3.jpeg", "origin": "pro", "count": {"fork": 0, "star": 3157, "like": 2137, "watch": 0, "views": 329510}, "created_at": "2022-08-20T04:18:00.000Z", "uuid": "c4aad9461c3941228a784944eb500757", "tags": [], "path": "pengzhihui/b11afae464c54a3e8d0f77e1f92dc7b7", "public": true, "updated_at": "2026-02-24T03:18:19.000Z", "members": ["07d6c15e714c4f6aaba8aa0c3737379e"], "grade": 4, "publish": true, "name": "【瀚文】HelloWord-Keyboard", "oshwhub_publish_at": "2023-08-28T08:11:34.000Z", "introduction": "`瀚文` 智能键盘是一把我为自己使用需求设计的 多功能、模块化 机械键盘。", "comments_count": 586}
|
||||||
|
{"owner": {"nickname": "Sngels_wyh", "avatar": "//image.lceda.cn/avatars/2024/12/s9etBtOA1q39LNLVZsfmkSrhj2DlgmIL2wFnv7f1.webp", "team": false, "uuid": "f5e5983cd8e94ba3b7f01b6e21d709b8", "username": "sngelswyh"}, "thumb": "https://image.lceda.cn/oshwhub/pullImage/35077647fee7471cb3f2dacc50ec3b37.jpg", "origin": "pro", "count": {"fork": 0, "star": 2766, "like": 1525, "watch": 0, "views": 362182}, "created_at": "2024-12-15T08:48:43.151Z", "uuid": "d865cb8992f1437ca728ed11b9ec9421", "tags": [], "path": "sngelswyh/stm32-smart-desktop-pet", "public": true, "updated_at": "2026-03-29T11:08:51.451Z", "members": ["f5e5983cd8e94ba3b7f01b6e21d709b8"], "grade": 3, "publish": true, "name": "STM32智能桌面宠物", "oshwhub_publish_at": "2026-03-30T03:13:02.395Z", "introduction": "可以进行一些简单的交流互动,立正,前进,后退,左转,右转,摇尾巴,趴下,蹲下,睡觉,向前跳,打招呼,伸懒腰等,一般用于放置桌面上。语音可以自定义设置,需要到智能公元网站自行配置。", "comments_count": 698}
|
||||||
|
{"owner": {"nickname": "不吃油炸鸡", "avatar": "//image.lceda.cn/avatars/2023/3/78VoBEi9LuHrNvVduuFevnBfZJysXc0Awt3RxNPi.png", "team": false, "uuid": "f7bcdbf6b47c41bdb9ee2f15c10033a9", "username": "no_chicken"}, "thumb": "https://image.lceda.cn/oshwhub/pullImage/532f00b2d581404bbce37aedaa31ab45.jpeg", "origin": "pro", "count": {"fork": 0, "star": 3422, "like": 1397, "watch": 0, "views": 361711}, "created_at": "2023-05-06T12:09:09.000Z", "uuid": "da55d50b394b4553bbcb799dc27a7e63", "path": "no_chicken/zhi-neng-shou-biao-OV-Watch_V2.2", "public": true, "updated_at": "2026-03-20T10:38:26.000Z", "members": ["f7bcdbf6b47c41bdb9ee2f15c10033a9"], "grade": 4, "publish": true, "name": "智能手表OV-Watch", "oshwhub_publish_at": "2025-12-29T03:42:25.000Z", "introduction": "功能包括日历、计算器、秒表、NFC、蓝牙无线升级、与手机传信息、抬腕亮屏、心率检测、环境温湿度检测、指南针、海拔测量等功能。已经尽量满足现在智能手表的功能,后期大家可以继续添加修改很多东西~", "comments_count": 374}
|
||||||
|
{"owner": {"nickname": "小O和小Q", "avatar": "//image.lceda.cn/pullimage/vPyLIOw60BN9Qi0mLwe2Dm5rZApORWMzFKMmLfvu.jpeg", "team": false, "uuid": "9ff80e24b505422a87c592cd4c6efb69", "username": "littleoandlittleq"}, "thumb": "//image.lceda.cn/pullimage/jDqTDFPFZtipYNYB0YLY3eLCALiFStAnJA1XThW3.jpeg", "origin": "pro", "count": {"fork": 0, "star": 2257, "like": 994, "watch": 0, "views": 218248}, "created_at": "2022-09-12T11:49:10.000Z", "uuid": "977b637a85fa44fbb5d4214373576a04", "path": "littleoandlittleq/bian-xie-jia-re-tai", "public": true, "updated_at": "2026-04-03T01:41:10.000Z", "members": ["9ff80e24b505422a87c592cd4c6efb69"], "grade": 4, "publish": true, "name": "[PD协议 | 高颜值]mini加热台", "oshwhub_publish_at": "2023-07-27T01:58:31.000Z", "introduction": "超迷你的加热台,PD20V供电,加热面大小5.6*5.6cm,可以通过两个按键设置参数。", "comments_count": 728}
|
||||||
|
{"owner": {"nickname": "乐鑫小铁匠", "avatar": "//image.lceda.cn/avatars/2023/7/DgnM9iWggXtWZa70BQwJnpb1x7P2etO5s7i6vqxp.png", "team": false, "uuid": "16555ec60452466ea4dbaa7c6b92cd89", "username": "esp-college"}, "thumb": "//image.lceda.cn/pullimage/YyPkhuGTNedxg6yM3fkJBovQB2b56pCCJb27zQjN.png", "origin": "pro", "count": {"fork": 0, "star": 2135, "like": 837, "watch": 0, "views": 304205}, "created_at": "2024-10-15T03:45:10.000Z", "uuid": "91fd41224cd74ffd8410bc77b216693b", "tags": [], "path": "esp-college/esp-sparkbot", "public": true, "updated_at": "2025-11-11T10:24:51.000Z", "members": ["f7922f3e92344fd69adf06f12263ee47", "a1aad839debe49d9b890a35890f849c6", "16555ec60452466ea4dbaa7c6b92cd89"], "grade": 3, "publish": true, "name": "ESP-SparkBot", "oshwhub_publish_at": "2025-03-12T05:42:19.000Z", "introduction": "ESP-SparkBot 基于 ESP32-S3,融合语音交互、图像识别与多媒体娱乐,可变身遥控小车、玩转本地 AI,支持大模型对话、实时视频传输和高清视频投屏,性能强大,乐趣无限!", "comments_count": 343}
|
||||||
|
{"owner": {"nickname": "Expert电子实验室", "avatar": "//image.lceda.cn/avatars/2023/3/YDZJyXLzXAX9CWyRpUeunFB4pdQrUx1uELdJytUC.png", "team": false, "uuid": "33e19026ed794dc99d07c4686fe7eb17", "username": "expert"}, "thumb": "//image.lceda.cn/oshwhub/ee5d2d79720249efa47d42b06483ead2.png", "origin": "pro", "count": {"fork": 0, "star": 2024, "like": 804, "watch": 0, "views": 135854}, "created_at": "2024-09-23T16:22:19.000Z", "uuid": "c8142997cb5c4e43acc5be42f54be6d2", "award_uuid": "e758bcd689234446a2b7ef4e90ef50a5", "path": "expert/gai-jin-xin-exlink-duo-gong-neng-diao-shi-qi-fen-li-die-ban", "public": true, "updated_at": "2026-03-18T07:05:51.000Z", "members": ["33e19026ed794dc99d07c4686fe7eb17"], "grade": 4, "publish": true, "name": "Exlink最好用的嵌入式多功能调试器", "oshwhub_publish_at": "2025-08-25T02:11:58.000Z", "introduction": "Exlink是一款基于ESP32S3设计的优雅的嵌入式多功能调试器,具有DAPlink、逻辑分析仪、串口助手、数控电源、无线下载器、无线串口、简易示波器等十余种不同功能,涵盖大部分嵌入式调试场景。", "comments_count": 530, "award_info": {"name": "星火2024高阶一等奖", "image": "https://image.lceda.cn/easyedaResource/images/d54874e35af645b4948763aba5bb5cea.png", "links": "https://oshwhub.com/recommend/activities%20III", "uuid": "e758bcd689234446a2b7ef4e90ef50a5"}}
|
||||||
|
{"owner": {"nickname": "EDA课程案例团队", "avatar": "//image.lceda.cn/avatar/jzC6S6odSY18Wlyl8LVUDrnabeedBVOtLS8EyUmL.png", "team": true, "uuid": "ebbda44292b4423b92db6e999d50f4d4", "username": "course-examples"}, "thumb": "//image.lceda.cn/pullimage/vZ4gYlm4aPajQfTGsAfyIPsZu12NXrt3CZIDGgGx.jpeg", "origin": "pro", "count": {"fork": 0, "star": 1824, "like": 708, "watch": 0, "views": 199957}, "created_at": "2023-12-25T08:15:57.000Z", "uuid": "5e03b6545745463bb8b64813209ffb8c", "tags": [], "path": "course-examples/yi-qi-yi-biao-jian-yi-shu-zi-shi-bo-qi-she-ji-cha-jian-ban", "public": true, "updated_at": "2026-04-05T03:44:46.000Z", "members": ["cbb9d417f71441f78575dff6d9732aae", "1f391f553d454e5aaee93777ca35939c", "43c71ae1e8eb459785a5a6bd7899aea7", "7bb15a0fdb7c4c20ac6e8cc87ae87d6a", "ece185a2bf4d46218fc0dab0af6739d4"], "grade": 4, "publish": true, "name": "简易数字示波器设计(入门版)", "oshwhub_publish_at": "2026-01-16T09:07:45.000Z", "introduction": "打造一套针对电子爱好者及学生学习数字示波器的基础项目,以单片机核心板与插件元器件结合起来,十分适合入门学习!", "comments_count": 390}
|
||||||
|
{"owner": {"nickname": "黑马小乌龟", "avatar": "//image.lceda.cn/avatars/2025/9/x4ppQaoWrzq5ZwDsGj1hgXmSrzcX7euCZsgz45hE.webp", "team": false, "uuid": "1eb895ea1970464ba4a8e4a1565b0830", "username": "bryan_he"}, "thumb": "//image.lceda.cn/pullimage/Lrf0ZtIUAbrwgDC24lEzoJTsYs5s5klsd8n0YPay.jpeg", "origin": "pro", "count": {"fork": 0, "star": 1578, "like": 928, "watch": 0, "views": 112602}, "created_at": "2024-01-10T09:31:52.000Z", "uuid": "ddcc963f6e234ee5b25bdf62d13c4a6b", "award_uuid": "e50644433a0e443cb38c273458a79345", "path": "bryan_he/usb_dc_ps", "public": true, "updated_at": "2025-12-22T15:18:17.000Z", "members": ["1eb895ea1970464ba4a8e4a1565b0830"], "grade": 4, "publish": true, "name": "【星火计划】USB可编程电源/功率监测", "oshwhub_publish_at": "2024-11-01T06:26:49.000Z", "introduction": "【星火计划】USB可编程电源/功耗监测,小程序控制,\n支持USB PD3.0,BC1.2协议,支持5V~20V输入,\n宽范围的输出电压,从2.7V ~ 20V可调,3A的带载能力", "comments_count": 389, "award_info": {"name": "星火2024初级优秀奖", "image": "https://image.lceda.cn/easyedaResource/images/bdf7c58b5f6341a29ea4ca0e53324392.png", "links": "https://oshwhub.com/recommend/activities%20III", "uuid": "e50644433a0e443cb38c273458a79345"}}
|
||||||
|
{"owner": {"nickname": "蓝星多面体", "avatar": "//image.lceda.cn/avatars/2025/3/hJUtxYRZcsSwXDf2DDfcpjVjPIVw1VoXtmOpVtQl.webp", "team": false, "uuid": "67341ef1bd084fdc82253c172303c478", "username": "ran-pang"}, "thumb": "//image.lceda.cn/oshwhub/bc1b869340da45b5b133f7873ef0316b.png", "origin": "pro", "count": {"fork": 0, "star": 1702, "like": 844, "watch": 0, "views": 140596}, "created_at": "2024-04-09T03:31:50.000Z", "uuid": "6f0c151b366d46fe90126093dd604afe", "award_uuid": "c5dd7f6930b54ae59e009396cf677215", "path": "ran-pang/multifunctional-keyboard", "public": true, "updated_at": "2026-03-02T03:04:18.131Z", "members": ["67341ef1bd084fdc82253c172303c478"], "grade": 4, "publish": true, "name": "承载我所有幻想的键盘", "oshwhub_publish_at": "2026-03-02T03:05:48.000Z", "introduction": "支持WIFI的4模机械键盘(USB、蓝牙、WIFI、2.4G接收器),搭载可拆卸FOC旋钮屏,支持SurfaceDial,支持多功能磁吸扩展(例如小键盘等),支持语音交互。", "comments_count": 168, "award_info": {"name": "星火2024高阶特等奖", "image": "https://image.lceda.cn/easyedaResource/images/49f42601ab1343eaa730ce7ef4f1eba1.png", "links": "https://oshwhub.com/recommend/activities%20III", "uuid": "c5dd7f6930b54ae59e009396cf677215"}}
|
||||||
|
{"owner": {"nickname": "小李电子实验室", "avatar": "//image.lceda.cn/avatars/2023/10/IGaX9IOU3oPdDoIp7MX6D6k1um7rbjoOOGwTJ84z.png", "team": false, "uuid": "19aab6b29e4b41dc8c821d2a6c008f02", "username": "lxu0423"}, "thumb": "//image.lceda.cn/oshwhub/80e9753174914f49b84889f0d552b457.jpg", "origin": "pro", "count": {"fork": 0, "star": 1482, "like": 634, "watch": 0, "views": 136810}, "created_at": "2024-09-09T09:41:55.642Z", "uuid": "126f1a61e36a4e859cd7a0c15ddcefe5", "award_uuid": "866441ba45bb4cd58f81a4d25986d14d", "tags": [], "path": "lxu0423/lithermal-thermal-imaging-camera", "public": true, "updated_at": "2025-03-23T22:11:50.000Z", "members": ["19aab6b29e4b41dc8c821d2a6c008f02"], "grade": 4, "publish": true, "name": "[LiThermal] 热成像相机", "oshwhub_publish_at": "2024-12-30T01:07:54.000Z", "introduction": "基于全志T113-S3和海康威视4117的热成像相机", "comments_count": 575, "award_info": {"name": "星火2024高阶二等奖", "image": "https://image.lceda.cn/easyedaResource/images/2d45dd35d22e4b26bbac002f9d1d7b9b.png", "links": "https://oshwhub.com/recommend/activities%20III", "uuid": "866441ba45bb4cd58f81a4d25986d14d"}}
|
||||||
|
{"owner": {"nickname": "EDA课程案例团队", "avatar": "//image.lceda.cn/avatar/jzC6S6odSY18Wlyl8LVUDrnabeedBVOtLS8EyUmL.png", "team": true, "uuid": "ebbda44292b4423b92db6e999d50f4d4", "username": "course-examples"}, "thumb": "//image.lceda.cn/oshwhub/b5a3370cb7994efc8d4051635879d0a1.jpg", "origin": "pro", "count": {"fork": 0, "star": 1259, "like": 470, "watch": 0, "views": 152521}, "created_at": "2024-11-29T03:28:45.000Z", "uuid": "8101a18ad83a49b8937b4c3b25d4490a", "tags": [], "path": "course-examples/bot-dog", "public": true, "updated_at": "2025-12-13T09:17:08.000Z", "members": ["88f0d6ac70c547ac8f46fa5c32e4a316", "cbb9d417f71441f78575dff6d9732aae", "1f391f553d454e5aaee93777ca35939c"], "grade": 4, "publish": true, "name": "EDA-Robot机器狗", "oshwhub_publish_at": "2025-11-19T01:45:41.000Z", "introduction": "此项目采用ESP8266主控,支持手机遥控,采用插件封装,非常适合新手焊接。", "comments_count": 754}
|
||||||
|
{"owner": {"nickname": "科技大卜玩", "avatar": "//image.lceda.cn/avatars/2023/8/iivPJo2WDI8YeDC26hjjikYyahm7p9l8QLU2Xusj.png", "team": false, "uuid": "33524017c335440c83753c5f5dde11c1", "username": "bukaiyuan"}, "thumb": "//image.lceda.cn/pullimage/F1q5Xo9lCwwJJ46DYpTFkR3KA8CXI8DGy76ZgKoi.jpeg", "origin": "pro", "count": {"fork": 0, "star": 1634, "like": 828, "watch": 0, "views": 123542}, "created_at": "2023-08-01T13:42:52.000Z", "uuid": "2246f96d10b04e94bf3170bb4837d647", "award_uuid": "351adf59fe9247518a3a00311c718f4d", "tags": [], "path": "bukaiyuan/ESP32-hang-mu-yao-kong-qi", "public": true, "updated_at": "2026-04-24T01:47:05.000Z", "members": ["33524017c335440c83753c5f5dde11c1"], "grade": 3, "publish": true, "name": "ESP32 万能遥控器", "oshwhub_publish_at": "2023-09-27T05:44:40.000Z", "introduction": "基于ESP32-S3做一个万能的遥控器,作为以后各种RC模型,机器人的通用控制方案。\n还可以蓝牙连接电脑玩游戏,或者在遥控器上玩自己编写的游戏。", "comments_count": 191, "award_info": {"name": "星火2023自由二等奖", "image": "https://image.lceda.cn/easyedaResource/images/bda97f4e6096447791a6c6421a6cffd3.png", "links": "https://oshwhub.com/recommend/activities%20II", "uuid": "351adf59fe9247518a3a00311c718f4d"}}
|
||||||
|
{"owner": {"nickname": "小渣渣", "avatar": "//image.lceda.cn/avatars/2021/1/fd4EGq1OrDGMMae1XY5msOL6J6plEol13Wf8IPhm.jpeg", "team": false, "uuid": "26fa92c7af6f431490e2da8805f1d791", "username": "myzhazha"}, "thumb": "//image.lceda.cn/pullimage/qbr0oZSUa25qiNIioPT4PUzSCSwWAuzERX8WnuHC.jpeg", "origin": "pro", "count": {"fork": 0, "star": 1419, "like": 666, "watch": 0, "views": 141262}, "created_at": "2022-09-01T09:15:36.000Z", "uuid": "53e6c236b9d14e74944e460ac11c7c1d", "tags": [], "path": "myzhazha/esp32s3_86-kai-fa-ban", "public": true, "updated_at": "2025-12-29T06:58:15.000Z", "members": ["26fa92c7af6f431490e2da8805f1d791"], "grade": 4, "publish": true, "name": "ESP32S3 86盒开发板 带触摸", "oshwhub_publish_at": "2024-01-02T02:06:18.000Z", "introduction": "使用ESP32S3N8R8作为主控的86面板开发板,带触摸带扬声器,可用于86面板开发,LVGL开发", "comments_count": 325}
|
||||||
|
{"owner": {"nickname": "未来电子工作室", "avatar": "//image.lceda.cn/avatar/zqSh6Yw1O37QCPOMDXbTdlodHuQ61J66gbIPOAnb.png", "team": true, "uuid": "fca3941cdb75438d9b2a128be1be731b", "username": "wei-lai-dian-zi-gong-zuo-shi"}, "thumb": "//image.lceda.cn/pullimage/RbtzBBvdIJIdAxBUtjynAvNDdGU55JWdusa1Y7Wk.png", "origin": "pro", "count": {"fork": 0, "star": 1471, "like": 753, "watch": 0, "views": 127493}, "created_at": "2022-09-11T01:55:17.000Z", "uuid": "a670e60acee54566a9f3e841bb634274", "tags": [], "path": "wei-lai-dian-zi-gong-zuo-shi/qian-ru-shi-ji-yu-stc32-de-zhi-nen-xiao-che-she-ji", "public": true, "updated_at": "2026-01-19T09:45:29.000Z", "members": ["29f4e3b4d7124899a00c47191347fe01", "09e443533d9445f181e6d24aaab68f47"], "grade": 4, "publish": true, "name": "【嵌入式】逐梦壹号-基于STC32的智能小车设计", "oshwhub_publish_at": "2023-09-14T12:30:21.000Z", "introduction": "如果说小时候有什么梦想,那可能就是想拥有一辆属于自己的四驱车了。为了圆造车梦,将电路学习、PCB设计、焊接与单片机开发结合起来,真正做到零基础学习,这辆小车我们便给它取名为:逐梦壹号。", "comments_count": 224}
|
||||||
|
{"owner": {"nickname": "画板当吃生菜", "avatar": "//image.lceda.cn/avatars/2020/7/cSvEeXEMvT02Z4q7FdMG0Nln8xGdBtytpMGf57lu.jpeg", "team": false, "uuid": "235e0ca983624789a6f0492cd5a4b512", "username": "yangzen"}, "thumb": "//image.lceda.cn/pullimage/CNLYX16K1KVs8dV2DftiiriK7beCyFGqOqwhB0rZ.jpeg", "origin": "pro", "count": {"fork": 0, "star": 1124, "like": 685, "watch": 0, "views": 150162}, "created_at": "2022-06-09T02:30:50.000Z", "uuid": "3e3c7725251c4456ad91cd88308944ff", "tags": [], "path": "yangzen/xing-huo-ji-hua-zui-gai-17-4-chu-mo-ji-xie-jian-pan-pro", "public": true, "updated_at": "2025-12-28T05:40:29.000Z", "members": ["235e0ca983624789a6f0492cd5a4b512"], "grade": 3, "publish": true, "name": "最丐17+4TPRO机械键盘", "oshwhub_publish_at": "2025-10-11T03:00:53.000Z", "introduction": "2025年10月11日稳定性更新: \n1. 修复上报32位坐标溢出的问题\n2. 每次W11_LAMP更新时切换到在线模式\n3. 屏蔽休眠恢复后的重加载功能", "comments_count": 376}
|
||||||
|
{"owner": {"nickname": "logicworld", "avatar": "https://u.lceda.cn/images/avatar-default.png?id=f119c61e3d5ce714b4b8", "team": false, "uuid": "0d18a61fce2a475c94847e0ea05339a5", "username": "logicworld"}, "thumb": "//image.lceda.cn/pullimage/UZTlVGjHIwdTBM7U8a8MdYdS6STOC7WwmBpuVb6J.jpeg", "origin": "pro", "count": {"fork": 0, "star": 1459, "like": 694, "watch": 0, "views": 146963}, "created_at": "2022-11-06T14:43:51.000Z", "uuid": "72312817efb6449ca520216c820c432c", "path": "logicworld/h6_board", "public": true, "updated_at": "2026-04-15T05:12:30.000Z", "members": ["0d18a61fce2a475c94847e0ea05339a5"], "grade": 4, "publish": true, "name": "全志H6开发板-从零入门ARM高速电路设计", "oshwhub_publish_at": "2023-12-11T05:43:19.000Z", "introduction": "本项目开源主要目的是帮助想学ARM高速电路的小伙伴们,学会自己做一个ARM开发板(eg. 全志H6开发板)。快来看看是否真从零入门,有手就行!", "comments_count": 166}
|
||||||
|
{"owner": {"nickname": "阿慕希", "avatar": "//image.lceda.cn/avatars/2024/6/cfdfLOu4ziNFDsbLngPDY0VKpWKP9zj23wWGJbgR.png", "team": false, "uuid": "5f08c597e56a41bab8e5ee2500cedc61", "username": "movecall"}, "thumb": "//image.lceda.cn/pullimage/wxmiS0dRdmrR71POPSkSyTfii6qWXkzHAj9lmicv.png", "origin": "pro", "count": {"fork": 0, "star": 1108, "like": 389, "watch": 0, "views": 174750}, "created_at": "2025-01-14T12:58:20.977Z", "uuid": "f2a2530d6e1848109aeda5fd5f9e38d9", "tags": [], "path": "movecall/moji-xiaozhi-ai-derivative-editi", "public": true, "updated_at": "2025-10-14T08:14:34.000Z", "members": ["5f08c597e56a41bab8e5ee2500cedc61"], "grade": 3, "publish": true, "name": "Moji 小智AI衍生版", "oshwhub_publish_at": "2025-03-22T07:15:23.000Z", "introduction": "Moji,基于 小智AI 的桌面摆件,兼具智能与温暖,既是助手也是伙伴,以智慧解决问题,用温柔陪伴生活,让每一天更美好。", "comments_count": 530}
|
||||||
|
{"owner": {"nickname": "海底撩", "avatar": "//image.lceda.cn/avatars/2022/4/rohgFIfiQiw8oJLnw73FNjBHqLkf6vxaWtsWga5l.png", "team": false, "uuid": "f2352062eb974a6abed1282c2764c3c7", "username": "eda_rgprdhwej"}, "thumb": "//image.lceda.cn/pullimage/SlO722DEICOgmKA2CqLCoWEJEgAZa9Ue92W7scYW.jpeg", "origin": "pro", "count": {"fork": 0, "star": 1528, "like": 595, "watch": 0, "views": 114268}, "created_at": "2022-08-21T16:07:40.000Z", "uuid": "8624bf3d43ba4732bb256c08aafe186b", "path": "eda_rgprdhwej/chappie_oshw", "public": true, "updated_at": "2026-02-23T23:34:38.000Z", "members": ["f2352062eb974a6abed1282c2764c3c7"], "grade": 4, "publish": true, "name": "【ESP32-S3】1.69寸触摸屏迷你控制器~", "oshwhub_publish_at": "2022-12-02T01:17:24.000Z", "introduction": "基于ESP32-S3,板载1.69寸LCD总成接口、蜂鸣器、SD卡槽、AXP173电源管理,双排母引出大部分引脚供底板拓展功能。", "comments_count": 232}
|
||||||
|
{"owner": {"nickname": "DroneCYF", "avatar": "https://diy.szlcsc.com/images/avatar-default.png?id=f119c61e3d5ce714b4b8", "team": false, "uuid": "cf041e4192a545a4a2767f7cde799341", "username": "clz1"}, "thumb": "//image.lceda.cn/pullimage/rKZs6yrLjl0v060PRD6pKJvTSms8ezjeh4lIlcq4.jpeg", "origin": "pro", "count": {"fork": 0, "star": 1271, "like": 776, "watch": 0, "views": 81317}, "created_at": "2022-09-13T02:38:49.000Z", "uuid": "0bc142e0f24e4b06ab6d555f935eca98", "tags": [], "path": "clz1/5.8Ghztu-zhuan", "public": true, "updated_at": "2026-01-31T08:24:49.000Z", "members": ["cf041e4192a545a4a2767f7cde799341", "48b1a4d1fc304f0196652ae2055ff568"], "grade": 4, "publish": true, "name": "飞行器设计之5.8Ghz图传", "oshwhub_publish_at": "2023-09-11T07:13:46.000Z", "introduction": "此工程主要是进行飞行器的5.8Ghz图传设计,实现飞行器上摄像头视频信号的发射。主要包括原理图设计、PCB设计和电路仿真。原理图和PCB设计最多占此工程工作量的30%,电路仿真是非常耗时且繁琐过程。", "comments_count": 184}
|
||||||
|
{"owner": {"nickname": "黑马小乌龟", "avatar": "//image.lceda.cn/avatars/2025/9/x4ppQaoWrzq5ZwDsGj1hgXmSrzcX7euCZsgz45hE.webp", "team": false, "uuid": "1eb895ea1970464ba4a8e4a1565b0830", "username": "bryan_he"}, "thumb": "//image.lceda.cn/oshwhub/02c786878782461daaea1f2679e947c3.jpg", "origin": "pro", "count": {"fork": 0, "star": 1314, "like": 521, "watch": 0, "views": 112947}, "created_at": "2024-06-25T12:38:31.001Z", "uuid": "03b939e5e6e544408e0879202ebc20ce", "award_uuid": "ccbd9d8bfa7c4579b974a34a88c22654", "tags": [], "path": "bryan_he/usb-ps-v30", "public": true, "updated_at": "2025-12-19T00:37:21.000Z", "members": ["1eb895ea1970464ba4a8e4a1565b0830"], "grade": 4, "publish": true, "name": "USB可调电源V3,硬件V4.7全面升级", "oshwhub_publish_at": "2025-03-17T01:45:41.000Z", "introduction": "USB可调电源,输入防倒灌防反接,输出防倒灌,支持USB PD3.0,BC1.2等,DC 5V~27V输入,输出电压2V ~ 34V连续可调,大于5A的带载能力,限流10mA~8A连续可调", "comments_count": 292, "award_info": {"name": "星火2024高阶鼓励奖", "image": "https://image.lceda.cn/easyedaResource/images/70856a22656a4ca0980c216cff62fb82.png", "links": "https://oshwhub.com/recommend/activities%20III", "uuid": "ccbd9d8bfa7c4579b974a34a88c22654"}}
|
||||||
|
{"owner": {"nickname": "_buerchen", "avatar": "//image.lceda.cn/avatars/2021/11/FIwXX4xWQ057hcqauUlWZM1ja4G8DwiD8TwhQGtT.png", "team": false, "uuid": "110e585640d34b5fb6cf40cad05cf172", "username": "buerchen"}, "thumb": "//image.lceda.cn/pullimage/ISDYxW65ecUhy445f7Zox1TZqXdNaLGWWTKuZMfG.jpeg", "origin": "pro", "count": {"fork": 0, "star": 1049, "like": 570, "watch": 0, "views": 81684}, "created_at": "2022-05-02T11:59:59.000Z", "uuid": "c610a9bc18ac4a17a88ab6e427a25d6f", "path": "buerchen/t12-han-bi-v6-1", "public": true, "updated_at": "2026-03-16T03:41:16.000Z", "members": ["110e585640d34b5fb6cf40cad05cf172"], "grade": 4, "publish": true, "name": "T12焊笔v6.1", "oshwhub_publish_at": "2023-07-03T08:02:40.000Z", "introduction": "新版T12焊笔替换0.5寸OLED 88*48 CH1115驱动 IIC ,兼容ESP8266和ESP8285,新增3D打印外壳。", "comments_count": 485}
|
||||||
|
{"owner": {"nickname": "雷老师讲电子", "avatar": "//image.lceda.cn/avatars/2023/9/V7aSCjFByVCbbbG8pOAFUUywTGdBC5xEYMzM0xbV.png", "team": false, "uuid": "a481b71acdb44a3f8c8a15fe621c992f", "username": "leichaolin"}, "thumb": "//image.lceda.cn/pullimage/MRyi3ahztovD8GJ41WF45V4kDsBxmjORiGMJMfgG.jpeg", "origin": "pro", "count": {"fork": 0, "star": 1102, "like": 536, "watch": 0, "views": 119662}, "created_at": "2023-02-26T06:48:02.000Z", "uuid": "d46ef2f68e334a72961d48ba0cfbcae2", "award_uuid": "a4afb270021b4ab0913ee4ada36cef8e", "path": "leichaolin/xing-huo-ji-hua-3.5KWda-gong-shu", "public": true, "updated_at": "2025-09-10T00:24:08.000Z", "members": ["a481b71acdb44a3f8c8a15fe621c992f", "acdc8201ac3f4aeea678af40bd97cb50"], "grade": 4, "publish": true, "name": "3.5KW大功率逆变器 【星火计划】", "oshwhub_publish_at": "2023-08-30T05:53:35.000Z", "introduction": "输入24-72V输出220V的3.5KW逆变器", "comments_count": 256, "award_info": {"name": "星火2023外包一等奖", "image": "https://image.lceda.cn/easyedaResource/images/d089a0fd5b4245a48ee80e0bdf97c1b8.png", "links": "https://oshwhub.com/recommend/activities%20II", "uuid": "a4afb270021b4ab0913ee4ada36cef8e"}}
|
||||||
|
{"owner": {"nickname": "上电冒烟", "avatar": "//image.lceda.cn/avatars/2021/12/HK3qoDozjgNONK1dVGVl16ir8AOmQNVC18DS0Tp5.png", "team": false, "uuid": "63725c4e64e5478099fa821cabcea5b5", "username": "z_star"}, "thumb": "//image.lceda.cn/pullimage/kIcEEUbe0wdv3WwOSfGTZD6PCBvrU3Zomxe6voan.jpeg", "origin": "pro", "count": {"fork": 0, "star": 1139, "like": 599, "watch": 0, "views": 98534}, "created_at": "2024-01-13T04:25:36.000Z", "uuid": "2f01fdb9fbaf499f8b537081ce3e4a66", "award_uuid": "7030414529dd43ea868f63d1b18a7b4d", "path": "z_star/zynq7020-core-board-and-various-rf-modules", "public": true, "updated_at": "2025-12-19T01:07:08.000Z", "members": ["63725c4e64e5478099fa821cabcea5b5"], "grade": 4, "publish": true, "name": "ZYNQ7020核心板及各种射频模块", "oshwhub_publish_at": "2024-01-25T15:57:56.000Z", "introduction": "ZYNQ7020核心板(主体,最低成本仅需90元!)、170MSPSADC、210MSPSDAC、1.6GSPS 16bit DAC、9GHz PLL、500MSPS 12bit ADC等", "comments_count": 233, "award_info": {"name": "星火2024初级二等奖", "image": "https://image.lceda.cn/easyedaResource/images/a88c4eae9fda492d9e3ccc276394005d.png", "links": "https://oshwhub.com/recommend/activities%20III", "uuid": "7030414529dd43ea868f63d1b18a7b4d"}}
|
||||||
|
{"owner": {"nickname": "45coll", "avatar": "//image.lceda.cn/avatars/2023/11/rv1hIXrwubREIEYMmkQTe2kExL7JJo0KLrwFAhGr.png", "team": false, "uuid": "580e8f5f47ef40be8cf8b3b09b3a14f5", "username": "45coll"}, "thumb": "//image.lceda.cn/avatars/2022/9/uP30wGpCdSXnic6Kj0gvH8ZBxmTHzAzC5YTwZ9x8.png", "origin": "pro", "count": {"fork": 0, "star": 1174, "like": 554, "watch": 0, "views": 116513}, "created_at": "2022-07-17T02:00:14.000Z", "uuid": "7f7565ef11504863938c0de79622dd54", "tags": [], "path": "45coll/a2fff3c71f5d4de2b899c64b152d3da5", "public": true, "updated_at": "2026-04-15T07:54:56.000Z", "members": ["580e8f5f47ef40be8cf8b3b09b3a14f5", "df60acc759e0467cad6386fe5697ce5b"], "grade": 4, "publish": true, "name": "Super Dial 电机旋钮屏—esp32s3—v2", "oshwhub_publish_at": "2024-05-06T08:44:13.000Z", "introduction": "灵感来源与国外的smart konb,制作初衷为制作一个桌面力反馈旋钮,可实现与surface dial一样的功能。", "comments_count": 175}
|
||||||
|
{"owner": {"nickname": "甘草酸不酸", "avatar": "//image.lceda.cn/avatars/2020/11/YqeCBNguh8OldLPZKemF1j0iCSdnol81FkTf8Umj.jpeg", "team": false, "uuid": "2f4dba9caefc4ce2a56acccdb7d95846", "username": "jie326513988"}, "thumb": "//image.lceda.cn/pullimage/1kkoNNRel8HGTyfXE6rdvuyIrhsZIB9yjFK1ylZ7.jpeg", "origin": "pro", "count": {"fork": 0, "star": 1120, "like": 501, "watch": 0, "views": 108042}, "created_at": "2023-03-11T10:10:21.000Z", "uuid": "81e13f4b2c8942dca536bfe23e2bf1dc", "award_uuid": "1c2814c5676941fd9cebd835738de826", "path": "jie326513988/ESP32mi-ni-mo-shui-ping-MP3shou-", "public": true, "updated_at": "2026-04-16T10:23:34.000Z", "members": ["2f4dba9caefc4ce2a56acccdb7d95846", "fb99bbf7067e4d6a8f9b647c7400218b"], "grade": 4, "publish": true, "name": "ESP32墨水屏MP3收音机阅读器", "oshwhub_publish_at": "2024-05-28T01:15:46.000Z", "introduction": "天气 阅读 图片 时钟 MP3 收音机 配网 设置", "comments_count": 224, "award_info": {"name": "星火2023自由三等奖", "image": "https://image.lceda.cn/easyedaResource/images/4c3e439df9f74a44b3842b5595e82bf6.png", "links": "https://oshwhub.com/recommend/activities%20II", "uuid": "1c2814c5676941fd9cebd835738de826"}}
|
||||||
|
{"owner": {"nickname": "mondraker", "avatar": "//image.lceda.cn/avatars/2024/5/jOZFiDEFiFk0AGGq8kWJnWvA5YOWVCdk3wJj0v7W.png", "team": false, "uuid": "37d334fe908b4df9b508da7318220388", "username": "mondraker"}, "thumb": "//image.lceda.cn/pullimage/mwKKTEDJaNPWViwxYvr2tgWnnFKj7F5HxOervHOT.jpeg", "origin": "std", "count": {"fork": 4434, "star": 2324, "like": 1036, "watch": 0, "views": 297150}, "created_at": "2022-04-05T15:41:17.000Z", "uuid": "9158ea94e9654f6eb2cca93b5c2a9c32", "path": "mondraker/snow_light", "public": true, "updated_at": "2026-03-11T09:15:59.000Z", "members": ["37d334fe908b4df9b508da7318220388"], "grade": 3, "publish": true, "name": "触摸无极调光雪花灯(陶瓷灯丝)(新手小白也可以做!)", "oshwhub_publish_at": "2024-12-18T05:45:21.000Z", "introduction": "触摸无极调光,无频闪无需烧录程序,焊接简单有教程,送朋友,当挂件都可。Type-C接口,成本不算邮费五块左右。附带焊接教程与所有物料链接!配套亚克力外壳与充电底座都已开源,迭代完成放心食用。", "comments_count": 524}
|
||||||
|
{"owner": {"nickname": "xiangyang0926", "avatar": "//image.lceda.cn/avatars/2021/5/iNWPbW82SMJ9vJsCqCX82UHIwFnpKhGiTvHZTOkg.png", "team": false, "uuid": "c12b5ac758cb4e5e9a42a6505f9fa9f0", "username": "xiangyang0926"}, "thumb": "//image.lceda.cn/pullimage/Q9gETfMMCdjRKFeGzbtK1kqsl2o5vZ6CUQqBBLXg.jpeg", "origin": "std", "count": {"fork": 766, "star": 1918, "like": 857, "watch": 0, "views": 180839}, "created_at": "2021-09-03T06:18:08.000Z", "uuid": "0369a515056840798905fdb26359073f", "tags": [], "path": "xiangyang0926/ke-diao-dian-yuan_copy", "public": true, "updated_at": "2026-04-04T03:46:12.000Z", "members": ["c12b5ac758cb4e5e9a42a6505f9fa9f0"], "grade": 3, "publish": true, "name": "桌面可调电源(经济实惠款)", "oshwhub_publish_at": "2022-09-19T10:11:49.000Z", "introduction": "桌面电源(经济实惠款)\n我愿称之为芯龙之光\n芯龙全家桶", "comments_count": 314}
|
||||||
|
{"owner": {"nickname": "OSHWHub开源硬件", "avatar": "//image.lceda.cn/pullimage/zTpiQ71FSjeZjWpTBgJPQyAMhcmOldfuvsjM6mVQ.jpeg", "team": true, "uuid": "b891f6552c9941cf8931dfaefd81fca1", "username": "OSHWHubkai-yuan-ying-jian"}, "thumb": "//image.lceda.cn/avatars/2019/10/hHC7BjrPKr531ZhNUxlskERviQATlXmSTbjH2IM8.jpeg", "origin": "std", "count": {"fork": 1550, "star": 1233, "like": 663, "watch": 0, "views": 157579}, "created_at": "2019-10-28T08:21:21.000Z", "uuid": "29ff00b5fc83498681271320e8855bc7", "tags": ["立创EDA", "OSHWHub", "开源硬件", "PCB尺子"], "path": "OSHWHubkai-yuan-ying-jian/li-chuangeda-chi-zi", "public": true, "updated_at": "2026-03-03T01:53:42.000Z", "members": ["39ac5be00a2242bfab437482716a9ddd", "4251c6ae97414f38bb1d929da02c4173", "cbb9d417f71441f78575dff6d9732aae", "7bb15a0fdb7c4c20ac6e8cc87ae87d6a", "89b0974d1a8e4bb8b73215352164792b"], "grade": 3, "publish": true, "name": "立创EDA尺子(PCB直尺)", "oshwhub_publish_at": "2023-03-22T09:43:20.000Z", "introduction": "立创EDA官方使用立创EDA设计的PCB尺子,喜欢可以直接在嘉立创下单生产", "comments_count": 99}
|
||||||
|
{"owner": {"nickname": "45coll", "avatar": "//image.lceda.cn/avatars/2023/11/rv1hIXrwubREIEYMmkQTe2kExL7JJo0KLrwFAhGr.png", "team": false, "uuid": "580e8f5f47ef40be8cf8b3b09b3a14f5", "username": "45coll"}, "thumb": "//image.lceda.cn/avatars/2021/11/SkYmC62QJJtGJDvetpAcBmMfeBoVNrbMLB0I8Ocn.png", "origin": "std", "count": {"fork": 535, "star": 1351, "like": 653, "watch": 0, "views": 171592}, "created_at": "2021-09-28T01:21:48.000Z", "uuid": "201d355452dc48d988f0ddbd981a8a4d", "tags": [], "path": "45coll/zi-ping-heng-di-lai-luo-san-jiao_10-10-ban-ben", "public": true, "updated_at": "2026-03-11T09:15:59.000Z", "members": ["580e8f5f47ef40be8cf8b3b09b3a14f5", "f35d5586b85044ee8f068830892ff5b6"], "grade": 4, "publish": true, "name": "自平衡的莱洛三角_esp32_可充电_10*10版本", "oshwhub_publish_at": "2022-07-21T05:23:04.000Z", "introduction": "esp32作为主控,5V充3串锂电池,可实现摇摆自平衡。", "comments_count": 178}
|
||||||
|
{"owner": {"nickname": "LiiGuang", "avatar": "https://lceda.cn/images/avatar-default.png?id=f119c61e3d5ce714b4b8", "team": false, "uuid": "a029aa7cae0046668ef932291a5ca84a", "username": "LiiGuang"}, "thumb": "//image.lceda.cn/avatars/2022/7/lUdCAf1YwebqL2vP0R0y43NVBFXg8gGhnImrZg1e.png", "origin": "std", "count": {"fork": 611, "star": 1157, "like": 518, "watch": 0, "views": 86716}, "created_at": "2021-12-02T09:43:03.000Z", "uuid": "ec8a8499750b4e729d3e93e842edc68b", "tags": [], "path": "LiiGuang/pn532-bigant_copy_copy", "public": true, "updated_at": "2026-04-18T13:43:32.000Z", "members": ["a029aa7cae0046668ef932291a5ca84a"], "grade": 4, "publish": true, "name": "PN532读写卡器(支持NFC、RFID)", "oshwhub_publish_at": "2022-07-29T00:47:05.000Z", "introduction": "一个基于PN532的RFID读写器,可以读写M1、UID、CUID、FUID、带NFC功能的手环、手机等,门禁卡解决方案的不二之选。", "comments_count": 614}
|
||||||
|
{"owner": {"nickname": "MisakaBanBan", "avatar": "//image.lceda.cn/pullimage/Hxg8gwzBw2W0NAVnOB6xRqKYfrDK5BquxlQ3gtlJ.jpeg", "team": false, "uuid": "4e16abca3420482f972d0f52cfb55f60", "username": "MisakaBanBan"}, "thumb": "//image.lceda.cn/pullimage/0LC1VDEuA4FbpmzIHiFUESChNyIlnzC53NkgSSYf.jpeg", "origin": "std", "count": {"fork": 455, "star": 1409, "like": 518, "watch": 0, "views": 127732}, "created_at": "2021-11-15T12:16:55.000Z", "uuid": "7e052d660aeb40aa9d47a558dd26175b", "path": "MisakaBanBan/small_desktop_display", "public": true, "updated_at": "2026-03-30T12:21:54.000Z", "members": ["4e16abca3420482f972d0f52cfb55f60"], "grade": 3, "publish": true, "name": "【征集令】超漂亮的个人时钟天气站 SD²", "oshwhub_publish_at": "2022-07-28T08:41:38.000Z", "introduction": "esp12f模块是一个具有WiFi的微处理器,用他来打造一个超漂亮的个人时钟天气站吧!", "comments_count": 165}
|
||||||
|
{"owner": {"nickname": "mazhiliang", "avatar": "https://lceda.cn/images/avatar-default.png?id=f119c61e3d5ce714b4b8", "team": false, "uuid": "16e40f5e8057450ebcf365711ae72b64", "username": "mazhiliang"}, "thumb": "//image.lceda.cn/pullimage/XebSued0jf1SSfw4S0IaS83s1rhTo8pG3scKr3Qq.jpeg", "origin": "std", "count": {"fork": 719, "star": 1072, "like": 506, "watch": 0, "views": 102935}, "created_at": "2021-09-21T02:34:42.000Z", "uuid": "f643591fd411467db1e4efe3ce0970e8", "tags": [], "path": "mazhiliang/esp32-dev", "public": true, "updated_at": "2026-01-20T06:53:15.000Z", "members": ["16e40f5e8057450ebcf365711ae72b64"], "grade": 3, "publish": true, "name": "ESP32开发板 ESP32-IOT-KIT全开源物联网开发板", "oshwhub_publish_at": "2022-07-19T05:51:54.000Z", "introduction": "以ESP32模组为主控设计的开发板,支持WIFI、蓝牙、以太网、RS485、CAN等通信方式。软硬件全开源计划,配套Easyio驱动库、CSDN博文教程,方便大家从ESP-IDF入门物联网的学习与开发", "comments_count": 145}
|
||||||
|
{"owner": {"nickname": "甘草酸不酸", "avatar": "//image.lceda.cn/avatars/2020/11/YqeCBNguh8OldLPZKemF1j0iCSdnol81FkTf8Umj.jpeg", "team": false, "uuid": "2f4dba9caefc4ce2a56acccdb7d95846", "username": "jie326513988"}, "thumb": "//image.lceda.cn/pullimage/i3Ii5diadqRhKUS92NFiD50e3lLbRdylqXlg0ay3.jpeg", "origin": "std", "count": {"fork": 206, "star": 1107, "like": 547, "watch": 0, "views": 137931}, "created_at": "2022-02-22T14:18:32.000Z", "uuid": "b4a490405bbd43b8a7577a8faf4b35c2", "path": "jie326513988/SDka-mo-shui-ping-yue-du-qi", "public": true, "updated_at": "2025-06-16T11:45:05.000Z", "members": ["2f4dba9caefc4ce2a56acccdb7d95846"], "grade": 4, "publish": true, "name": "墨水屏阅读器-持续添加更多尺寸", "oshwhub_publish_at": "2022-10-13T01:24:32.000Z", "introduction": "添加二次元透明背壳,嘉立创面板打印YYDS!\n添加4.2寸固件\n在原有的多功能天气墨水屏的基础下加入SD卡,可从SD卡打开TXT文件阅读。无阉割,天气、温湿度芯片、时钟芯片、阅读、配网。", "comments_count": 225}
|
||||||
|
{"owner": {"nickname": "Kirito", "avatar": "//image.lceda.cn/avatars/2020/3/PuriJwVksBFdJoTZsYiAfSnm4HReUHqJJA7yzmqm.jpeg", "team": false, "uuid": "3dc72a434ae74b968d0478d4a9c8724f", "username": "kirito"}, "thumb": "//image.lceda.cn/pullimage/UoqTBBjftYyim6eEWgYwvOhyJBkGwJi3jt8xOu65.jpeg", "origin": "std", "count": {"fork": 367, "star": 880, "like": 477, "watch": 0, "views": 94333}, "created_at": "2023-03-12T09:00:26.000Z", "uuid": "e5dc20d57ef243b985ff86c12a46135c", "tags": [], "path": "kirito/rtl8367-4ge-2sfp_copy", "public": true, "updated_at": "2026-02-27T04:47:40.000Z", "members": ["3dc72a434ae74b968d0478d4a9c8724f"], "grade": 4, "publish": true, "name": "RTL8367S-4GE+SFP千兆光电交换机", "oshwhub_publish_at": "2023-03-31T01:25:06.000Z", "introduction": "这是基于RTL8367S的4电口+1光口的千兆交换机", "comments_count": 264}
|
||||||
|
{"owner": {"nickname": "1378dm", "avatar": "/image/avatar-default.png", "team": false, "uuid": "b2064b0a993b4f93aadc2893e1b656aa", "username": "1378dm"}, "thumb": "//image.lceda.cn/pullimage/O80U1HV9kRkbhYSQle5Bo8Ze76GnpWrpi6PXRYHY.jpeg", "origin": "std", "count": {"fork": 49, "star": 1330, "like": 743, "watch": 0, "views": 54307}, "created_at": "2022-01-16T06:52:32.000Z", "uuid": "f052d1b8ca4c48778b872b542c20d1c4", "tags": [], "path": "1378dm/better-pcb-picture", "public": true, "updated_at": "2025-08-15T03:27:32.000Z", "members": ["b2064b0a993b4f93aadc2893e1b656aa"], "grade": 4, "publish": true, "name": "更好的PCB照片 - 避免卡顿", "oshwhub_publish_at": "2022-08-29T02:15:17.000Z", "introduction": "将任意图片转化成LCEDA的LIB文件,大大减少卡顿", "comments_count": 142}
|
||||||
|
{"owner": {"nickname": "GoodYuHuang", "avatar": "//image.lceda.cn/avatars/2022/12/rdZmN4PyBQZ1p233a5YxpEfT31bAyHJ9Q3Zpu42u.png", "team": false, "uuid": "53adcecec2b840069aab2ceb81e52d0e", "username": "goodyuhuang"}, "thumb": "//image.lceda.cn/pullimage/dvsAxKbsoMGFjlggZHurDkTZy6M0ftamuxpKXW0H.jpeg", "origin": "std", "count": {"fork": 290, "star": 1113, "like": 462, "watch": 0, "views": 91780}, "created_at": "2022-11-20T09:13:05.000Z", "uuid": "ce949d32c86f448398bd5fdbeb026a77", "tags": [], "path": "goodyuhuang/ji-yu-VL813de-USB3.0-HUBshe-ji", "public": true, "updated_at": "2026-02-05T02:04:02.000Z", "members": ["53adcecec2b840069aab2ceb81e52d0e"], "grade": 4, "publish": true, "name": "【电路已验证】基于VL813的USB3.0-HUB设计", "oshwhub_publish_at": "2026-01-27T06:18:21.000Z", "introduction": "一个使用TYPE-C接口作为数据输入的USB3.0-HUB(立创EDA为直接导入,未作DRC检查,请不要直接打样,可使用附件资料打样)", "comments_count": 233}
|
||||||
|
{"owner": {"nickname": "小煜哥哥", "avatar": "//image.lceda.cn/avatars/2021/4/OciqdD9mfqz61bOfeKLNZqf44U4j5OcjtAIUzjvQ.png", "team": false, "uuid": "67f4ab719a2a4182934deee8cc979e93", "username": "wzw666"}, "thumb": "//image.lceda.cn/avatars/2022/4/5l2JFttpzbTZsYK4FCpOMpfNOJviSliQkmW9yfWW.png", "origin": "std", "count": {"fork": 476, "star": 749, "like": 355, "watch": 0, "views": 110577}, "created_at": "2022-03-31T07:05:30.000Z", "uuid": "f81e1c7f04774545a5c3d14212072a1e", "tags": [], "path": "wzw666/IP5389PRO", "public": true, "updated_at": "2026-04-25T12:24:08.000Z", "members": ["67f4ab719a2a4182934deee8cc979e93"], "grade": 3, "publish": true, "name": "重制版IP5389[100瓦双向快充移动电源]", "oshwhub_publish_at": "2022-10-12T01:19:17.000Z", "introduction": "基于英集芯IP5389-BZ芯片设计的双向PD100瓦移动电源方案", "comments_count": 279}
|
||||||
|
{"owner": {"nickname": "成真科技", "avatar": "//image.lceda.cn/avatars/2022/7/P7k8k6K5xqd4fdosJyfCmnN8quyUTHxQwZoJmRxC.png", "team": false, "uuid": "069b70d2bd1c419693106844aa9a89c3", "username": "zjsxzc217"}, "thumb": "//image.lceda.cn/pullimage/vIJaZGaQy2Mr6oSwTRgwMY3u9587uXIUrnOItBgi.jpeg", "origin": "std", "count": {"fork": 559, "star": 875, "like": 374, "watch": 0, "views": 95275}, "created_at": "2021-12-11T12:42:08.000Z", "uuid": "766b89cd189e4f6eb068ec10a97a85d9", "path": "zjsxzc217/simplefoc_-tai-gong-shuai-shuang-tong-dao", "public": true, "updated_at": "2026-01-20T04:26:51.000Z", "members": ["069b70d2bd1c419693106844aa9a89c3"], "grade": 4, "publish": true, "name": "SIMPLEFOC_无刷电机大功率双通道驱动(已验证)", "oshwhub_publish_at": "2022-07-28T12:48:19.000Z", "introduction": "应该是市面上最便宜的方案吧\n双路大功率无刷直流电机驱动\n支持arduino,esp32,esp8266,stm32等~\n支持simplefoc", "comments_count": 118}
|
||||||
|
{"owner": {"nickname": "小煜哥哥", "avatar": "//image.lceda.cn/avatars/2021/4/OciqdD9mfqz61bOfeKLNZqf44U4j5OcjtAIUzjvQ.png", "team": false, "uuid": "67f4ab719a2a4182934deee8cc979e93", "username": "wzw666"}, "thumb": "//image.lceda.cn/avatars/2021/10/GzDiNwDZSinZ1pfr44sY5cLLFIK0CGAKHSMmMJkK.png", "origin": "std", "count": {"fork": 341, "star": 778, "like": 368, "watch": 0, "views": 121491}, "created_at": "2021-09-09T10:36:14.000Z", "uuid": "48dd1b650d084739bef92ab8a651975a", "tags": [], "path": "wzw666/ip5389", "public": true, "updated_at": "2026-04-15T05:31:09.000Z", "members": ["67f4ab719a2a4182934deee8cc979e93"], "grade": 3, "publish": true, "name": "IP5389[100瓦双向快充移动电源方案]", "oshwhub_publish_at": "2022-09-13T01:15:55.000Z", "introduction": "100瓦双向快充移动电源方案", "comments_count": 205}
|
||||||
|
{"owner": {"nickname": "muyan2020", "avatar": "//image.lceda.cn/avatars/2021/12/OFgZ4jqmuWLnKxmLMmX6NQYVE4sEq8FAzbsslvMr.png", "team": false, "uuid": "804c0f147cb643f5924aa521873103a2", "username": "muyan2020"}, "thumb": "//image.lceda.cn/pullimage/sCcc8ioGwVkAUqcYR0XUhzEkkIiAcXkAP2Q7rMws.jpeg", "origin": "std", "count": {"fork": 481, "star": 639, "like": 316, "watch": 0, "views": 113514}, "created_at": "2022-09-01T02:07:50.000Z", "uuid": "13f634be49f647319760111c0f7474fa", "tags": [], "path": "muyan2020/wei-yan-zheng-esp32-guang-fu-pv-mppt-ina226_copy_copy_copy_copy_copy", "public": true, "updated_at": "2025-03-15T13:47:26.000Z", "members": ["804c0f147cb643f5924aa521873103a2"], "grade": 4, "publish": true, "name": "ESP32升降压光伏MPPT+数字可调电源", "oshwhub_publish_at": "2023-08-23T08:48:55.000Z", "introduction": "本方案从MPPT降压版本的基础上修改,支持降压或者升压,通过板载开关及使用专用的程序对升降压进行切换", "comments_count": 172}
|
||||||
|
{"owner": {"nickname": "酷电科技馆", "avatar": "//image.lceda.cn/pullimage/B9j4MGOeIoy2Z1raVLGY3zE33zuSN4rvpcKgAO0W.png", "team": true, "uuid": "1a209b6e71d9418b95d7ffe9e2e14b1f", "username": "eda_sbnvoqqej"}, "thumb": "//image.lceda.cn/oshwhub/332fcccb25b74f399d86a695f3334304.png", "origin": "std", "count": {"fork": 573, "star": 892, "like": 292, "watch": 0, "views": 71178}, "created_at": "2020-03-26T05:52:33.000Z", "uuid": "3bec6b84391a4004b115d7d4f1a2e193", "tags": [], "path": "eda_sbnvoqqej/kai-yuan-si-zhou-yao-kong-qi", "public": true, "updated_at": "2026-02-02T12:11:41.000Z", "members": ["4648a6dfffbf4ad1b60679516b836c88"], "grade": 3, "publish": true, "name": "【开源】STM32四轴遥控器", "oshwhub_publish_at": "2024-07-15T01:07:12.000Z", "introduction": "基于小马哥RoboFly开源四轴制作的四轴遥控器。", "comments_count": 188}
|
||||||
|
{"owner": {"nickname": "夏襄居士", "avatar": "//image.lceda.cn/avatars/2022/4/5Xuo1ohNLGqzl8Xht07I29r1BFqwmHYTufzLUa5l.png", "team": false, "uuid": "b3c7dee82f5b4c8cb0e631c4933af8b7", "username": "zhushengji"}, "thumb": "//image.lceda.cn/pullimage/cwNUVdKKMKru1Zm3GxRHOkVtJvPBbInHGOebLFTD.jpeg", "origin": "std", "count": {"fork": 197, "star": 944, "like": 485, "watch": 0, "views": 79332}, "created_at": "2022-10-10T08:54:32.000Z", "uuid": "929b16138f744f498c55840a87c141be", "path": "zhushengji/er-dai-dan-ci-ka", "public": true, "updated_at": "2026-01-21T05:43:36.000Z", "members": ["b3c7dee82f5b4c8cb0e631c4933af8b7"], "grade": 4, "publish": true, "name": "二代单词卡--萤囊", "oshwhub_publish_at": "2023-07-03T03:23:54.000Z", "introduction": "二代单词卡来啦!增加了许多新特性哦!", "comments_count": 182}
|
||||||
|
{"owner": {"nickname": "矛盾聚合体", "avatar": "//image.lceda.cn/avatars/2021/6/yI1FFeyY61T7hiUaI0pKxEU989MmpkefZAEvw8Np.png", "team": false, "uuid": "b2b6f77150214141b9e14701d6b5e346", "username": "Knight_Sin"}, "thumb": "//image.lceda.cn/pullimage/ZDwFwoCTQXaqPb9zWKAcMGQrrSHR23mnSBw2BOcX.jpeg", "origin": "std", "count": {"fork": 699, "star": 692, "like": 269, "watch": 0, "views": 90414}, "created_at": "2021-06-01T13:06:05.000Z", "uuid": "d9c172442b774ab9bd740f730d5458d9", "tags": [], "path": "Knight_Sin/abcd_copy_copy_copy_copy_copy", "public": true, "updated_at": "2024-11-21T16:23:11.000Z", "members": ["b2b6f77150214141b9e14701d6b5e346"], "grade": 4, "publish": true, "name": "【FOC】无刷电机驱动器ODrive AP1.0-DRV8303版", "oshwhub_publish_at": "2022-02-24T08:21:24.000Z", "introduction": "【ART-Pi】无刷电机驱动器ODrive AP0.3的分支", "comments_count": 73}
|
||||||
|
{"owner": {"nickname": "左手DIY", "avatar": "//image.lceda.cn/pullimage/2ymtzow60zko6wfIpxAU5EcIu2MYhBtrboncyegl.jpeg", "team": false, "uuid": "de62e47bf33f45158f4fc792835838eb", "username": "zl4430"}, "thumb": "//image.lceda.cn/pullimage/kVn5PSaVguqoyJHRLrVBiqmm9y9mohfjeUNv97so.jpeg", "origin": "std", "count": {"fork": 281, "star": 799, "like": 373, "watch": 0, "views": 103656}, "created_at": "2021-11-24T03:06:48.000Z", "uuid": "d53cd4f3355c45319a36b19cc9ff252e", "path": "zl4430/mpu-6500-280", "public": true, "updated_at": "2025-12-19T00:37:21.000Z", "members": ["de62e47bf33f45158f4fc792835838eb"], "grade": 4, "publish": true, "name": "STM F405飞控 bf inav 穿越机 固定翼飞控", "oshwhub_publish_at": "2023-11-13T08:19:05.000Z", "introduction": "F405飞控,MPU6500陀螺仪,低成本。20、30孔双版本。PCB文件在附件,bf、inav地面站接USB线刷固件。自动返航测试视频https://b23.tv/GcbdOsY", "comments_count": 173}
|
||||||
|
{"owner": {"nickname": "Kirito", "avatar": "//image.lceda.cn/avatars/2020/3/PuriJwVksBFdJoTZsYiAfSnm4HReUHqJJA7yzmqm.jpeg", "team": false, "uuid": "3dc72a434ae74b968d0478d4a9c8724f", "username": "Kirito"}, "thumb": "//image.lceda.cn/pullimage/WDKmS7oYUTlDqB4LJ1kZrmEsw8XL4ctqfN9ROn5q.jpeg", "origin": "std", "count": {"fork": 481, "star": 801, "like": 325, "watch": 0, "views": 94216}, "created_at": "2020-05-16T15:07:18.000Z", "uuid": "a76c7d50a6c345628eae36dfa7d40541", "tags": [], "path": "Kirito/dian-sai-shen-qi-FPGA-STM32kai-f", "public": true, "updated_at": "2026-02-04T15:02:47.000Z", "members": ["3dc72a434ae74b968d0478d4a9c8724f"], "grade": 4, "publish": true, "name": "电赛神器:FPGA+STM32开发板", "oshwhub_publish_at": "2022-07-18T14:13:46.000Z", "introduction": "本设计为FPGA+STM32开发板,可处理高速信号,带8bit并行高速AD/DA,满足电赛信号类题目设计需要。", "comments_count": 81}
|
||||||
|
{"owner": {"nickname": "Kirito", "avatar": "//image.lceda.cn/avatars/2020/3/PuriJwVksBFdJoTZsYiAfSnm4HReUHqJJA7yzmqm.jpeg", "team": false, "uuid": "3dc72a434ae74b968d0478d4a9c8724f", "username": "Kirito"}, "thumb": "//image.lceda.cn/pullimage/k50OonL2mnyuvO11hkTcXaehnWoD76WFjPljTOVi.jpeg", "origin": "std", "count": {"fork": 290, "star": 808, "like": 388, "watch": 0, "views": 80860}, "created_at": "2021-10-01T04:09:54.000Z", "uuid": "4f06b185aae542eb94497acef0a9144b", "tags": [], "path": "Kirito/usb3-0-wang-ka-rtl8153b", "public": true, "updated_at": "2025-12-19T01:09:08.000Z", "members": ["3dc72a434ae74b968d0478d4a9c8724f"], "grade": 3, "publish": true, "name": "USB3.0千兆网卡-RTL8153B", "oshwhub_publish_at": "2022-07-21T07:48:13.000Z", "introduction": "这是基于RTL8153B的千兆USB网卡。", "comments_count": 240}
|
||||||
|
{"owner": {"nickname": "酷电科技馆", "avatar": "//image.lceda.cn/pullimage/B9j4MGOeIoy2Z1raVLGY3zE33zuSN4rvpcKgAO0W.png", "team": true, "uuid": "1a209b6e71d9418b95d7ffe9e2e14b1f", "username": "eda_sbnvoqqej"}, "thumb": "//image.lceda.cn/oshwhub/4215592dcecf453aa7e6b38b3481687b.jpg", "origin": "std", "count": {"fork": 454, "star": 916, "like": 329, "watch": 0, "views": 60195}, "created_at": "2022-08-11T12:11:42.000Z", "uuid": "aa6f9628c70d4b208e10a6734cd0fc02", "tags": [], "path": "eda_sbnvoqqej/kai-yuan-stm32-si-zhou-fei-xing-qi-xin-ban", "public": true, "updated_at": "2026-02-02T12:11:41.000Z", "members": ["4648a6dfffbf4ad1b60679516b836c88"], "grade": 3, "publish": true, "name": "【开源】KODOFly四轴飞行器", "oshwhub_publish_at": "2024-07-15T01:07:34.000Z", "introduction": "沁恒微CH32V103 RISC-V芯片为主控,基于 RT-Thread 系统的四轴飞行器", "comments_count": 210}
|
||||||
|
{"owner": {"nickname": "Aeromodeller", "avatar": "", "team": false, "uuid": "e8a5c199c7c54f5989d704a8f8e7eaa6", "username": "aeromodeller"}, "thumb": "//image.lceda.cn/pullimage/DdYgeOd2X0egqLY0Jc4jCHe6Spyj4PfNrPEqmmHk.jpeg", "origin": "std", "count": {"fork": 198, "star": 1117, "like": 481, "watch": 0, "views": 57303}, "created_at": "2022-11-11T02:32:04.000Z", "uuid": "b38847543af34f64bd034e24c94c130e", "path": "aeromodeller/superuav", "public": true, "updated_at": "2026-03-11T09:15:59.000Z", "members": ["e8a5c199c7c54f5989d704a8f8e7eaa6"], "grade": 4, "publish": true, "name": "SuperUAV", "oshwhub_publish_at": "2022-12-05T01:04:40.000Z", "introduction": "SUAV开源四轴无人机。不止是开源,从点灯开始,一步步手搓飞控,最终完美飞行。授人以鱼,更授人予渔。", "comments_count": 78}
|
||||||
|
{"owner": {"nickname": "fh001", "avatar": "//image.lceda.cn/avatars/2022/3/mQtfQu1MijCKxzQsLCRLlAqrdGua7X3dQVnCCQjL.png", "team": false, "uuid": "a7ac3462734d4c1cb878b165f31e4bcf", "username": "fh001"}, "thumb": "//image.lceda.cn/pullimage/4XStvdZIf6el4fygj1sXF9ewYI9WA0ms1V8L5inC.jpeg", "origin": "std", "count": {"fork": 203, "star": 806, "like": 409, "watch": 0, "views": 55697}, "created_at": "2022-02-25T06:54:27.000Z", "uuid": "ae88c322aff74ad3b1e9d5c403dfc4d4", "path": "fh001/usb-gong-shuai-ce-shi-yi", "public": true, "updated_at": "2025-04-25T11:22:35.000Z", "members": ["a7ac3462734d4c1cb878b165f31e4bcf"], "grade": 3, "publish": true, "name": "【毕设】USB功率测试仪", "oshwhub_publish_at": "2022-07-24T09:15:16.000Z", "introduction": "USB功率测试器,可测试目前几乎所有协议的快充,短时最高功率160W,长时间最大功率120W", "comments_count": 342}
|
||||||
|
{"owner": {"nickname": "cnwans", "avatar": "//image.lceda.cn/pullimage/h2ULoTRNxhuJrNu0TR8oMRodr8fBeT77LdQMYNwT.jpeg", "team": false, "uuid": "3487f85b25e8466a98c86f32e6f9315d", "username": "youi"}, "thumb": "//image.lceda.cn/pullimage/DiPddiHrzbLYEMB3Twl5qM0szhEeGOvojkc1X79a.jpeg", "origin": "std", "count": {"fork": 476, "star": 644, "like": 246, "watch": 0, "views": 78354}, "created_at": "2023-03-20T13:28:17.000Z", "uuid": "c19a4fc2119f4a44860ccb55ed171e8e", "path": "youi/P150C-Pro-D-shu-kong-dian-zi-fu-zai", "public": true, "updated_at": "2026-04-01T16:37:22.000Z", "members": ["3487f85b25e8466a98c86f32e6f9315d"], "grade": 3, "publish": true, "name": "P150C Pro-D数控电子负载 电池容量测试仪", "oshwhub_publish_at": "2025-06-26T01:41:28.000Z", "introduction": "P150C Pro-D系列直流恒流型数控电子负载是基于STC8H系列单片机为主控芯片开发而成,该产品支持±150V电压测量/15A电流测量/150W功率耗散,测量精度高达0.5%,并且支持多种测量模式", "comments_count": 268}
|
||||||
196
docs/plans/oshwhub_batch50.md
Normal file
196
docs/plans/oshwhub_batch50.md
Normal file
@@ -0,0 +1,196 @@
|
|||||||
|
# oshwhub 扩抓批 50:执行计划
|
||||||
|
|
||||||
|
**创建**:2026-04-29
|
||||||
|
**目标**:在已落库的 15 项(5 Pro + 10 Std)基础上,再抓 50 个高质量项目
|
||||||
|
**候选清单**:`data/state/oshwhub_batch50_candidates.jsonl`(50 行)
|
||||||
|
**承接**:`docs/sources/oshwhub_listing_full.md`(全量索引盘点)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 目标
|
||||||
|
|
||||||
|
- 把 corpus 从 15 项扩到 65 项,覆盖 Pro + Std + Pro 3.x + Pro 2.x 各形态
|
||||||
|
- 在 LFS 1 TB 红线内,先做 ~3-4 GB 量级的中等规模验证
|
||||||
|
- 结束后用 license 白名单评估这 50 项里有多少能进 Forge 投影
|
||||||
|
- 暴露 ≥ top-5 才会出现的 corner case(例如:超大 Pro 项目、私有附件、跨账号 fork)
|
||||||
|
|
||||||
|
**显式不做**:详情页全量扫描(19h 工作量,留待后续按 A 档全池一次性做);下游 KiCad 转换(Phase 3 还在做)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 候选池筛选标准
|
||||||
|
|
||||||
|
数据源:`data/state/oshwhub_listing_full.jsonl`(33,695 项全量 listing 索引)
|
||||||
|
|
||||||
|
**硬过滤**:
|
||||||
|
- `grade >= 3 AND like >= 10`(A 档)
|
||||||
|
- `uuid` 不在已抓 15 项内
|
||||||
|
|
||||||
|
**排序**:复合质量打分
|
||||||
|
```
|
||||||
|
score = like*3 + star + fork*2 + views/100 + comments_count*2 + grade*50
|
||||||
|
```
|
||||||
|
|
||||||
|
**多样性约束**:
|
||||||
|
- 单作者上限 2 个项目(避免 `course-examples` / `45coll` 等高产账号占满)
|
||||||
|
- Pro / Std 25:25 平衡(Pro 是新平台增长焦点,Std 是 7 年质量积累)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 选出的 50 项概况
|
||||||
|
|
||||||
|
| 维度 | 值 |
|
||||||
|
|---|---|
|
||||||
|
| 总数 | 50(25 Pro + 25 Std)|
|
||||||
|
| 唯一作者 | 43 |
|
||||||
|
| Max 单作者 | 2 |
|
||||||
|
| like 区间 | min=246 / median=554 / max=2137 |
|
||||||
|
| view 区间 | min=54k / median=117k / max=362k |
|
||||||
|
| grade 分布 | 4: 33 项, 3: 17 项 |
|
||||||
|
|
||||||
|
**Pro 头部**(前 5):HelloWord-Keyboard 2137 likes / STM32 桌面宠物 / OV-Watch 智能手表 / mini 加热台 / ESP-SparkBot
|
||||||
|
|
||||||
|
**Std 头部**(前 5):触摸调光雪花灯 1036 likes / 桌面可调电源 / 立创 EDA PCB 直尺 / 自平衡莱洛三角 / PN532 NFC
|
||||||
|
|
||||||
|
完整名单见 `data/state/oshwhub_batch50_candidates.jsonl`。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 执行步骤
|
||||||
|
|
||||||
|
### Step 0 — 候选池冻结 ✅
|
||||||
|
|
||||||
|
`data/state/oshwhub_batch50_candidates.jsonl` 已生成,作为本次批的"事实档案"。后续就算重排序也以这份为准。
|
||||||
|
|
||||||
|
### Step 1 — 详情页抓 license(~5 min,QPS=0.5)
|
||||||
|
|
||||||
|
只对这 50 项扫详情页,提取 license / 完整 attachments 列表 / 原始描述。
|
||||||
|
不在这一步下载附件、不下源工程,**只是获取每项的 metadata 全集**。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
PYTHONUNBUFFERED=1 uv run python -u -m crawlers.oshwhub \
|
||||||
|
--uuids "$(jq -r .uuid data/state/oshwhub_batch50_candidates.jsonl | paste -sd,)" \
|
||||||
|
--no-files \
|
||||||
|
--out data/raw/oshwhub
|
||||||
|
```
|
||||||
|
|
||||||
|
> 目前 `crawl_one` 已经会落 metadata.json + description.md + cover;`--no-files` 跳过附件。
|
||||||
|
|
||||||
|
**预期产出**:50 个 `data/raw/oshwhub/<uuid>/metadata.json`,含 license 字段。
|
||||||
|
|
||||||
|
### Step 2 — license 分布盘点
|
||||||
|
|
||||||
|
写个一次性脚本读 50 份 metadata.json,统计 license 分布。**这一步只做盘点不做过滤**——按 CLAUDE.md "研究用、不分发" 原则,所有 license 都入库。下游 Forge 投影时再用白名单过滤。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
uv run python - <<'EOF'
|
||||||
|
import json, glob, collections
|
||||||
|
licenses = collections.Counter()
|
||||||
|
for p in glob.glob("data/raw/oshwhub/*/metadata.json"):
|
||||||
|
m = json.load(open(p))
|
||||||
|
if m["uuid"] in batch_50_uuids:
|
||||||
|
licenses[m.get("license") or "<none>"] += 1
|
||||||
|
print(licenses)
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
预期会有大量 NC-SA / GPL(参考已抓 5 Pro:5/5 都是 GPL/NC-SA)。
|
||||||
|
|
||||||
|
### Step 3 — Pro 子集预检 + 抓源(~30-60 min)
|
||||||
|
|
||||||
|
25 个 Pro 项目里要先判 3.x vs 2.x(`branch_uuid` 是否 null),然后对应走 modern / legacy 路径:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
PYTHONUNBUFFERED=1 uv run python -u -m crawlers.oshwhub \
|
||||||
|
--backfill-pro-source \
|
||||||
|
--uuids "$(jq -r 'select(.origin=="pro") | .uuid' \
|
||||||
|
data/state/oshwhub_batch50_candidates.jsonl | paste -sd,)" \
|
||||||
|
--pro-cookie ~/.secrets/pro-lceda-cookie-header.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
**时间预算**(已应用 chain replay sleep 优化,commit `1e06ba6`):
|
||||||
|
- 小型项目(chain ~10):~30s 各
|
||||||
|
- 中型(chain ~30-50):~1-2 min 各
|
||||||
|
- 大型(chain ~100+):~3-5 min 各
|
||||||
|
- 超大(X86 量级 chain ~700):~3-5 min 各(CDN 部分降到 0.2s/req)
|
||||||
|
|
||||||
|
按已抓 5 项观察,预期 25 项里:
|
||||||
|
- ~22 个 Pro 3.x(chain replay)
|
||||||
|
- ~3 个 Pro 2.x(plaintext dataStr)
|
||||||
|
|
||||||
|
### Step 4 — Std 子集抓源(~30 min)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
PYTHONUNBUFFERED=1 uv run python -u -m crawlers.oshwhub \
|
||||||
|
--backfill-source \
|
||||||
|
--uuids "$(jq -r 'select(.origin=="std") | .uuid' \
|
||||||
|
data/state/oshwhub_batch50_candidates.jsonl | paste -sd,)"
|
||||||
|
```
|
||||||
|
|
||||||
|
每项 ~30s(QPS=0.2 / 5s sleep × 几个 API 调用),25 项 ≈ 12-15 min。
|
||||||
|
|
||||||
|
### Step 5 — 附件下载(按需,可选)
|
||||||
|
|
||||||
|
附件(Gerber / STEP / PDF / 视频)默认存 LFS,但视频占大头(之前 Phase 1 实测 mp4+qt 占 54%)。
|
||||||
|
**建议加 `--skip-ext mp4,qt,mov`** 节省 30-50% 体积。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
PYTHONUNBUFFERED=1 uv run python -u -m crawlers.oshwhub \
|
||||||
|
--uuids "$(jq -r .uuid data/state/oshwhub_batch50_candidates.jsonl | paste -sd,)" \
|
||||||
|
--out data/raw/oshwhub
|
||||||
|
# 注:当前 crawler 没有 --skip-ext 选项;要加得改 crawl_one;如果偷懒就先全抓再人工删
|
||||||
|
```
|
||||||
|
|
||||||
|
> 这一步没那么紧迫,可以挪到 Step 3/4 完成后单独跑。
|
||||||
|
|
||||||
|
### Step 6 — 验收 + 记录
|
||||||
|
|
||||||
|
跑 `scripts/build_index.py` 重建 `projects.md`,更新 `log.md`,把统计信息写到 `docs/plans/oshwhub_batch50.md` 末尾"实施结果"段。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 资源预算
|
||||||
|
|
||||||
|
| 项 | 估算 | 备注 |
|
||||||
|
|---|---:|---|
|
||||||
|
| API 调用 | ~600 次 | 50 详情 + 25×3 Pro meta + 25 Std API + chain blobs |
|
||||||
|
| 时间 | **~1.5-2 小时** | 远低于之前估算的 19h(因为只 50 项 + sleep 优化)|
|
||||||
|
| 存储(源工程)| ~1.5 GB | Pro 平均 30 MB、Std 平均 15 MB |
|
||||||
|
| 存储(附件,估)| 2-3 GB | 含视频;不含视频估 1 GB |
|
||||||
|
| **总 LFS 增量** | **~3-4 GB** | 远低于现有 LFS 余量 |
|
||||||
|
| 网络下行 | ~4 GB | 大部分走 LFS |
|
||||||
|
|
||||||
|
距离 200 GB"对象存储迁移决策点"还很远。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 风险与预案
|
||||||
|
|
||||||
|
| 风险 | 概率 | 影响 | 预案 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| Pro cookie 过期半路 | 中 | 卡住 Pro 抓取 | 重抓 cookie;爬虫已有 `oshwhub_pro_failed.jsonl` 重试机制(**未实现**,现在失败只 stderr)|
|
||||||
|
| 单个 Pro 项目超大(X86 量级 ~500 MB) | 中 | LFS 单项膨胀 | 设置 size cap,超过 200 MB 跳过 + 记 state |
|
||||||
|
| license 全是 NC-SA → 下游 Forge 投影门槛低 | 高 | Forge 阶段才发现 | 提前在 Step 2 盘点;**本批不做过滤**,只入库 |
|
||||||
|
| 某个项目附件含 mp4 视频 → 附件总量爆炸 | 中 | 多消耗 1-2 GB LFS | 加 `--skip-ext mp4,qt,mov` 选项(需小改 crawler)|
|
||||||
|
| 抓 50 项过程中触发反爬 / 限流 | 低 | 中途中断 | 已有 5s/req QPS;如果触发,加 jitter;从中断点续 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. 验收标准
|
||||||
|
|
||||||
|
- [ ] `data/raw/oshwhub/` 下新增 ≥ 45 个项目目录(允许 ≤ 5 项失败)
|
||||||
|
- [ ] 每个新增项目的 `metadata.json` 含 `license`、`source_format`、`source_path`
|
||||||
|
- [ ] Pro 25 项里 3.x / 2.x 分类正确(看 `source_format` 字段)
|
||||||
|
- [ ] LFS 增量 ≤ 5 GB
|
||||||
|
- [ ] `projects.md` 自动重建后包含新 50 项
|
||||||
|
- [ ] log.md 顶部一条总结性日志
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 后续
|
||||||
|
|
||||||
|
成功结束后的下一步候选:
|
||||||
|
1. **license 详情扫描全 A 档** —— 把 license 信息覆盖到 2,806 项 A 档候选池,为下一次扩抓提供过滤条件
|
||||||
|
2. **扩抓批 200**(按 license 白名单 + 同样多样性策略)
|
||||||
|
3. **Pro 工程二进制图(IMAGE/)补抓** —— 当前的真实数据 gap,要不要补取决于下游需求
|
||||||
|
4. **风控压测** —— 在某一批做并发提速试验,找 oshwhub / pro.lceda.cn 的限流真上限
|
||||||
Reference in New Issue
Block a user