AI 工具

用 Python 为 OpenAI Academy 课程生成每周学习计划

把 Help Center / 官网可见的课程做成本地 coursescatalog.json,再按每周分钟数生成 Markdown 学习路径。适合自学排期,不是官方推荐算法。

BINBHO · 图文教程

把 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/

排期清楚,学起来才不变成收藏夹灰烬。