Phase 1 MVP: crawl 10 high-quality oshwhub projects into LFS

Why:
- Charles 指定:先爬 10 个高质量项目存 Gitea LFS,一个项目一个文件夹,
  保留原文件和 URL。先以小批量验证 schema + LFS 流水线,放量前再拍板
  存储规模。

What:
- crawlers/oshwhub: 列表 API (`/api/project?sort=hot`) + SSR HTML 解析,
  一次性产出 metadata / description / cover / files / _urls
- schemas/project.schema.json: 跨源统一 schema
- docs/sources/oshwhub.md: API 入口 / 字段映射 / 陷阱调研
- pyproject.toml: httpx[http2] 单依赖
- .gitattributes: data/raw/**/files/** 一律走 LFS(规则写窄,避免误伤 schemas/*.json 等)
- .gitignore: 移除 data/raw/* 排除(改走 LFS 入库)

10 个项目覆盖:调试器 / 加热台 / 盖革计数器 / 数控电源 / 焊台 /
智能手表 / USB 测电流 / ZVS 感应加热 / AI 开发板 / 红外热成像。
共 52 附件 ≈ 524 MB 入 LFS,筛选判据 grade=4 & likes>=100 & 多样性。

Known gaps(见 plan.md § Phase 1.4):
- EasyEDA 源 JSON 需登录 (u.lceda.cn),v0.1 跳过
- fs-web-stream.jlc.com 的工程源下载未测
- scripts/validate.py 自动 schema 校验未实现

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Zhang Jiahao
2026-04-23 19:34:09 +08:00
parent bf2370f83b
commit 5ffa10f256
103 changed files with 2279 additions and 28 deletions

3
.gitattributes vendored Normal file
View File

@@ -0,0 +1,3 @@
# data/raw/<source>/<project>/files/ 下是原始附件,一律走 LFS不管后缀
# 元数据metadata.json / description.md / _urls.json / cover.*)留在普通 git。
data/raw/**/files/** filter=lfs diff=lfs merge=lfs -text

7
.gitignore vendored
View File

@@ -1,12 +1,11 @@
# Data outputs (大文件不入库,走 LFS 或外部存储)
# 忽略目录内容,保留目录本身(靠 .gitkeep 占位)
data/raw/*
# Derivative 数据(可从 raw 重建),不入库
data/processed/*
data/state/*
!data/raw/.gitkeep
!data/processed/.gitkeep
!data/state/.gitkeep
# data/raw 入库(工程二进制走 LFS见 .gitattributes
# Python
__pycache__/
*.py[cod]

0
crawlers/__init__.py Normal file
View File

View File

View File

@@ -0,0 +1,4 @@
from .crawler import main
if __name__ == "__main__":
raise SystemExit(main())

436
crawlers/oshwhub/crawler.py Normal file
View File

@@ -0,0 +1,436 @@
"""oshwhub.com crawler — MVP.
Usage:
uv run python -m crawlers.oshwhub \
--out data/raw/oshwhub \
--top 10 --min-likes 50 --min-grade 4
Or with explicit UUID list:
uv run python -m crawlers.oshwhub \
--uuids 298873b7fdbe44f8ba0e7351e023bc2c,7b6a398811f14eba9a952b8d2ddd7ace \
--out data/raw/oshwhub
"""
from __future__ import annotations
import argparse
import dataclasses as dc
import hashlib
import html as _html
import json
import re
import sys
import time
import urllib.parse
from datetime import datetime, timezone
from pathlib import Path
from typing import Iterator
import httpx
API_LIST = "https://oshwhub.com/api/project"
BASE = "https://oshwhub.com"
IMG_CDN = "https://image.lceda.cn"
UA = "FacereDataset/0.1 (+https://git.deepknow.site/Facere/FacereDataset)"
SLEEP_BETWEEN = 2.0 # seconds between detail-page / file fetches
# ---------------------------------------------------------------------------
# HTTP
# ---------------------------------------------------------------------------
def make_client(timeout: float = 30.0) -> httpx.Client:
return httpx.Client(
http2=True,
timeout=timeout,
headers={"User-Agent": UA, "Accept": "text/html,application/json;q=0.9,*/*;q=0.8"},
follow_redirects=True,
)
def polite_sleep() -> None:
time.sleep(SLEEP_BETWEEN)
# ---------------------------------------------------------------------------
# Listing
# ---------------------------------------------------------------------------
def list_projects(
client: httpx.Client,
page: int = 1,
page_size: int = 30,
sort: str = "hot",
) -> dict:
r = client.get(API_LIST, params={"page": page, "pageSize": page_size, "sort": sort})
r.raise_for_status()
data = r.json()
if not data.get("success"):
raise RuntimeError(f"list API failed: {data}")
return data["result"]
def rank_score(item: dict) -> float:
"""Composite quality score: favor projects with broad engagement."""
c = item["count"]
return (
c["like"] * 3
+ c["star"] * 1
+ c["fork"] * 2
+ c["views"] / 100
+ item["comments_count"] * 2
+ (item.get("grade") or 0) * 50
)
def pick_top(
items: list[dict],
n: int,
min_likes: int,
min_grade: int,
exclude_copies: bool = True,
) -> list[dict]:
filtered = []
for it in items:
if exclude_copies and "_copy" in it["path"]:
continue
if it["count"]["like"] < min_likes:
continue
if (it.get("grade") or 0) < min_grade:
continue
filtered.append(it)
filtered.sort(key=rank_score, reverse=True)
return filtered[:n]
# ---------------------------------------------------------------------------
# Detail page parsing
# ---------------------------------------------------------------------------
RE_ATTACH_BLOCK = re.compile(r'\\"attachments\\":\[', re.DOTALL)
RE_LICENSE = re.compile(r'\\"license\\":\\"([^\\"]+)\\"')
RE_META_DESC = re.compile(
r'<meta\s+name="description"\s+content="([^"]*)"', re.IGNORECASE
)
RE_TITLE = re.compile(r"<title>([^<]+)</title>", re.IGNORECASE)
def _find_balanced_bracket(s: str, start: int, open_ch: str = "[", close_ch: str = "]") -> int:
"""Return index after the matching close bracket. start must point at open_ch."""
assert s[start] == open_ch
depth = 0
for i in range(start, len(s)):
ch = s[i]
if ch == open_ch:
depth += 1
elif ch == close_ch:
depth -= 1
if depth == 0:
return i + 1
raise ValueError("unbalanced")
def parse_detail_html(h: str) -> dict:
"""Extract attachments, license, title, description from SSR HTML."""
out: dict = {
"title": None,
"description_meta": None,
"license": None,
"attachments": [],
}
m = RE_TITLE.search(h)
if m:
# HTML entities + suffix stripping
title = _html.unescape(m.group(1)).strip()
for sfx in (
" - 立创开源硬件平台 - 深圳创电优选科技有限公司",
" - 立创开源硬件平台",
):
if title.endswith(sfx):
title = title[: -len(sfx)]
out["title"] = title
m = RE_META_DESC.search(h)
if m:
out["description_meta"] = _html.unescape(m.group(1))
m = RE_LICENSE.search(h)
if m:
out["license"] = m.group(1)
m = RE_ATTACH_BLOCK.search(h)
if m:
arr_start = m.end() - 1 # point at '['
arr_end = _find_balanced_bracket(h, arr_start)
block = h[arr_start:arr_end]
clean = block.replace('\\"', '"').replace("\\\\", "\\")
try:
out["attachments"] = json.loads(clean)
except json.JSONDecodeError as e:
# Keep raw for debugging; skip attachments silently. Caller can log.
out["_attachments_parse_error"] = str(e)
return out
# ---------------------------------------------------------------------------
# Download helpers
# ---------------------------------------------------------------------------
def download_to(client: httpx.Client, url: str, dest: Path) -> tuple[int, str]:
"""Stream-download url to dest. Returns (size, sha256)."""
dest.parent.mkdir(parents=True, exist_ok=True)
h = hashlib.sha256()
size = 0
with client.stream("GET", url) as r:
r.raise_for_status()
with open(dest, "wb") as f:
for chunk in r.iter_bytes(1 << 15):
f.write(chunk)
h.update(chunk)
size += len(chunk)
return size, h.hexdigest()
# ---------------------------------------------------------------------------
# Single-project crawl
# ---------------------------------------------------------------------------
@dc.dataclass
class CrawlResult:
project_id: str
out_dir: Path
files_count: int
bytes_total: int
skipped_files: list[str]
def crawl_one(
client: httpx.Client,
list_item: dict,
out_root: Path,
fetch_files: bool = True,
) -> CrawlResult:
uuid = list_item["uuid"]
path = list_item["path"]
proj_dir = out_root / uuid
proj_dir.mkdir(parents=True, exist_ok=True)
# 1. Fetch detail HTML
detail_url = f"{BASE}/{path}"
r = client.get(detail_url)
r.raise_for_status()
detail = parse_detail_html(r.text)
polite_sleep()
# 2. Cover image
thumb_url = list_item["thumb"]
if thumb_url.startswith("//"):
thumb_url = "https:" + thumb_url
cover_rel = None
if thumb_url:
ext = Path(urllib.parse.urlparse(thumb_url).path).suffix or ".jpg"
cover_rel = f"cover{ext}"
try:
download_to(client, thumb_url, proj_dir / cover_rel)
except httpx.HTTPError as e:
print(f" cover failed: {e}", file=sys.stderr)
cover_rel = None
polite_sleep()
# 3. Description markdown (combine meta + introduction)
desc_md_parts = [f"# {list_item['name']}\n"]
if detail.get("description_meta"):
desc_md_parts.append(detail["description_meta"].strip())
elif list_item.get("introduction"):
desc_md_parts.append(list_item["introduction"].strip())
desc_md_parts.append(
f"\n---\n"
f"- Source: {detail_url}\n"
f"- Author: {list_item['owner'].get('nickname')} "
f"({list_item['owner'].get('username')})\n"
f"- License: {detail.get('license') or 'unknown'}\n"
f"- Published: {list_item.get('oshwhub_publish_at')}\n"
)
(proj_dir / "description.md").write_text("\n".join(desc_md_parts), encoding="utf-8")
# 4. Files
files_meta: list[dict] = []
skipped: list[str] = []
bytes_total = 0
for a in detail.get("attachments", []):
src = a.get("src") or ""
if not src:
continue
file_url = IMG_CDN + src if src.startswith("/") else src
name = a.get("name") or Path(src).name
safe_name = re.sub(r'[/\\:*?"<>|]', "_", name)
local_rel = f"files/{safe_name}"
local_path = proj_dir / local_rel
entry: dict = {
"name": name,
"url": file_url,
"original_id": a.get("uuid"),
"ext": a.get("ext"),
"mime": a.get("mime"),
"size": a.get("size"),
"md5": a.get("md5"),
}
if fetch_files:
try:
size, sha = download_to(client, file_url, local_path)
entry["path"] = local_rel
entry["sha256"] = sha
if entry.get("size") and entry["size"] != size:
entry["size_actual"] = size
else:
entry["size"] = size
bytes_total += size
except httpx.HTTPError as e:
skipped.append(f"{name}: {e}")
print(f" file skipped {name}: {e}", file=sys.stderr)
polite_sleep()
files_meta.append(entry)
# 5. URL manifest (for files we couldn't download or for future re-download)
urls_manifest = {
"detail_url": detail_url,
"cover_url": thumb_url,
"attachments": [
{"name": f["name"], "url": f["url"], "original_id": f.get("original_id")}
for f in files_meta
],
}
(proj_dir / "_urls.json").write_text(
json.dumps(urls_manifest, ensure_ascii=False, indent=2), encoding="utf-8"
)
# 6. Unified metadata
meta = {
"source": "oshwhub",
"source_url": detail_url,
"project_id": uuid,
"title": detail.get("title") or list_item["name"],
"description_short": list_item.get("introduction") or "",
"description_path": "description.md",
"author": {
"username": list_item["owner"]["username"],
"display_name": list_item["owner"].get("nickname"),
"user_id": list_item["owner"].get("uuid"),
},
"license": detail.get("license") or "unknown",
"tags": list_item.get("tags") or [],
"created_at": list_item.get("created_at"),
"updated_at": list_item.get("updated_at"),
"published_at": list_item.get("oshwhub_publish_at"),
"crawled_at": datetime.now(timezone.utc).isoformat(),
"metrics": {
"likes": list_item["count"]["like"],
"stars": list_item["count"]["star"],
"forks": list_item["count"]["fork"],
"views": list_item["count"]["views"],
"watch": list_item["count"].get("watch", 0),
"comments": list_item.get("comments_count", 0),
},
"cover": {"url": thumb_url, "path": cover_rel} if thumb_url else None,
"files": files_meta,
"raw_fields": {
"path": list_item["path"],
"grade": list_item.get("grade"),
"origin": list_item.get("origin"),
"public": list_item.get("public"),
"publish": list_item.get("publish"),
"skipped_files": skipped,
},
}
(proj_dir / "metadata.json").write_text(
json.dumps(meta, ensure_ascii=False, indent=2), encoding="utf-8"
)
return CrawlResult(
project_id=uuid,
out_dir=proj_dir,
files_count=len(files_meta),
bytes_total=bytes_total,
skipped_files=skipped,
)
# ---------------------------------------------------------------------------
# CLI
# ---------------------------------------------------------------------------
def iter_candidates(
client: httpx.Client,
pages: int,
page_size: int,
sort: str,
) -> Iterator[dict]:
for p in range(1, pages + 1):
res = list_projects(client, page=p, page_size=page_size, sort=sort)
for it in res["lists"]:
yield it
polite_sleep()
def main(argv: list[str] | None = None) -> int:
ap = argparse.ArgumentParser(description="oshwhub MVP crawler")
ap.add_argument("--out", type=Path, default=Path("data/raw/oshwhub"))
ap.add_argument("--top", type=int, default=10, help="number of projects to crawl")
ap.add_argument("--min-likes", type=int, default=50)
ap.add_argument("--min-grade", type=int, default=4)
ap.add_argument("--pages", type=int, default=3, help="list API pages to scan")
ap.add_argument("--page-size", type=int, default=30)
ap.add_argument("--sort", default="hot")
ap.add_argument("--uuids", type=str, default=None, help="comma-separated explicit UUID list")
ap.add_argument("--no-files", action="store_true", help="do not download attachments")
ap.add_argument("--limit", type=int, default=None, help="override --top, same effect")
args = ap.parse_args(argv)
n_target = args.limit if args.limit is not None else args.top
args.out.mkdir(parents=True, exist_ok=True)
with make_client() as client:
# Build list of items to crawl
if args.uuids:
wanted = set(args.uuids.split(","))
items: list[dict] = []
for it in iter_candidates(client, args.pages, args.page_size, args.sort):
if it["uuid"] in wanted:
items.append(it)
if len(items) == len(wanted):
break
if len(items) < len(wanted):
missing = wanted - {i["uuid"] for i in items}
print(f"WARN: missing uuids (not in top pages): {missing}", file=sys.stderr)
else:
pool = list(iter_candidates(client, args.pages, args.page_size, args.sort))
items = pick_top(
pool, n=n_target, min_likes=args.min_likes, min_grade=args.min_grade
)
if len(items) < n_target:
print(
f"WARN: only {len(items)} items passed filters "
f"(wanted {n_target})",
file=sys.stderr,
)
print(f"Crawling {len(items)} projects -> {args.out}")
for i, it in enumerate(items, 1):
print(f"[{i}/{len(items)}] {it['path']} ({it['name']})")
try:
r = crawl_one(client, it, args.out, fetch_files=not args.no_files)
print(
f" OK: {r.files_count} files, {r.bytes_total / 1024 / 1024:.1f} MB "
f"(skipped: {len(r.skipped_files)})"
)
except Exception as e:
print(f" FAIL: {e}", file=sys.stderr)
return 0
if __name__ == "__main__":
raise SystemExit(main())

