把 Help Center / 官网可见的课程做成本地
courses_catalog.json,再按每周分钟数生成 Markdown 学习路径。适合自学排期,不是官方推荐算法。
先看清成品
- 按「Build with AI」过滤并拆成多周计划。
- 写出 plan.md / plan.json。
- 2 项 pytest 通过。
合规提醒:OpenAI Academy 课程与徽章侧重产品使用学习,不是职业资格认证;评估通过线以 Help Center / 课程页为准(常见表述为评分 ≥80%)。学习账号遵守 OpenAI 使用政策;勿把课程作业变成未授权自动化刷分。课程目录会更新,本教程附带的 JSON 是离线快照,上线前请回官网核对。
运行说明:Academy 无公开「课程列表 REST API」。三篇均本地:A 用 curated catalog 生成周计划;B 笔记转闪卡;C 本地 ledger 追踪及格阈值。未登录 academy.openai.com。2026-10-23(Asia/Shanghai)pytest 通过。
做完之后你会得到什么?
| 成果 | 说明 |
|---|---|
study_path.py |
路径规划 |
courses_catalog.json |
课程快照 |
test_103a.py |
测试 |
需要准备哪些环境?
| 项目 | 说明 |
|---|---|
| Python | 3.10+ |
关键事实
| 事实 | 来源 |
|---|---|
| Academy 入口 academy.openai.com,通常需 ChatGPT 账号 | 官网 |
| 无稳定的公开 courses API;本目录为教程快照 | 重要 |
| 分钟数为估计,以课程页为准 | 快照说明 |
文件结构
103-openai-academy-A-src/
├── study_path.py
├── courses_catalog.json
└── test_103a.py
第 1 步:规划脚本
#!/usr/bin/env python3
"""Build a weekly OpenAI Academy study path from a local course catalog snapshot."""
from __future__ import annotations
import argparse
import json
from pathlib import Path
def plan(courses: list[dict], *, category: str | None, max_minutes_week: int, max_courses: int) -> dict:
selected = courses
if category:
selected = [c for c in courses if category.lower() in (c.get("category") or "").lower()]
selected = selected[:max_courses]
weeks = []
week_no, cur, used = 1, [], 0
for c in selected:
m = int(c.get("minutes") or 60)
if cur and used + m > max_minutes_week:
weeks.append({"week": week_no, "minutes": used, "courses": cur})
week_no, cur, used = week_no + 1, [], 0
cur.append(c)
used += m
if cur:
weeks.append({"week": week_no, "minutes": used, "courses": cur})
return {"filter_category": category, "weeks": weeks, "total_courses": len(selected)}
def to_md(plan_obj: dict) -> str:
lines = ["# OpenAI Academy 学习路径", "", f"- 过滤类别:{plan_obj.get('filter_category') or '全部'}", ""]
for w in plan_obj["weeks"]:
lines.append(f"## 第 {w['week']} 周(约 {w['minutes']} 分钟)")
for c in w["courses"]:
lines.append(f"- {c['title']} — {c['minutes']} 分钟({c.get('focus')})")
lines.append("")
lines += [
"## 注意",
"- 徽章/结业证明不是职业认证;通过评估通常需 ≥80%(以 Help Center 为准)。",
"- 报名与进度在 academy.openai.com,需 ChatGPT 账号。",
"",
]
return "\n".join(lines)
def main(argv=None) -> int:
ap = argparse.ArgumentParser(description=__doc__)
ap.add_argument("catalog_json")
ap.add_argument("--category", default="")
ap.add_argument("--minutes-per-week", type=int, default=120)
ap.add_argument("--max-courses", type=int, default=8)
ap.add_argument("-o", "--out", default="academy_plan")
args = ap.parse_args(argv)
cat = json.loads(Path(args.catalog_json).read_text(encoding="utf-8"))
obj = plan(cat["courses"], category=args.category or None, max_minutes_week=args.minutes_per_week, max_courses=args.max_courses)
out = Path(args.out)
out.with_suffix(".json").write_text(json.dumps(obj, ensure_ascii=False, indent=2), encoding="utf-8")
out.with_suffix(".md").write_text(to_md(obj), encoding="utf-8")
print(f"weeks={len(obj['weeks'])} courses={obj['total_courses']}")
return 0
if __name__ == "__main__":
raise SystemExit(main())
第 2 步:测试
from pathlib import Path
import json, subprocess, sys
from study_path import plan
HERE = Path(__file__).resolve().parent
CAT = HERE / "courses_catalog.json"
def test_plan():
courses = json.loads(CAT.read_text())["courses"]
p = plan(courses, category="Build with AI", max_minutes_week=100, max_courses=5)
assert p["weeks"] and p["total_courses"] <= 5
def test_cli(tmp_path):
out = tmp_path / "p"
r = subprocess.run([sys.executable, str(HERE/"study_path.py"), str(CAT), "--category", "Apply AI", "-o", str(out)], capture_output=True, text=True, check=True)
assert "weeks=" in r.stdout
assert "学习路径" in out.with_suffix(".md").read_text()
第 3 步:运行
$ python study_path.py courses_catalog.json --category "Build with AI" -o /tmp/academy_plan
weeks=4 courses=6
# OpenAI Academy 学习路径
- 过滤类别:Build with AI
## 第 1 周(约 100 分钟)
- Scope AI Solutions — 30 分钟(OpenAI API)
- Evaluate AI Applications — 70 分钟(OpenAI API)
## 第 2 周(约 110 分钟)
- Design and Build Agentic Systems — 110 分钟(OpenAI API)
## 第 3 周(约 100 分钟)
- Build with Retrieval-Augmented Generation — 100 分钟(OpenAI API)
## 第 4 周(约 110 分钟)
- Optimize AI Application Performance — 30 分钟(OpenAI API)
- Get Started with Codex — 80 分钟(Codex)
## 注意
- 徽章/结业证明不是职业认证;通过评估通常需 ≥80%(以 Help Center 为准)。
$ pytest -q
.. [100%]
2 passed in 0.04s
怎么检查结果?
- 终端打印 weeks=… courses=…
- Markdown 含「学习路径」与注意段。
调试示例
官网课程改名了。 快照会过期。更新 JSON 的 id/title 后重跑即可;不要假设旧 id 永远有效。
常见问题
| 现象 | 原因 | 处理 |
|---|---|---|
| 要官方证书 | 看徽章说明 | 非职业认证 |
| 每周时间不同 | 改 --minutes-per-week | 重新生成 |
| 想自动报名 | 请用手点官网 | 本脚本不登录 |
模板规则
- 快照需人工与官网核对。
- 不刷评估。
- 遵守使用政策。
项目资源
| 用途 | 地址 |
|---|---|
| OpenAI Academy | https://academy.openai.com/ |
| Academy Home | https://academy.openai.com/home |
| OpenAI Status | https://status.openai.com/ |
排期清楚,学起来才不变成收藏夹灰烬。