View File

@@ -0,0 +1,71 @@
{
"detail_url": "https://oshwhub.com/qaxslk/dai-PD-QCyou-pian-jian-ce-yi-ji-",
"cover_url": "https://image.lceda.cn/pullimage/Xl5EY8fMBTiXzXkTPdbza8bTdtaqEHzKjVZyI5rF.jpeg",
"attachments": [
{
"name": "pd诱骗、检测&emarker读取演示.mp4",
"url": "https://image.lceda.cn/attachments/2022/7/uTn5lxDhfdtLIUHzLAJQlfdEqtf59MNG1ct1xOwv.mp4",
"original_id": "8227d8f1af9942ada85c34c0bae46520"
},
{
"name": "电流监测及功能演示.mp4",
"url": "https://image.lceda.cn/attachments/2022/7/Hrxaxo9kD6biCRjTHRPz9lihZPDspQxTyUOmj0ZP.mp4",
"original_id": "5a38d4a5c90c4c929ee6afd90685c54a"
},
{
"name": "qc诱骗演示.mp4",
"url": "https://image.lceda.cn/attachments/2022/7/TPVFa8A5CZUYDDcjwqLqGh2CasxOhQuwJwCrTUoV.mp4",
"original_id": "8ec5c15c8a884581b93ea7c92e0fd537"
},
{
"name": "flash_download_tool_3.9.2_0.zip",
"url": "https://image.lceda.cn/attachments/2022/8/zxKZnl7dstHkJzcCJsSCZH8Z3h4xv3r0dJ9pz4OR.zip",
"original_id": "4ebd8bd9cdc04174a33eabde9ad178b6"
},
{
"name": "iic测试.bin",
"url": "https://image.lceda.cn/attachments/2022/8/vry47jDECDC6Oi580rjR3A8kPBqxUEqrua6CyTHJ.bin",
"original_id": "62f50e21b4794a849019abf339cb0a87"
},
{
"name": "BOM清单.csv",
"url": "https://image.lceda.cn/attachments/2022/8/bgFVrW1VricnDvTBz3teVuMEZHn5p01utREdg1fB.txt",
"original_id": "1bf37839d71245baa542e5edd2c87c51"
},
{
"name": "IBOM焊接图.zip",
"url": "https://image.lceda.cn/attachments/2022/9/AMssLlo7nElKEtewGB5MR9CCltg0o1ANYHcLHIlc.zip",
"original_id": "9510dc61265243f691828f76ed24eb0c"
},
{
"name": "新版本直通监测,主界面,PD监测抓包,Emarker读取演示.mp4",
"url": "https://image.lceda.cn/attachments/2023/3/ml3J4ndhkWtv85i37YK1bXUyl8ss2Me00izGjSPv.mp4",
"original_id": "aacf4846545f4b26a2ca90355e51ead3"
},
{
"name": "新版本PD,PPS诱骗,PD抓包Emarker读取演示.mp4",
"url": "https://image.lceda.cn/attachments/2023/3/UoNgPZVjkgceMl8H1AlPv0HGYMX0cGpSjz71rCzO.mp4",
"original_id": "323305b48e6a4fd99de89d4892f2b8ca"
},
{
"name": "新版本QC,QC3诱骗演示.mp4",
"url": "https://image.lceda.cn/attachments/2023/3/GVI4oTGtFn7v7M97a0wCk713lRsC0FI9gtSBtemK.mp4",
"original_id": "c4a07773431643e28aa45a3d523e7869"
},
{
"name": "新版本设置项等其它功能演示.mp4",
"url": "https://image.lceda.cn/attachments/2023/3/okBYwyFpliRTbS0WjOq3nDOd8VArZNrienxnYOd5.mp4",
"original_id": "cfe67e3dd4bb44bea05a6b07fa396618"
},
{
"name": "TTL1.2.3 免注册.bin",
"url": "https://image.lceda.cn/oshwhub/project/attachments/3c8beccc8bb645d7900f78ff8b5bd511.bin",
"original_id": "44872f72038747a8b42ad88b812a3443"
},
{
"name": "OTA1.2.3 免注册.bin",
"url": "https://image.lceda.cn/oshwhub/project/attachments/72261283c1a44d9d9c48e1a3a7c332b4.bin",
"original_id": "2172e76f1d4d42ccb4d89d2a27d7be5f"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

View File

@@ -0,0 +1,9 @@
# 支持PD3.1/米PPS与Emarker读取的USB电压电流表
基于ESP32-PICO-D4的USB功率计实现了PD3.1/PPS/QC的监测与诱骗支持米私有诱骗、Emarker读取以及诸多其他功能具体功能可看项目功能介绍。
---
- Source: https://oshwhub.com/qaxslk/dai-PD-QCyou-pian-jian-ce-yi-ji-
- Author: qaxslk (qaxslk)
- License: CC BY-NC-SA 4.0
- Published: 2024-06-07T01:11:10.000Z

Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:0b8a51addcda633de81d5d18e5b4e708304a45b8e2814c64ee17d7ce6339fd11
3 size 12530

View File

@@ -0,0 +1,184 @@
{
"source": "oshwhub",
"source_url": "https://oshwhub.com/qaxslk/dai-PD-QCyou-pian-jian-ce-yi-ji-",
"project_id": "1a1e865568d04db59a5a140dd3f13581",
"title": "支持PD3.1/米PPS与Emarker读取的USB电压电流表",
"description_short": "基于ESP32-PICO-D4的USB功率计实现了PD3.1/PPS/QC的监测与诱骗支持米私有诱骗、Emarker读取以及诸多其他功能具体功能可看项目功能介绍。",
"description_path": "description.md",
"author": {
"username": "qaxslk",
"display_name": "qaxslk",
"user_id": "5ff188711e4342099df5e500bc5a464c"
},
"license": "CC BY-NC-SA 4.0",
"tags": [],
"created_at": "2022-07-13T15:55:26.000Z",
"updated_at": "2025-12-24T02:04:01.000Z",
"published_at": "2024-06-07T01:11:10.000Z",
"crawled_at": "2026-04-23T11:30:39.860358+00:00",
"metrics": {
"likes": 1215,
"stars": 2695,
"forks": 1146,
"views": 306681,
"watch": 0,
"comments": 448
},
"cover": {
"url": "https://image.lceda.cn/pullimage/Xl5EY8fMBTiXzXkTPdbza8bTdtaqEHzKjVZyI5rF.jpeg",
"path": "cover.jpeg"
},
"files": [
{
"name": "pd诱骗、检测&emarker读取演示.mp4",
"url": "https://image.lceda.cn/attachments/2022/7/uTn5lxDhfdtLIUHzLAJQlfdEqtf59MNG1ct1xOwv.mp4",
"original_id": "8227d8f1af9942ada85c34c0bae46520",
"ext": "mp4",
"mime": "video/mp4",
"size": 42014963,
"md5": "27b4c853705de1e2c8f3dbacbe932c06",
"path": "files/pd诱骗、检测&emarker读取演示.mp4",
"sha256": "7ddb738a0acc396f9f7bc7d7a37d62f4874f113442fdccffe98b7d11f8d4d16e"
},
{
"name": "电流监测及功能演示.mp4",
"url": "https://image.lceda.cn/attachments/2022/7/Hrxaxo9kD6biCRjTHRPz9lihZPDspQxTyUOmj0ZP.mp4",
"original_id": "5a38d4a5c90c4c929ee6afd90685c54a",
"ext": "mp4",
"mime": "video/mp4",
"size": 30663097,
"md5": "ce92545afce40853be91a4b35fd31a74",
"path": "files/电流监测及功能演示.mp4",
"sha256": "62ea7eb1b512dc89326f222148903247389e6d1e1d1d06a86d01411b941fc78b"
},
{
"name": "qc诱骗演示.mp4",
"url": "https://image.lceda.cn/attachments/2022/7/TPVFa8A5CZUYDDcjwqLqGh2CasxOhQuwJwCrTUoV.mp4",
"original_id": "8ec5c15c8a884581b93ea7c92e0fd537",
"ext": "mp4",
"mime": "video/mp4",
"size": 43307009,
"md5": "f2645fc0c007df8a76a687a34fe1e9c5",
"path": "files/qc诱骗演示.mp4",
"sha256": "6752cefab7403f0964fce635e87d3efc0915f0dbc95799c8cd8235ca3ad8152d"
},
{
"name": "flash_download_tool_3.9.2_0.zip",
"url": "https://image.lceda.cn/attachments/2022/8/zxKZnl7dstHkJzcCJsSCZH8Z3h4xv3r0dJ9pz4OR.zip",
"original_id": "4ebd8bd9cdc04174a33eabde9ad178b6",
"ext": "zip",
"mime": "application/x-zip-compressed",
"size": 32734744,
"md5": "4f493dae92337d5b2a91735e9243a551",
"path": "files/flash_download_tool_3.9.2_0.zip",
"sha256": "b3cfc172dad907b1aa24a5424b3d682ff26d5786fb8bc6bbd58c0138ce012c32"
},
{
"name": "iic测试.bin",
"url": "https://image.lceda.cn/attachments/2022/8/vry47jDECDC6Oi580rjR3A8kPBqxUEqrua6CyTHJ.bin",
"original_id": "62f50e21b4794a849019abf339cb0a87",
"ext": "bin",
"mime": "application/octet-stream",
"size": 285584,
"md5": "e62c5dcadbbb36a066a4f98fea76c2d1",
"path": "files/iic测试.bin",
"sha256": "7419ef6b09267c66925ccb5caf599115c9d147c12336080423bb90fc0d12ac2b"
},
{
"name": "BOM清单.csv",
"url": "https://image.lceda.cn/attachments/2022/8/bgFVrW1VricnDvTBz3teVuMEZHn5p01utREdg1fB.txt",
"original_id": "1bf37839d71245baa542e5edd2c87c51",
"ext": "txt",
"mime": "application/octet-stream",
"size": 12530,
"md5": "025fc254292a1a2985695e9634a3bdbc",
"path": "files/BOM清单.csv",
"sha256": "0b8a51addcda633de81d5d18e5b4e708304a45b8e2814c64ee17d7ce6339fd11"
},
{
"name": "IBOM焊接图.zip",
"url": "https://image.lceda.cn/attachments/2022/9/AMssLlo7nElKEtewGB5MR9CCltg0o1ANYHcLHIlc.zip",
"original_id": "9510dc61265243f691828f76ed24eb0c",
"ext": "zip",
"mime": "application/x-zip-compressed",
"size": 107801,
"md5": "dd51ef36f5cfb614d81b94742e0bf527",
"path": "files/IBOM焊接图.zip",
"sha256": "eadc67396a41531c691454dcaa1597c99988975d498a3a19bdf93cb2354bd1d3"
},
{
"name": "新版本直通监测,主界面,PD监测抓包,Emarker读取演示.mp4",
"url": "https://image.lceda.cn/attachments/2023/3/ml3J4ndhkWtv85i37YK1bXUyl8ss2Me00izGjSPv.mp4",
"original_id": "aacf4846545f4b26a2ca90355e51ead3",
"ext": "mp4",
"mime": "video/mp4",
"size": 21536979,
"md5": "c68d8d5d2e8794c0a0242773c0d6784c",
"path": "files/新版本直通监测,主界面,PD监测抓包,Emarker读取演示.mp4",
"sha256": "abe0194ae357a4b381648abe774e48a02c94d12305f1d6dee2e7dfe95f8a5fae"
},
{
"name": "新版本PD,PPS诱骗,PD抓包Emarker读取演示.mp4",
"url": "https://image.lceda.cn/attachments/2023/3/UoNgPZVjkgceMl8H1AlPv0HGYMX0cGpSjz71rCzO.mp4",
"original_id": "323305b48e6a4fd99de89d4892f2b8ca",
"ext": "mp4",
"mime": "video/mp4",
"size": 16394310,
"md5": "93991863eeb592c0c661e5871d247e14",
"path": "files/新版本PD,PPS诱骗,PD抓包Emarker读取演示.mp4",
"sha256": "9b764917ab6b04766fdcb8ce41f96c065ad1bbe4e34cb2ece4a94044aa8865a1"
},
{
"name": "新版本QC,QC3诱骗演示.mp4",
"url": "https://image.lceda.cn/attachments/2023/3/GVI4oTGtFn7v7M97a0wCk713lRsC0FI9gtSBtemK.mp4",
"original_id": "c4a07773431643e28aa45a3d523e7869",
"ext": "mp4",
"mime": "video/mp4",
"size": 9525550,
"md5": "d79bd2e739cfd4569f7550cb2cb166d0",
"path": "files/新版本QC,QC3诱骗演示.mp4",
"sha256": "a9d8108ab0701b02a36e5384a9b046a6c7dfb8b0d0aaceb0c8766fda2fb5366d"
},
{
"name": "新版本设置项等其它功能演示.mp4",
"url": "https://image.lceda.cn/attachments/2023/3/okBYwyFpliRTbS0WjOq3nDOd8VArZNrienxnYOd5.mp4",
"original_id": "cfe67e3dd4bb44bea05a6b07fa396618",
"ext": "mp4",
"mime": "video/mp4",
"size": 14885852,
"md5": "aa0ad712586d956f96061cac9af9579a",
"path": "files/新版本设置项等其它功能演示.mp4",
"sha256": "71249c098d89e07e224556818875c9c821f5356137c578576b52e1d6d418d55d"
},
{
"name": "TTL1.2.3 免注册.bin",
"url": "https://image.lceda.cn/oshwhub/project/attachments/3c8beccc8bb645d7900f78ff8b5bd511.bin",
"original_id": "44872f72038747a8b42ad88b812a3443",
"ext": "bin",
"mime": "application/octet-stream",
"size": 1520480,
"md5": "dbd936ed6a9b9120a610a7f9ca67efe8",
"path": "files/TTL1.2.3 免注册.bin",
"sha256": "1c7a4e934b296944b462e3a511795b5e17c58319a6ee2d3f630ff8a3c5af9c44"
},
{
"name": "OTA1.2.3 免注册.bin",
"url": "https://image.lceda.cn/oshwhub/project/attachments/72261283c1a44d9d9c48e1a3a7c332b4.bin",
"original_id": "2172e76f1d4d42ccb4d89d2a27d7be5f",
"ext": "bin",
"mime": "application/octet-stream",
"size": 1454944,
"md5": "25b84659cd5224d89232935b3d1a4d47",
"path": "files/OTA1.2.3 免注册.bin",
"sha256": "b7d6bb3ae33ec3809c69ef26c3af19a0c57c775f2ce36af4a18c6d5136b24693"
}
],
"raw_fields": {
"path": "qaxslk/dai-PD-QCyou-pian-jian-ce-yi-ji-",
"grade": 4,
"origin": "std",
"public": true,
"publish": true,
"skipped_files": []
}
}

View File

@@ -0,0 +1,16 @@
{
"detail_url": "https://oshwhub.com/wesd/h7b0-re-cheng-xiang",
"cover_url": "https://image.lceda.cn/pullimage/t7auihPq2yo15qct0rCwUXUdBubfIkMhOd1UqaJ1.jpeg",
"attachments": [
{
"name": "1.zip",
"url": "https://image.lceda.cn/attachments/2022/10/aWLQlbeyYn7SOVykc2x9OWuHpCi5TpXJZfzuQVXS.zip",
"original_id": "ad6720dbc62a4152aa6267e24621a700"
},
{
"name": "H7B0_IRCAM.rar",
"url": "https://image.lceda.cn/attachments/2023/11/40UrslRfPUk0LUDL5UzA1d8QLzSKrn8lZS41hpxk.rar",
"original_id": "516214a3934d43e1a8395923f923a777"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 966 KiB

View File

@@ -0,0 +1,9 @@
# 手持红外热成像
MLX90640+STM32H7B0的红外热成像外加一颗ov7670摄像头做辅助显示最高可做到32HZ的刷新率。
---
- Source: https://oshwhub.com/wesd/h7b0-re-cheng-xiang
- Author: wesd (wesd)
- License: CERN Open Hardware License
- Published: 2023-11-08T01:25:18.000Z

View File

@@ -0,0 +1,63 @@
{
"source": "oshwhub",
"source_url": "https://oshwhub.com/wesd/h7b0-re-cheng-xiang",
"project_id": "1b09581d66d34438a1e6513e457e0532",
"title": "手持红外热成像",
"description_short": "MLX90640+STM32H7B0的红外热成像外加一颗ov7670摄像头做辅助显示最高可做到32HZ的刷新率。",
"description_path": "description.md",
"author": {
"username": "wesd",
"display_name": "wesd",
"user_id": "b3f7b33189a14088aa30416e034eca7f"
},
"license": "CERN Open Hardware License",
"tags": [],
"created_at": "2022-09-06T13:54:54.000Z",
"updated_at": "2025-07-16T04:50:13.000Z",
"published_at": "2023-11-08T01:25:18.000Z",
"crawled_at": "2026-04-23T11:31:34.277837+00:00",
"metrics": {
"likes": 247,
"stars": 646,
"forks": 175,
"views": 73081,
"watch": 0,
"comments": 266
},
"cover": {
"url": "https://image.lceda.cn/pullimage/t7auihPq2yo15qct0rCwUXUdBubfIkMhOd1UqaJ1.jpeg",
"path": "cover.jpeg"
},
"files": [
{
"name": "1.zip",
"url": "https://image.lceda.cn/attachments/2022/10/aWLQlbeyYn7SOVykc2x9OWuHpCi5TpXJZfzuQVXS.zip",
"original_id": "ad6720dbc62a4152aa6267e24621a700",
"ext": "zip",
"mime": "application/x-zip-compressed",
"size": 524804,
"md5": "7b5d94829be2e562228791a3ce9041ec",
"path": "files/1.zip",
"sha256": "9210315e8660a91932567dafac2959fc31f20bb05e8992363bad44d422144f1d"
},
{
"name": "H7B0_IRCAM.rar",
"url": "https://image.lceda.cn/attachments/2023/11/40UrslRfPUk0LUDL5UzA1d8QLzSKrn8lZS41hpxk.rar",
"original_id": "516214a3934d43e1a8395923f923a777",
"ext": "rar",
"mime": "application/octet-stream",
"size": 2968329,
"md5": "ba10570948bc2e24abb66bce0b7231e0",
"path": "files/H7B0_IRCAM.rar",
"sha256": "c6de1749d1fc88b637d06dced7e6da14610c5f44c3879bdbbbb5c66f73b81652"
}
],
"raw_fields": {
"path": "wesd/h7b0-re-cheng-xiang",
"grade": 4,
"origin": "std",
"public": true,
"publish": true,
"skipped_files": []
}
}

View File

@@ -0,0 +1,41 @@
{
"detail_url": "https://oshwhub.com/CYIIOT/ST_LINK-V2_1",
"cover_url": "https://image.lceda.cn/avatars/2020/7/QGOICt1FmLQGlyFeTCShZUHzaN0thIW2Xhv0nmSs.jpeg",
"attachments": [
{
"name": "ST-Link V2.1官方图纸.pdf",
"url": "https://image.lceda.cn/attachments/2020/7/mRn5hQZRhmx5r4usGxFmy8BXsCIHw5QoAT5HaLGC.pdf",
"original_id": "83ade303f9824d67b189378f9068648e"
},
{
"name": "STLinkV2.J16.S4_固件.zip",
"url": "https://image.lceda.cn/attachments/2020/7/TSTPA8NInE8TfdNLjAVjBkcnXvFEhQ8RoA5SUzn4.zip",
"original_id": "aff1059cee92438d8d50f5c9937e31e0"
},
{
"name": "STLinkV2.J28.M18_固件.zip",
"url": "https://image.lceda.cn/attachments/2020/7/qnbaX4ArFPq1kC6rNr5PCqaKPr6XdvfX27ZRGpFn.zip",
"original_id": "faa5cc219eb145a5a43c66dc4ad55cbc"
},
{
"name": "【发行公告】RN0093-firmware-upgrade-for-stlink-stlinkv2-stlinkv21-and-stlinkv3-boards-stmicroelectronics.pdf",
"url": "https://image.lceda.cn/attachments/2020/7/j1hsq6ByuWAiMHckonVoLGNqa3z47mp7D5w5n7e7.pdf",
"original_id": "80ede3877efd4cdabcc6fae174046452"
},
{
"name": "【技术说明】TN1235 Overview of ST-LINK derivatives.pdf",
"url": "https://image.lceda.cn/attachments/2020/7/dVO0hjpKz38q7ZtvFtEviPmVF60BIJDfScdnK9sB.pdf",
"original_id": "ce58b59a45464ed58475c1c7e191570a"
},
{
"name": "ST-LINK V2-1 固件烧录.mp4",
"url": "https://image.lceda.cn/attachments/2020/7/5ZfKD020NJcGs5mQ7H9MGh1WwSvy4RHY7TeTObfv.mp4",
"original_id": "1a443f96ecd849648278b2b6d2e7f670"
},
{
"name": "en.stsw-link007_V2-37-26.zip",
"url": "https://image.lceda.cn/attachments/2021/6/ZZO5tNxsae0LKhQ2aQ2VkZl0l0B94PSaFeVsmdqQ.zip",
"original_id": "7b431bd72f1c4f3d87d8dba98c171175"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 382 KiB

View File

@@ -0,0 +1,9 @@
# 自制ST-LINK V2-1开源版本
最近迷上了攻城狮工具的制作因手头有个潘多拉开发板板载一个STLINK/V2.1这玩意支持STM32调试还带了一个虚拟串口和虚拟U盘下载所以用立创EDA打造了一个小巧的STLINK/V2.1
---
- Source: https://oshwhub.com/CYIIOT/ST_LINK-V2_1
- Author: 攻城狮神木 (CYIIOT)
- License: GPL 3.0
- Published: 2025-12-01T02:55:40.000Z

View File

@@ -0,0 +1,118 @@
{
"source": "oshwhub",
"source_url": "https://oshwhub.com/CYIIOT/ST_LINK-V2_1",
"project_id": "298873b7fdbe44f8ba0e7351e023bc2c",
"title": "自制ST-LINK V2-1开源版本",
"description_short": "最近迷上了攻城狮工具的制作因手头有个潘多拉开发板板载一个STLINK/V2.1这玩意支持STM32调试还带了一个虚拟串口和虚拟U盘下载所以用立创EDA打造了一个小巧的STLINK/V2.1",
"description_path": "description.md",
"author": {
"username": "CYIIOT",
"display_name": "攻城狮神木",
"user_id": "367b6ee2c2114a459898e14b1268a641"
},
"license": "GPL 3.0",
"tags": [],
"created_at": "2020-07-21T08:18:03.000Z",
"updated_at": "2026-04-15T07:42:15.000Z",
"published_at": "2025-12-01T02:55:40.000Z",
"crawled_at": "2026-04-23T11:25:21.265012+00:00",
"metrics": {
"likes": 863,
"stars": 1947,
"forks": 996,
"views": 239671,
"watch": 0,
"comments": 369
},
"cover": {
"url": "https://image.lceda.cn/avatars/2020/7/QGOICt1FmLQGlyFeTCShZUHzaN0thIW2Xhv0nmSs.jpeg",
"path": "cover.jpeg"
},
"files": [
{
"name": "ST-Link V2.1官方图纸.pdf",
"url": "https://image.lceda.cn/attachments/2020/7/mRn5hQZRhmx5r4usGxFmy8BXsCIHw5QoAT5HaLGC.pdf",
"original_id": "83ade303f9824d67b189378f9068648e",
"ext": "pdf",
"mime": "application/pdf",
"size": 183323,
"md5": "bdb976690426a0e3216ad3aacd9878cc",
"path": "files/ST-Link V2.1官方图纸.pdf",
"sha256": "a73fdfe732b60d4c7482a09fc4464460bac7b4afcfdca014a9d33f8099b126cd"
},
{
"name": "STLinkV2.J16.S4_固件.zip",
"url": "https://image.lceda.cn/attachments/2020/7/TSTPA8NInE8TfdNLjAVjBkcnXvFEhQ8RoA5SUzn4.zip",
"original_id": "aff1059cee92438d8d50f5c9937e31e0",
"ext": "zip",
"mime": "application/x-zip-compressed",
"size": 31004,
"md5": "d84a96b7110a61e77e479eb8501ec270",
"path": "files/STLinkV2.J16.S4_固件.zip",
"sha256": "c20db3e7512df2afc60dbad3bffeb8a743ea1ff7d160b877874c66d7fcb97bfb"
},
{
"name": "STLinkV2.J28.M18_固件.zip",
"url": "https://image.lceda.cn/attachments/2020/7/qnbaX4ArFPq1kC6rNr5PCqaKPr6XdvfX27ZRGpFn.zip",
"original_id": "faa5cc219eb145a5a43c66dc4ad55cbc",
"ext": "zip",
"mime": "application/x-zip-compressed",
"size": 42906,
"md5": "5904682016ab096c16b06f5cf232dbc5",
"path": "files/STLinkV2.J28.M18_固件.zip",
"sha256": "b58d6ee8ee51098868a1aae30fcf5ea104f2be6005d10a14858ee2f546eae607"
},
{
"name": "【发行公告】RN0093-firmware-upgrade-for-stlink-stlinkv2-stlinkv21-and-stlinkv3-boards-stmicroelectronics.pdf",
"url": "https://image.lceda.cn/attachments/2020/7/j1hsq6ByuWAiMHckonVoLGNqa3z47mp7D5w5n7e7.pdf",
"original_id": "80ede3877efd4cdabcc6fae174046452",
"ext": "pdf",
"mime": "application/pdf",
"size": 226423,
"md5": "cde4dedc62b84959b8084a04881443da",
"path": "files/【发行公告】RN0093-firmware-upgrade-for-stlink-stlinkv2-stlinkv21-and-stlinkv3-boards-stmicroelectronics.pdf",
"sha256": "9536752ee47a63f86a17b68a99abe3e1e9238370d63dfe602e44b386a2c49342"
},
{
"name": "【技术说明】TN1235 Overview of ST-LINK derivatives.pdf",
"url": "https://image.lceda.cn/attachments/2020/7/dVO0hjpKz38q7ZtvFtEviPmVF60BIJDfScdnK9sB.pdf",
"original_id": "ce58b59a45464ed58475c1c7e191570a",
"ext": "pdf",
"mime": "application/pdf",
"size": 876773,
"md5": "6c737c2d8ed697011f9de862f5df3857",
"path": "files/【技术说明】TN1235 Overview of ST-LINK derivatives.pdf",
"sha256": "03db2b7a4a4161160f697c84f49ad61401a09dca77b8e9b7ae8bfca5d1995cf7"
},
{
"name": "ST-LINK V2-1 固件烧录.mp4",
"url": "https://image.lceda.cn/attachments/2020/7/5ZfKD020NJcGs5mQ7H9MGh1WwSvy4RHY7TeTObfv.mp4",
"original_id": "1a443f96ecd849648278b2b6d2e7f670",
"ext": "mp4",
"mime": "video/mp4",
"size": 18953976,
"md5": "f8547b0850763aed60dde607578c6005",
"path": "files/ST-LINK V2-1 固件烧录.mp4",
"sha256": "31e81fadb0f3c67064dd87e8a269b76abcb2660a574c1f0c384ff1509b95fe73"
},
{
"name": "en.stsw-link007_V2-37-26.zip",
"url": "https://image.lceda.cn/attachments/2021/6/ZZO5tNxsae0LKhQ2aQ2VkZl0l0B94PSaFeVsmdqQ.zip",
"original_id": "7b431bd72f1c4f3d87d8dba98c171175",
"ext": "zip",
"mime": "application/x-zip-compressed",
"size": 1597918,
"md5": "2fb1abb4c30ef4537743cb837af402d1",
"path": "files/en.stsw-link007_V2-37-26.zip",
"sha256": "ef6a58b366c6004553ce2bf45bed934f17f88e6b87da1df30d56956c65aa2c3b"
}
],
"raw_fields": {
"path": "CYIIOT/ST_LINK-V2_1",
"grade": 4,
"origin": "std",
"public": true,
"publish": true,
"skipped_files": []
}
}

View File

@@ -0,0 +1,41 @@
{
"detail_url": "https://oshwhub.com/mojinyinhu/t12858-tong-yong-han-tai",
"cover_url": "https://image.lceda.cn/pullimage/X7qQwpTwtIeTBm2FkJfDZCo0K0tv4ZyyQCrgYJGQ.jpeg",
"attachments": [
{
"name": "F1-T12-858D-master4.07.zip",
"url": "https://image.lceda.cn/attachments/2022/4/jxFVtEW6XG1wB6AjK8ykfSwqUVDV9OpKiaHqqb51.zip",
"original_id": "456c6c6a13b64483be969f93637e7255"
},
{
"name": "固件在解压缩后在BINARY文件夹选取适合自己屏幕固件烧录.txt",
"url": "https://image.lceda.cn/attachments/2022/4/GREMfysm2sIMw6hOBfAwTvzjMdCPXCTAz5oq1jpd.txt",
"original_id": "f25fdd81e5134335a2f56b39da71c501"
},
{
"name": "校准.txt",
"url": "https://image.lceda.cn/attachments/2022/4/TBGObPjIQG0Z7h9bBrfZdZRKqdfgC9hAiCtaU6G7.txt",
"original_id": "4d9c148dafc64ad6b27dbefed3e8ec2e"
},
{
"name": "F1_T12+858D编译视频教程.rar",
"url": "https://image.lceda.cn/attachments/2022/4/oIV5aPj2dyXrwODr0PpF9VH16w98TuJmggWB3lJ4.rar",
"original_id": "70d67505c93242a4a3bc7fb91fa7c80d"
},
{
"name": "T12+858焊台BOM表.xlsx",
"url": "https://image.lceda.cn/attachments/2022/6/y6f0JXE1jHDbcoMVx9prMqU1VQODyNyCggeZFRY3.xlsx",
"original_id": "be2b2cce0ee24fe8838805cacd53ccd0"
},
{
"name": "PCB_小板合一拼版二层板自行导入力创导出gerber.json",
"url": "https://image.lceda.cn/attachments/2022/6/BMkqLsDhiJo2t8op8Ejvwwc8TaKqaooxSzg8a4rQ.txt",
"original_id": "eaba63442d404070b930639390eef369"
},
{
"name": "PCB_功率板+控制板四层板自行导入力创导出_2022-08-21.json",
"url": "https://image.lceda.cn/attachments/2022/8/4LRvXx6WH6DD8V8GPZQEegxSCThDMkr1w4qbe1FT.txt",
"original_id": "ae9d73994d534fd499a456fd9d2f7b40"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 309 KiB

View File

@@ -0,0 +1,9 @@
# t12-858d烙铁热风枪通用焊台二合一
基于开源t12 858设计重绘电路板到88*38*120铝外壳最小体积预留1.4寸TFT SPI接口和iic接口上到彩屏,也可修改到jbc245来使用预留了丰富的自定义空间
---
- Source: https://oshwhub.com/mojinyinhu/t12858-tong-yong-han-tai
- Author: mojinyinhu (mojinyinhu)
- License: GPL 3.0
- Published: 2024-07-26T08:17:03.000Z

View File

@@ -0,0 +1,118 @@
{
"source": "oshwhub",
"source_url": "https://oshwhub.com/mojinyinhu/t12858-tong-yong-han-tai",
"project_id": "3e2f893d74664e01b755ccf2582792de",
"title": "t12-858d烙铁热风枪通用焊台二合一",
"description_short": "基于开源t12 858设计重绘电路板到88*38*120铝外壳最小体积预留1.4寸TFT SPI接口和iic接口上到彩屏,也可修改到jbc245来使用预留了丰富的自定义空间",
"description_path": "description.md",
"author": {
"username": "mojinyinhu",
"display_name": "mojinyinhu",
"user_id": "2158788da2584d3893fcb09344aa7085"
},
"license": "GPL 3.0",
"tags": [],
"created_at": "2021-07-08T03:05:48.000Z",
"updated_at": "2026-04-20T02:02:25.000Z",
"published_at": "2024-07-26T08:17:03.000Z",
"crawled_at": "2026-04-23T11:27:21.695580+00:00",
"metrics": {
"likes": 483,
"stars": 1013,
"forks": 395,
"views": 133220,
"watch": 0,
"comments": 293
},
"cover": {
"url": "https://image.lceda.cn/pullimage/X7qQwpTwtIeTBm2FkJfDZCo0K0tv4ZyyQCrgYJGQ.jpeg",
"path": "cover.jpeg"
},
"files": [
{
"name": "F1-T12-858D-master4.07.zip",
"url": "https://image.lceda.cn/attachments/2022/4/jxFVtEW6XG1wB6AjK8ykfSwqUVDV9OpKiaHqqb51.zip",
"original_id": "456c6c6a13b64483be969f93637e7255",
"ext": "zip",
"mime": "application/x-zip-compressed",
"size": 33224795,
"md5": "2f69640add7a8b42c9b835fe682de26c",
"path": "files/F1-T12-858D-master4.07.zip",
"sha256": "b01b044b3f370ff17c66a2fe455312876a2b6d61ff818283c2ea747127786c95"
},
{
"name": "固件在解压缩后在BINARY文件夹选取适合自己屏幕固件烧录.txt",
"url": "https://image.lceda.cn/attachments/2022/4/GREMfysm2sIMw6hOBfAwTvzjMdCPXCTAz5oq1jpd.txt",
"original_id": "f25fdd81e5134335a2f56b39da71c501",
"ext": "txt",
"mime": "text/plain",
"size": 84,
"md5": "aa10d20f9601588d99dc697c4e573e49",
"path": "files/固件在解压缩后在BINARY文件夹选取适合自己屏幕固件烧录.txt",
"sha256": "abe44c2443bdc11876e750df1a927d2365318e20a978ed80ee6461e8ecbab05b"
},
{
"name": "校准.txt",
"url": "https://image.lceda.cn/attachments/2022/4/TBGObPjIQG0Z7h9bBrfZdZRKqdfgC9hAiCtaU6G7.txt",
"original_id": "4d9c148dafc64ad6b27dbefed3e8ec2e",
"ext": "txt",
"mime": "text/plain",
"size": 1058,
"md5": "167921cdc21b13a6c85abdb42f2ffba2",
"path": "files/校准.txt",
"sha256": "9fd2af841a84b6a27dd6c13d81c208d45a02e959a73094efb0b1fa4586f71215"
},
{
"name": "F1_T12+858D编译视频教程.rar",
"url": "https://image.lceda.cn/attachments/2022/4/oIV5aPj2dyXrwODr0PpF9VH16w98TuJmggWB3lJ4.rar",
"original_id": "70d67505c93242a4a3bc7fb91fa7c80d",
"ext": "rar",
"mime": "application/octet-stream",
"size": 10367841,
"md5": "0bbdb68ff491bba65004cbc507a0bb36",
"path": "files/F1_T12+858D编译视频教程.rar",
"sha256": "9da0b74d3757d08493811d888baebd466383126ce241dbe3b6d5f48d9d8b6c08"
},
{
"name": "T12+858焊台BOM表.xlsx",
"url": "https://image.lceda.cn/attachments/2022/6/y6f0JXE1jHDbcoMVx9prMqU1VQODyNyCggeZFRY3.xlsx",
"original_id": "be2b2cce0ee24fe8838805cacd53ccd0",
"ext": "xlsx",
"mime": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"size": 15738,
"md5": "6f60ccf1daf9f6441f0910827f3476ce",
"path": "files/T12+858焊台BOM表.xlsx",
"sha256": "80b8d57ef1a0615e1b01ba237f906e7063f870e67ccaa966e2ced3bcf3524a10"
},
{
"name": "PCB_小板合一拼版二层板自行导入力创导出gerber.json",
"url": "https://image.lceda.cn/attachments/2022/6/BMkqLsDhiJo2t8op8Ejvwwc8TaKqaooxSzg8a4rQ.txt",
"original_id": "eaba63442d404070b930639390eef369",
"ext": "txt",
"mime": "application/json",
"size": 780139,
"md5": "0298cf1a0e505b3cebcf9f8c0c18adc9",
"path": "files/PCB_小板合一拼版二层板自行导入力创导出gerber.json",
"sha256": "f42a140b9183d242da25bdec5b861c4ade79033ddb1a8b39a71690fcd9c09646"
},
{
"name": "PCB_功率板+控制板四层板自行导入力创导出_2022-08-21.json",
"url": "https://image.lceda.cn/attachments/2022/8/4LRvXx6WH6DD8V8GPZQEegxSCThDMkr1w4qbe1FT.txt",
"original_id": "ae9d73994d534fd499a456fd9d2f7b40",
"ext": "txt",
"mime": "application/json",
"size": 1825835,
"md5": "9e4a2e722f2d57539add8750f9e27ff3",
"path": "files/PCB_功率板+控制板四层板自行导入力创导出_2022-08-21.json",
"sha256": "e7238e5752f2aa763ba4900bac2cff07c8bcfb6b3a316c3809fc5da79ef04ad9"
}
],
"raw_fields": {
"path": "mojinyinhu/t12858-tong-yong-han-tai",
"grade": 4,
"origin": "std",
"public": true,
"publish": true,
"skipped_files": []
}
}

View File

@@ -0,0 +1,26 @@
{
"detail_url": "https://oshwhub.com/sheep_finder/pcb-heng-wen-jia-re-tai",
"cover_url": "https://image.lceda.cn/avatars/2022/10/q3e5mInHcWPvP4K2wqCpzB0dJr8n0tCHj4OJb4Wh.png",
"attachments": [
{
"name": "加热台量产计划.zip",
"url": "https://image.lceda.cn/attachments/2023/3/3D63VEzSSgu7tMjN4RTiEbDSiqmlo1Yiv6uvNWXk.zip",
"original_id": "bebc0475e03e43199806c4dfc78847b1"
},
{
"name": "焊接烧录指引v2.pdf",
"url": "https://image.lceda.cn/attachments/2023/4/2AhHlXehkZO4nC0zGTVH5TKH50X0IHZtmacdlfWq.pdf",
"original_id": "3bd33eb9d73b4b4db05820c9fbfccbc1"
},
{
"name": "加热台Q&amp;A.docx",
"url": "https://image.lceda.cn/attachments/2023/4/RwQkCsS9xv2UWoZ3JbVPgKa7IULczPGBFyk9tWLm.bin",
"original_id": "e5f6f384fb11489f99e27e8aebf06ffb"
},
{
"name": "2023-2-7 焊接编码器教程.pdf",
"url": "https://image.lceda.cn/attachments/2023/4/8cflSrzwHsuPme258lpLoQLVym2YisHLNzmWsgly.pdf",
"original_id": "21963ef73c534309b1754bd2ce452a2f"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 MiB

View File

@@ -0,0 +1,10 @@
# 加热台量产计划
基于启凡科创的物联网加热台优化而来。
对应启凡科创v2.0版本作出适配
---
- Source: https://oshwhub.com/sheep_finder/pcb-heng-wen-jia-re-tai
- Author: sheep_finder (sheep_finder)
- License: Public Domain
- Published: 2025-11-10T02:35:05.000Z

View File

@@ -0,0 +1,85 @@
{
"source": "oshwhub",
"source_url": "https://oshwhub.com/sheep_finder/pcb-heng-wen-jia-re-tai",
"project_id": "7b6a398811f14eba9a952b8d2ddd7ace",
"title": "加热台量产计划",
"description_short": "基于启凡科创的物联网加热台优化而来。\n对应启凡科创v2.0版本作出适配",
"description_path": "description.md",
"author": {
"username": "sheep_finder",
"display_name": "sheep_finder",
"user_id": "dc43748f38a9490396e4969820abff90"
},
"license": "Public Domain",
"tags": [],
"created_at": "2022-10-03T04:28:21.000Z",
"updated_at": "2026-04-03T01:41:07.000Z",
"published_at": "2025-11-10T02:35:05.000Z",
"crawled_at": "2026-04-23T11:25:46.651730+00:00",
"metrics": {
"likes": 1447,
"stars": 3293,
"forks": 3939,
"views": 347329,
"watch": 0,
"comments": 383
},
"cover": {
"url": "https://image.lceda.cn/avatars/2022/10/q3e5mInHcWPvP4K2wqCpzB0dJr8n0tCHj4OJb4Wh.png",
"path": "cover.png"
},
"files": [
{
"name": "加热台量产计划.zip",
"url": "https://image.lceda.cn/attachments/2023/3/3D63VEzSSgu7tMjN4RTiEbDSiqmlo1Yiv6uvNWXk.zip",
"original_id": "bebc0475e03e43199806c4dfc78847b1",
"ext": "zip",
"mime": "application/x-zip-compressed",
"size": 21328814,
"md5": "6502c95eaf49092d463ea14be07d1cf9",
"path": "files/加热台量产计划.zip",
"sha256": "900f4c61e72a1ab22a113f0d55525244cd5eb072858cb0c4e5c950a7b647ad2e"
},
{
"name": "焊接烧录指引v2.pdf",
"url": "https://image.lceda.cn/attachments/2023/4/2AhHlXehkZO4nC0zGTVH5TKH50X0IHZtmacdlfWq.pdf",
"original_id": "3bd33eb9d73b4b4db05820c9fbfccbc1",
"ext": "pdf",
"mime": "application/pdf",
"size": 1869778,
"md5": "bbcd571e21e230aec83af6909c453a80",
"path": "files/焊接烧录指引v2.pdf",
"sha256": "1551906d358b75a1ac070a3c13341761d55c0cd378697a90edc4a419ad6c195f"
},
{
"name": "加热台Q&amp;A.docx",
"url": "https://image.lceda.cn/attachments/2023/4/RwQkCsS9xv2UWoZ3JbVPgKa7IULczPGBFyk9tWLm.bin",
"original_id": "e5f6f384fb11489f99e27e8aebf06ffb",
"ext": "bin",
"mime": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"size": 13592,
"md5": "e3f6675ec77f862d15250075e888838d",
"path": "files/加热台Q&amp;A.docx",
"sha256": "b048901d8851b75257305865f2a9bbf97239756d2c4f0d9ab3b09d1828d95263"
},
{
"name": "2023-2-7 焊接编码器教程.pdf",
"url": "https://image.lceda.cn/attachments/2023/4/8cflSrzwHsuPme258lpLoQLVym2YisHLNzmWsgly.pdf",
"original_id": "21963ef73c534309b1754bd2ce452a2f",
"ext": "pdf",
"mime": "application/pdf",
"size": 857188,
"md5": "0bbf490c7d06fb733f88ddd3715d5a7d",
"path": "files/2023-2-7 焊接编码器教程.pdf",
"sha256": "933b1d40e5c8a1c80b3499931c002b7d30a408dc2dc9fa1ba8954b772fdd3961"
}
],
"raw_fields": {
"path": "sheep_finder/pcb-heng-wen-jia-re-tai",
"grade": 4,
"origin": "std",
"public": true,
"publish": true,
"skipped_files": []
}
}

View File

@@ -0,0 +1,36 @@
{
"detail_url": "https://oshwhub.com/dhx233/esp32_s3_watch",
"cover_url": "https://image.lceda.cn/oshwhub/e65c8dd8b85f426ebded1acf94084b55.jpg",
"attachments": [
{
"name": "演示视频V1_0_2.mp4",
"url": "https://image.lceda.cn/attachments/2023/5/rjPzo9rb32stS2uMtOYyQHB1Mzsku2jIpfkxS0u6.mp4",
"original_id": "9e3b1b0aab4e4077bba58e9b99072752"
},
{
"name": "QF_ZERO_V2_V1_0_3.zip",
"url": "https://image.lceda.cn/attachments/2023/5/a07O0dN3bNwNohLe4TFmCeNc9OPFYHyo3p4GWagW.zip",
"original_id": "ec260479deae4829992fe4e87f0e461a"
},
{
"name": "lvgl_demo_watch_code_blocks.zip",
"url": "https://image.lceda.cn/attachments/2023/6/vEqACjU5pj8DZUYTFlMSquYiTrT05KqWEXKtwtle.zip",
"original_id": "511fcfd7fd0743c98b5d05bb2919c778"
},
{
"name": "V1.2外壳打螺丝版本.zip",
"url": "https://image.lceda.cn/attachments/2023/6/Y4R4DRQgYSDp7qdF3Jti2NYUpFlRpGXvEr1EcDpW.zip",
"original_id": "27d5835a26824d0ab7666ebe7a1d679b"
},
{
"name": "wx_camera_1697969384939.mp4",
"url": "https://image.lceda.cn/attachments/2023/10/FiNBQGrRzqux6SvmFD2ZRxvEV8hgRpW2bpF08zKj.mp4",
"original_id": "bd456ad1f21a40b2a84492eab943fb08"
},
{
"name": "qf_zero_v2_firmeware_V1.0.9_app.bin",
"url": "https://image.lceda.cn/oshwhub/project/attachments/4d91cd61c2374105bb43e92a619b4efa.bin",
"original_id": "f4b04d62ddc5451ca1fd77675d75cf53"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 889 KiB

View File

@@ -0,0 +1,9 @@
# QF ZERO V2 智能手表终端V1.0.9-24-6-29
QF ZERO V2 基于ESP32-S3的智能手表
---
- Source: https://oshwhub.com/dhx233/esp32_s3_watch
- Author: 启凡科创 (dhx233)
- License: Public Domain
- Published: 2024-07-01T02:04:33.000Z

View File

@@ -0,0 +1,107 @@
{
"source": "oshwhub",
"source_url": "https://oshwhub.com/dhx233/esp32_s3_watch",
"project_id": "892dbc4ebca74227ac6269a1693380d8",
"title": "QF ZERO V2 智能手表终端V1.0.9-24-6-29",
"description_short": "QF ZERO V2 基于ESP32-S3的智能手表",
"description_path": "description.md",
"author": {
"username": "dhx233",
"display_name": "启凡科创",
"user_id": "80fcee0f22fe42998cec371bbcdff7a2"
},
"license": "Public Domain",
"tags": [],
"created_at": "2022-09-15T13:21:36.000Z",
"updated_at": "2025-10-27T07:11:41.000Z",
"published_at": "2024-07-01T02:04:33.000Z",
"crawled_at": "2026-04-23T11:28:24.308080+00:00",
"metrics": {
"likes": 774,
"stars": 1737,
"forks": 643,
"views": 175969,
"watch": 0,
"comments": 164
},
"cover": {
"url": "https://image.lceda.cn/oshwhub/e65c8dd8b85f426ebded1acf94084b55.jpg",
"path": "cover.jpg"
},
"files": [
{
"name": "演示视频V1_0_2.mp4",
"url": "https://image.lceda.cn/attachments/2023/5/rjPzo9rb32stS2uMtOYyQHB1Mzsku2jIpfkxS0u6.mp4",
"original_id": "9e3b1b0aab4e4077bba58e9b99072752",
"ext": "mp4",
"mime": "video/mp4",
"size": 14702117,
"md5": "7b9779bb0cedd761d73eda999f0d96cb",
"path": "files/演示视频V1_0_2.mp4",
"sha256": "cece75aa3cad558c25147c3b3591c2876cf764be3ff2e54e028c9648c7be1ba0"
},
{
"name": "QF_ZERO_V2_V1_0_3.zip",
"url": "https://image.lceda.cn/attachments/2023/5/a07O0dN3bNwNohLe4TFmCeNc9OPFYHyo3p4GWagW.zip",
"original_id": "ec260479deae4829992fe4e87f0e461a",
"ext": "zip",
"mime": "application/x-zip-compressed",
"size": 26411463,
"md5": "8b3f107973b5ac8185afe09ee29a82a0",
"path": "files/QF_ZERO_V2_V1_0_3.zip",
"sha256": "689b73069c915c7897e0de328152b571cabd1d874740a4e1e887604ae9ae899e"
},
{
"name": "lvgl_demo_watch_code_blocks.zip",
"url": "https://image.lceda.cn/attachments/2023/6/vEqACjU5pj8DZUYTFlMSquYiTrT05KqWEXKtwtle.zip",
"original_id": "511fcfd7fd0743c98b5d05bb2919c778",
"ext": "zip",
"mime": "application/x-zip-compressed",
"size": 52281875,
"md5": "f1a563c71d4d28bad47edb99b80575aa",
"path": "files/lvgl_demo_watch_code_blocks.zip",
"sha256": "3ac73ef2b6959643a36f33a55b508fb7d7b813d61fc1b51f821533914b971abb"
},
{
"name": "V1.2外壳打螺丝版本.zip",
"url": "https://image.lceda.cn/attachments/2023/6/Y4R4DRQgYSDp7qdF3Jti2NYUpFlRpGXvEr1EcDpW.zip",
"original_id": "27d5835a26824d0ab7666ebe7a1d679b",
"ext": "zip",
"mime": "application/x-zip-compressed",
"size": 283522,
"md5": "4189e693d7ef28528442a09dab456a4a",
"path": "files/V1.2外壳打螺丝版本.zip",
"sha256": "48930d21ca6c51da2b656c7602a89dd0a628470dbea5b0623ae5678b17215b20"
},
{
"name": "wx_camera_1697969384939.mp4",
"url": "https://image.lceda.cn/attachments/2023/10/FiNBQGrRzqux6SvmFD2ZRxvEV8hgRpW2bpF08zKj.mp4",
"original_id": "bd456ad1f21a40b2a84492eab943fb08",
"ext": "mp4",
"mime": "video/mp4",
"size": 22640916,
"md5": "d2ecd4237f611ba495b1fb75e924fc78",
"path": "files/wx_camera_1697969384939.mp4",
"sha256": "cdf1df59f95baac8374244c786e6cf72ed264caf5ca1ed4a8a3b1c42ffb3c87e"
},
{
"name": "qf_zero_v2_firmeware_V1.0.9_app.bin",
"url": "https://image.lceda.cn/oshwhub/project/attachments/4d91cd61c2374105bb43e92a619b4efa.bin",
"original_id": "f4b04d62ddc5451ca1fd77675d75cf53",
"ext": "bin",
"mime": "application/octet-stream",
"size": 2130880,
"md5": "cf09c83d912765f054c72c07f2651e95",
"path": "files/qf_zero_v2_firmeware_V1.0.9_app.bin",
"sha256": "d319ce5ad9787381cfe67977f99c1246af3ba8b4de65dbeb5bad42a29cac8df0"
}
],
"raw_fields": {
"path": "dhx233/esp32_s3_watch",
"grade": 4,
"origin": "std",
"public": true,
"publish": true,
"skipped_files": []
}
}

View File

@@ -0,0 +1,16 @@
{
"detail_url": "https://oshwhub.com/XACT/rt300-mkv",
"cover_url": "https://image.lceda.cn/pullimage/G0Yvb3LsUUqWspquWfqe3ray1cucrfmoPvXxT7H2.jpeg",
"attachments": [
{
"name": "video_20240608_002422.mp4",
"url": "https://image.lceda.cn/oshwhub/project/attachments/1fdcbde12c2f4a6faf8c519be4e72984.mp4",
"original_id": "d76ad6faae0240518eb7640ba8fc02cc"
},
{
"name": "RT300-MKV UserManual_24JUL25.pdf",
"url": "https://image.lceda.cn/oshwhub/project/attachments/a57ca3d5e7b54417aae014e2f12f17fa.pdf",
"original_id": "5dc0b16067344ed6bfc15471f2a3bd2a"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 KiB

View File

@@ -0,0 +1,9 @@
# RT300-MKV 250W 数控升降压桌面可调电源
RT300-MKV-EXTREME 同步混合功率级自动范围升降压型数控可调电源
---
- Source: https://oshwhub.com/XACT/rt300-mkv
- Author: XACT (XACT)
- License: CC BY-NC-SA 4.0
- Published: 2024-08-01T01:03:58.000Z

View File

@@ -0,0 +1,63 @@
{
"source": "oshwhub",
"source_url": "https://oshwhub.com/XACT/rt300-mkv",
"project_id": "91206ca73e96455f946bfcdd73e814fd",
"title": "RT300-MKV 250W 数控升降压桌面可调电源",
"description_short": "RT300-MKV-EXTREME 同步混合功率级自动范围升降压型数控可调电源",
"description_path": "description.md",
"author": {
"username": "XACT",
"display_name": "XACT",
"user_id": "e622ba5d959740ed90f4845a433def3a"
},
"license": "CC BY-NC-SA 4.0",
"tags": [],
"created_at": "2020-12-25T06:25:11.000Z",
"updated_at": "2025-12-19T01:07:55.000Z",
"published_at": "2024-08-01T01:03:58.000Z",
"crawled_at": "2026-04-23T11:26:39.736414+00:00",
"metrics": {
"likes": 867,
"stars": 1735,
"forks": 782,
"views": 185523,
"watch": 0,
"comments": 231
},
"cover": {
"url": "https://image.lceda.cn/pullimage/G0Yvb3LsUUqWspquWfqe3ray1cucrfmoPvXxT7H2.jpeg",
"path": "cover.jpeg"
},
"files": [
{
"name": "video_20240608_002422.mp4",
"url": "https://image.lceda.cn/oshwhub/project/attachments/1fdcbde12c2f4a6faf8c519be4e72984.mp4",
"original_id": "d76ad6faae0240518eb7640ba8fc02cc",
"ext": "mp4",
"mime": "video/mp4",
"size": 81553791,
"md5": "becffa3b615f415101f85d18b9bbfcf9",
"path": "files/video_20240608_002422.mp4",
"sha256": "06864530d9ef794927c8826b7e2e5bd7349587f9b6035e76606331bcba25fbd3"
},
{
"name": "RT300-MKV UserManual_24JUL25.pdf",
"url": "https://image.lceda.cn/oshwhub/project/attachments/a57ca3d5e7b54417aae014e2f12f17fa.pdf",
"original_id": "5dc0b16067344ed6bfc15471f2a3bd2a",
"ext": "pdf",
"mime": "application/pdf",
"size": 3320936,
"md5": "7f97a35fda72a0462ec8401d739ffd41",
"path": "files/RT300-MKV UserManual_24JUL25.pdf",
"sha256": "19eacef139ed672806a7bf492668b3f09e729d8c6eac6d2e5ed79aca8704685e"
}
],
"raw_fields": {
"path": "XACT/rt300-mkv",
"grade": 4,
"origin": "std",
"public": true,
"publish": true,
"skipped_files": []
}
}

View File

@@ -0,0 +1,41 @@
{
"detail_url": "https://oshwhub.com/armbian-pythoniot/yuzumaix-v831",
"cover_url": "https://image.lceda.cn/avatars/2023/4/DMgC3qzd0rQukGEieLTb377RTu3umnk2aRgvzuYv.png",
"attachments": [
{
"name": "WeChat_20230922093205.mp4",
"url": "https://image.lceda.cn/attachments/2023/9/oCmEMfVHeHKJDlGiDBulF9Xs8hR9zVpuNoIfKx3H.mp4",
"original_id": "997cfe92995946f6ab89a61a5dd07503"
},
{
"name": "大镜头.mp4",
"url": "https://image.lceda.cn/attachments/2023/9/02cMoTHflBm7R2xW3BIy1CzsgS9EZXuNOb5kBya6.mp4",
"original_id": "de14cc7868254108a76250bf22d1466a"
},
{
"name": "40a45ea8a5b9683f2bc5940dd0f03fc5.mp4",
"url": "https://image.lceda.cn/attachments/2023/11/RzUKJ9vGR07UX5NAov3fkU5qBc7Lm7l7YpnpBKam.mp4",
"original_id": "166a052b60cc47c881d6151c8f50e087"
},
{
"name": "d77c8f40aaf2ebf198d2ffe4ff9bde63.mp4",
"url": "https://image.lceda.cn/attachments/2023/11/qb0tziZO0kWitZlTOQ37tqFDFr48m4gGLnPPQnHs.mp4",
"original_id": "c36c4817224c4cbc89a8c57f692e34be"
},
{
"name": "WeChat_20231124121438.mp4",
"url": "https://image.lceda.cn/attachments/2023/11/ckssTsthpECXfdRpgjCxV9QyzRBvDjzh0ft6X4kI.mp4",
"original_id": "f668d7f08b2b40daa7bb04a58a49e2df"
},
{
"name": "WeChat_20231124121418.mp4",
"url": "https://image.lceda.cn/attachments/2023/11/T4kDKWugOAp5R2FPKQgNf4u5ymTOtlmla7xm5ZcG.mp4",
"original_id": "b16233f0eb624fc4a44fc0280f631f6e"
},
{
"name": "WeChat_20231124121403.mp4",
"url": "https://image.lceda.cn/attachments/2023/11/Qio2QOYXM8CBoofNaqbKRAaqQ3RZMgXNPhzuEgvL.mp4",
"original_id": "30129b0c66e14549926aa79f381afb2b"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 783 KiB

View File

@@ -0,0 +1,9 @@
# 柚子爱AI相机-YuzuAI-YuzuMaix-AIoT-V831开发板
基于V831的一个AI开源相机 硬件来自YuzukiIRC 固件和软件套用M2Dock和MaixPy3 原名YuzuMaix柚木麦被吐槽改名YuzuAI柚子爱。
---
- Source: https://oshwhub.com/armbian-pythoniot/yuzumaix-v831
- Author: Armbian-PythonIot (armbian-pythoniot)
- License: CC BY-NC-SA 3.0
- Published: 2023-12-14T01:58:46.000Z

View File

@@ -0,0 +1,118 @@
{
"source": "oshwhub",
"source_url": "https://oshwhub.com/armbian-pythoniot/yuzumaix-v831",
"project_id": "922c1f3a9b9a43ff98998f476e7946ca",
"title": "柚子爱AI相机-YuzuAI-YuzuMaix-AIoT-V831开发板",
"description_short": "基于V831的一个AI开源相机 硬件来自YuzukiIRC 固件和软件套用M2Dock和MaixPy3 原名YuzuMaix柚木麦被吐槽改名YuzuAI柚子爱。",
"description_path": "description.md",
"author": {
"username": "armbian-pythoniot",
"display_name": "Armbian-PythonIot",
"user_id": "5b6e6dc2413245cb9d41eb504949b13a"
},
"license": "CC BY-NC-SA 3.0",
"tags": [],
"created_at": "2023-04-05T04:08:23.000Z",
"updated_at": "2023-12-14T01:54:51.000Z",
"published_at": "2023-12-14T01:58:46.000Z",
"crawled_at": "2026-04-23T11:31:21.045637+00:00",
"metrics": {
"likes": 129,
"stars": 236,
"forks": 96,
"views": 45128,
"watch": 0,
"comments": 93
},
"cover": {
"url": "https://image.lceda.cn/avatars/2023/4/DMgC3qzd0rQukGEieLTb377RTu3umnk2aRgvzuYv.png",
"path": "cover.png"
},
"files": [
{
"name": "WeChat_20230922093205.mp4",
"url": "https://image.lceda.cn/attachments/2023/9/oCmEMfVHeHKJDlGiDBulF9Xs8hR9zVpuNoIfKx3H.mp4",
"original_id": "997cfe92995946f6ab89a61a5dd07503",
"ext": "mp4",
"mime": "video/mp4",
"size": 1145966,
"md5": "fc02f72d812662607b6430b9123e4110",
"path": "files/WeChat_20230922093205.mp4",
"sha256": "48f1d30c36ee2cf70307a59f11e78249d763f379d513fc131b33c98ae9290844"
},
{
"name": "大镜头.mp4",
"url": "https://image.lceda.cn/attachments/2023/9/02cMoTHflBm7R2xW3BIy1CzsgS9EZXuNOb5kBya6.mp4",
"original_id": "de14cc7868254108a76250bf22d1466a",
"ext": "mp4",
"mime": "video/mp4",
"size": 829241,
"md5": "b73514619c4ee6fe8e76bc7b32e6fa99",
"path": "files/大镜头.mp4",
"sha256": "054610980b91c2dac2629b3c33cb3ffdabcda332a3cc44c8e027221979dd6c36"
},
{
"name": "40a45ea8a5b9683f2bc5940dd0f03fc5.mp4",
"url": "https://image.lceda.cn/attachments/2023/11/RzUKJ9vGR07UX5NAov3fkU5qBc7Lm7l7YpnpBKam.mp4",
"original_id": "166a052b60cc47c881d6151c8f50e087",
"ext": "mp4",
"mime": "video/mp4",
"size": 1252241,
"md5": "153e88446ba95cb78997c0924c6477bd",
"path": "files/40a45ea8a5b9683f2bc5940dd0f03fc5.mp4",
"sha256": "981d9d210fee2435d40aad25c9727435708993785d4d7abd11a99afe88f498b6"
},
{
"name": "d77c8f40aaf2ebf198d2ffe4ff9bde63.mp4",
"url": "https://image.lceda.cn/attachments/2023/11/qb0tziZO0kWitZlTOQ37tqFDFr48m4gGLnPPQnHs.mp4",
"original_id": "c36c4817224c4cbc89a8c57f692e34be",
"ext": "mp4",
"mime": "video/mp4",
"size": 964054,
"md5": "3412f63de246108e328f32f424ccdd73",
"path": "files/d77c8f40aaf2ebf198d2ffe4ff9bde63.mp4",
"sha256": "89bd79ebae84dadad9fc6e78e7662c1f0d4aeeb526cb4b64c79450c92772bb88"
},
{
"name": "WeChat_20231124121438.mp4",
"url": "https://image.lceda.cn/attachments/2023/11/ckssTsthpECXfdRpgjCxV9QyzRBvDjzh0ft6X4kI.mp4",
"original_id": "f668d7f08b2b40daa7bb04a58a49e2df",
"ext": "mp4",
"mime": "video/mp4",
"size": 1831997,
"md5": "5d0b710833cde01ced97e311b9ffb002",
"path": "files/WeChat_20231124121438.mp4",
"sha256": "5000ec0973b1f5d72fa1904f25061ab9eae49a05d9e4dbbff239066102bad412"
},
{
"name": "WeChat_20231124121418.mp4",
"url": "https://image.lceda.cn/attachments/2023/11/T4kDKWugOAp5R2FPKQgNf4u5ymTOtlmla7xm5ZcG.mp4",
"original_id": "b16233f0eb624fc4a44fc0280f631f6e",
"ext": "mp4",
"mime": "video/mp4",
"size": 773127,
"md5": "970584d4b75eb818ec144b1b6fbe49a5",
"path": "files/WeChat_20231124121418.mp4",
"sha256": "aecfc2970d8a4a0f5d2fd4484beb8b7e91321b564aa9e5a5bcca8a8dd5dbd41f"
},
{
"name": "WeChat_20231124121403.mp4",
"url": "https://image.lceda.cn/attachments/2023/11/Qio2QOYXM8CBoofNaqbKRAaqQ3RZMgXNPhzuEgvL.mp4",
"original_id": "30129b0c66e14549926aa79f381afb2b",
"ext": "mp4",
"mime": "video/mp4",
"size": 1915277,
"md5": "b26d9c91ab5abac4d16e2b084eca4040",
"path": "files/WeChat_20231124121403.mp4",
"sha256": "39eb70b17270d179c5325ef77fe46ed79b84a9ba98fa9595ad7f8b74697f9c07"
}
],
"raw_fields": {
"path": "armbian-pythoniot/yuzumaix-v831",
"grade": 4,
"origin": "std",
"public": true,
"publish": true,
"skipped_files": []
}
}

View File

@@ -0,0 +1,16 @@
{
"detail_url": "https://oshwhub.com/yanranxiaoxi/Multi-adaptation-Wi-Fi-Geiger-Counter-Double-Tube-Type",
"cover_url": "https://image.lceda.cn/pullimage/Z4KOXBgwtmwMIUpJC8ZSyFWeY6hBg2899oPP5UeZ.jpeg",
"attachments": [
{
"name": "3D打印外壳与电池版改装.zip",
"url": "https://image.lceda.cn/attachments/2023/9/Ps19TA0QecWL9XXjgOxNhHxRj8FvpO7kttXqF8KI.zip",
"original_id": "de773a049b1149ea8f5b885277d839ac"
},
{
"name": "MWGC-Firmware_v0.1.3.20241125a.bin",
"url": "https://image.lceda.cn/oshwhub/project/attachments/f59327bb7a8f4180851468b9dee83944.bin",
"original_id": "df5c50cf692548afb2ee27096178c282"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

View File

@@ -0,0 +1,9 @@
# 小汐 & 阿曈 -> 盖革计数器MWGC-2T
⭐ 中文固件多管型 Wi-Fi 盖革计数器MWGC-2T
---
- Source: https://oshwhub.com/yanranxiaoxi/Multi-adaptation-Wi-Fi-Geiger-Counter-Double-Tube-Type
- Author: 久治明千树汐 (yanranxiaoxi)
- License: CC BY-SA 4.0
- Published: 2024-11-25T01:38:14.000Z

View File

@@ -0,0 +1,63 @@
{
"source": "oshwhub",
"source_url": "https://oshwhub.com/yanranxiaoxi/Multi-adaptation-Wi-Fi-Geiger-Counter-Double-Tube-Type",
"project_id": "b077573dfb764e95b1d27faba49cca65",
"title": "小汐 & 阿曈 -> 盖革计数器MWGC-2T",
"description_short": "⭐ 中文固件多管型 Wi-Fi 盖革计数器MWGC-2T ⭐",
"description_path": "description.md",
"author": {
"username": "yanranxiaoxi",
"display_name": "久治明千树汐",
"user_id": "eac388b086064c2087f67a10b524a911"
},
"license": "CC BY-SA 4.0",
"tags": [],
"created_at": "2023-03-11T16:40:16.000Z",
"updated_at": "2026-01-30T13:13:39.000Z",
"published_at": "2024-11-25T01:38:14.000Z",
"crawled_at": "2026-04-23T11:26:00.127742+00:00",
"metrics": {
"likes": 212,
"stars": 365,
"forks": 189,
"views": 49755,
"watch": 0,
"comments": 168
},
"cover": {
"url": "https://image.lceda.cn/pullimage/Z4KOXBgwtmwMIUpJC8ZSyFWeY6hBg2899oPP5UeZ.jpeg",
"path": "cover.jpeg"
},
"files": [
{
"name": "3D打印外壳与电池版改装.zip",
"url": "https://image.lceda.cn/attachments/2023/9/Ps19TA0QecWL9XXjgOxNhHxRj8FvpO7kttXqF8KI.zip",
"original_id": "de773a049b1149ea8f5b885277d839ac",
"ext": "zip",
"mime": "application/x-zip-compressed",
"size": 3798995,
"md5": "3ec71e545b0f0b70f93b58599c8d1c7e",
"path": "files/3D打印外壳与电池版改装.zip",
"sha256": "e23537c79e44be7dadb89ba82fb3b195ae2436d8200c62659f31a87093f6fd7e"
},
{
"name": "MWGC-Firmware_v0.1.3.20241125a.bin",
"url": "https://image.lceda.cn/oshwhub/project/attachments/f59327bb7a8f4180851468b9dee83944.bin",
"original_id": "df5c50cf692548afb2ee27096178c282",
"ext": "bin",
"mime": "application/octet-stream",
"size": 428496,
"md5": "7bd953b6a41c5ad621b7df5f47c3e6ed",
"path": "files/MWGC-Firmware_v0.1.3.20241125a.bin",
"sha256": "87bf7129731121ebaead85278e9aad8f8b2ea0ff3f5f9b3d46ed29e65f82d577"
}
],
"raw_fields": {
"path": "yanranxiaoxi/Multi-adaptation-Wi-Fi-Geiger-Counter-Double-Tube-Type",
"grade": 4,
"origin": "std",
"public": true,
"publish": true,
"skipped_files": []
}
}

View File

@@ -0,0 +1,16 @@
{
"detail_url": "https://oshwhub.com/diy17102800/tu-teng-zvs",
"cover_url": "https://image.lceda.cn/pullimage/Qf1Gu6y5cpQQQ5YzNoFf4gqZYwNCOzKYlO9eerXB.jpeg",
"attachments": [
{
"name": "测试视频.mp4",
"url": "https://image.lceda.cn/attachments/2023/3/hcSO16Po6ZKhmHnR3M2UJ2ttbc4jNDE0FthmsFE0.mp4",
"original_id": "e0ef95cfceb04edc9076a4e8f5ebd9dd"
},
{
"name": "1133.mp4",
"url": "https://image.lceda.cn/attachments/2024/5/BiyaOevIDxQtW4RbBjuS1FZ3P2cDsGBB1M5mf2aN.mp4",
"original_id": "40cab71898a7457b92f5e6ef7c8a8bd5"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 523 KiB

View File

@@ -0,0 +1,9 @@
# 大功率感应加热2500W 增强型ZVS
测试已成功
---
- Source: https://oshwhub.com/diy17102800/tu-teng-zvs
- Author: 金石之声 (diy17102800)
- License: TAPR Open Hardware License
- Published: 2024-05-20T02:40:14.000Z

View File

@@ -0,0 +1,63 @@
{
"source": "oshwhub",
"source_url": "https://oshwhub.com/diy17102800/tu-teng-zvs",
"project_id": "f974b06d9c01470bb319e7df6d4512c9",
"title": "大功率感应加热2500W 增强型ZVS",
"description_short": "测试已成功",
"description_path": "description.md",
"author": {
"username": "diy17102800",
"display_name": "金石之声",
"user_id": "de940107caa34d989e9485cc41026732"
},
"license": "TAPR Open Hardware License",
"tags": [],
"created_at": "2023-02-14T16:30:50.000Z",
"updated_at": "2025-10-27T07:11:41.000Z",
"published_at": "2024-05-20T02:40:14.000Z",
"crawled_at": "2026-04-23T11:30:55.186691+00:00",
"metrics": {
"likes": 355,
"stars": 708,
"forks": 378,
"views": 61550,
"watch": 0,
"comments": 265
},
"cover": {
"url": "https://image.lceda.cn/pullimage/Qf1Gu6y5cpQQQ5YzNoFf4gqZYwNCOzKYlO9eerXB.jpeg",
"path": "cover.jpeg"
},
"files": [
{
"name": "测试视频.mp4",
"url": "https://image.lceda.cn/attachments/2023/3/hcSO16Po6ZKhmHnR3M2UJ2ttbc4jNDE0FthmsFE0.mp4",
"original_id": "e0ef95cfceb04edc9076a4e8f5ebd9dd",
"ext": "mp4",
"mime": "video/mp4",
"size": 8101940,
"md5": "229f35937d3b13a0a862b7d47654eb0f",
"path": "files/测试视频.mp4",
"sha256": "613b326cb8c3c222c955c259968b4fac5dd31daa5a93e85e53a55b24ef30c320"
},
{
"name": "1133.mp4",
"url": "https://image.lceda.cn/attachments/2024/5/BiyaOevIDxQtW4RbBjuS1FZ3P2cDsGBB1M5mf2aN.mp4",
"original_id": "40cab71898a7457b92f5e6ef7c8a8bd5",
"ext": "mp4",
"mime": "video/mp4",
"size": 1100753,
"md5": "3dc3d5f4c556e3c057eede3cfbcefb83",
"path": "files/1133.mp4",
"sha256": "7a707feb0a82435b59439552f211075dafeab39aa5d490e5195d861f75515126"
}
],
"raw_fields": {
"path": "diy17102800/tu-teng-zvs",
"grade": 4,
"origin": "std",
"public": true,
"publish": true,
"skipped_files": []
}
}

92
docs/sources/oshwhub.md Normal file
View File

@@ -0,0 +1,92 @@
# oshwhub.com 数据源调研
**平台**:立创开源硬件平台(嘉立创 EDA / 深圳创电优选科技有限公司)
**URL**https://oshwhub.com
**调研日期**2026-04-23
## 站点架构
- Next.js App Router SPA详情页 `/detail/<uuid>``/<user>/<slug>` 均 SSRHTML 内含完整元数据 + attachments 数组)
- axios baseURL 为 `https://oshwhub.com`(见 `/_next/static/chunks/8661-*.js`
- 首页 / explore 列表数据靠客户端 fetch 渲染(首屏 HTML 里没有卡片 DOM
## robots.txt
```
User-agent: *
Disallow: /posts
Sitemap: https://oshwhub.com/sitemap.xml
```
详情页、explore、API 均允许抓取。
## 可用 API无需鉴权
### 项目列表
`GET https://oshwhub.com/api/project?page=N&pageSize=M&sort=hot`
- `sort``hot`(默认,按热度)/`like`/`new`
- `pageSize`:最大 50 可用,试过 100 返回空
- 返回:`{success, code, result:{page, pageSize, total, totalPage, lists:[...]}}`
- total ≈ 124932026-04 快照)
每条 list item 字段:
- `uuid`, `name`, `introduction`, `path`= `<username>/<slug>`
- `owner``{uuid, username, nickname, avatar, team}`
- `count``{fork, star, like, views, watch}`
- `grade`1-44 是精品徽章)
- `thumb`(封面 URL`image.lceda.cn``//image.lceda.cn` 前缀)
- `created_at`, `updated_at`, `oshwhub_publish_at`
- `tags`, `public`, `publish`, `comments_count`
### 项目详情HTML 解析)
`GET https://oshwhub.com/<path>``/detail/<uuid>`
HTML 内嵌 escaped JSON关键字段
- `\"license\":\"GPL 3.0\"` 等(许可证)
- `\"creator\":{\"uuid\":\"...\"}`
- `\"attachments\":[{ name, src, mime, ext, size, md5, download_count, uuid }, ...]`
- `<title>` 含项目名;`<meta name="description">` 含 introduction
### 文件下载
- **附件** (`attachments[].src`)`https://image.lceda.cn{src}`
- 例:`/attachments/2020/7/mRn5hQZRhmx5r4usGxFmy8BXsCIHw5QoAT5HaLGC.pdf`
- 已验证 HTTP 200无鉴权
- 覆盖 PDF / ZIP / MP4 等
- **工程源文件** (`fs-web-stream.jlc.com/fs-web-stream/file-operation/download/<snowflake-id>`)
- HTML 里出现,但能否直接下载未测试
- 优先级P1v0.1 先不抓
### 未找到 / 留作后续
- EasyEDA 工程源 JSONschematic/PCB 的真正源):推测在 `u.lceda.cn` 下,需登录
- 项目详情 JSON API`/api/project/<uuid>` 返回 `{"code":104001,"success":false}`(试过 GET/POST/路径形式均失败,疑似此端点需 session
## 已知字段与 schema 映射
| 本项目 schema 字段 | oshwhub 来源 |
|-----|-----|
| `source` | 常量 `"oshwhub"` |
| `source_url` | `https://oshwhub.com/<path>` |
| `project_id` | `uuid` |
| `title` | `name` |
| `description` | HTML `<meta description>` + 长描述HTML 正文截取) |
| `author` | `owner.nickname` / `owner.username` |
| `license` | HTML 嵌入 JSON 的 `license` 字段 |
| `created_at` / `updated_at` | 列表 API 同名字段 |
| `crawled_at` | 运行时写入 |
| `tags` | 列表 API `tags` |
| `files[]` | `attachments[]` 映射 |
| `metrics` | `count.{like,star,fork,views}` + `grade` |
## 速率与礼貌
- 列表 API空载实测 < 300ms无限流
- 详情页 HTML~500KB/个,建议 QPS ≤ 0.5
- 附件CDN `image.lceda.cn`,无需限流但建议 1s 间隔
## 陷阱 / 待确认
1. `fs-web-stream.jlc.com` 下载是否需 referer / cookie未测
2. 长描述(含图片、表格)的 HTML 提取保真度,可能需要保留原 HTML
3. `license` 字段取值集合未枚举完(已见:`GPL 3.0` / `CC-BY-SA`...需全量跑后统计)
4. `grade=4` 大概率是精品徽章但文档未说明具体判据

57
log.md
View File

@@ -4,6 +4,63 @@
---
## 2026-04-23 19:30 Phase 1 MVP10 个高质量 oshwhub 项目入库
**Claude 会话**:承接仓库初始化
### API 调研结论
- 列表 API`GET 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 JSON`license` + `attachments[]`(每个带 name / src / size / md5 / ext / mime / download_count
- 附件 CDN`https://image.lceda.cn{src}` — 已验证无鉴权直接下载
- EasyEDA 工程源 JSON`u.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.5`SLEEP_BETWEEN = 2.0`UA 显式声明 `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}.py`、`schemas/project.schema.json`、`docs/sources/oshwhub.md`、`pyproject.toml`
- 修改:`.gitattributes`(缩窄到 `data/raw/**/files/**`)、`.gitignore`(移除 `data/raw/*` 排除)
### 下一步建议给 Charles
1. 验收 10 个项目元数据质量(随机抽 2-3 条对照原站)
2. 决定 Phase 1.4 放量目标50500全量 12493
3. 未解决:`fs-web-stream.jlc.com` 下载(工程源?)、`u.lceda.cn` 登录态抓工程 JSON
4. Phase 2 准备GitHub KiCad repo 调研
---
## 2026-04-23 18:50 仓库初始化 & 数据源调研
**Claude 会话**:初始化

Some files were not shown because too many files have changed in this diff Show More