AI 工具

用本地 Python 账本追踪 OpenAI Academy 学习进度

用本地 ledger 记录每次评估分数;默认阈值 80 分(与常见 Academy 徽章说明一致,仍以官网为准)。可查询 pathway 是否齐套。

BINBHO · 图文教程

用本地 ledger 记录每次评估分数;默认阈值 80 分(与常见 Academy 徽章说明一致,仍以官网为准)。可查询 pathway 是否齐套。

先看清成品

  • 79 分未过、80 分通过;缺课 status 显示 missing。
  • 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 通过。

做完之后你会得到什么?

成果 说明
badge_tracker.py 进度账本
test_103c.py 测试

需要准备哪些环境?

项目 说明
Python 3.10+

关键事实

事实 来源
徽章/结业证明≠职业资格认证 Academy 常见说明
通过线以课程/Help 为准;本仓库默认 80 教程约定
ledger 仅存本地,不与 OpenAI 服务器同步 重要

文件结构

103-openai-academy-C-src/
├── badge_tracker.py
└── test_103c.py

第 1 步:账本脚本

#!/usr/bin/env python3
"""Track OpenAI Academy course completion toward pathway badges (local JSON ledger)."""
from __future__ import annotations

import argparse
import json
from pathlib import Path

PASS = 80  # Help Center: badge when assessment score >= 80%


def load(path: Path) -> dict:
    if path.exists():
        return json.loads(path.read_text(encoding="utf-8"))
    return {"attempts": [], "note": "Badges are not professional certifications."}


def record(ledger: dict, course_id: str, score: int) -> dict:
    if not (0 <= score <= 100):
        raise ValueError("score 0..100")
    passed = score >= PASS
    ledger.setdefault("attempts", []).append({"course_id": course_id, "score": score, "passed": passed})
    return {"course_id": course_id, "score": score, "passed": passed, "threshold": PASS}


def summary(ledger: dict, required: list[str]) -> dict:
    best = {}
    for a in ledger.get("attempts") or []:
        cid = a["course_id"]
        best[cid] = max(best.get(cid, -1), a["score"])
    done = [c for c in required if best.get(c, -1) >= PASS]
    missing = [c for c in required if c not in done]
    return {"passed": done, "missing": missing, "ready_for_pathway_certificate": not missing and bool(required)}


def main(argv=None) -> int:
    ap = argparse.ArgumentParser(description=__doc__)
    ap.add_argument("--ledger", default="academy_ledger.json")
    sub = ap.add_subparsers(dest="cmd", required=True)
    r = sub.add_parser("record")
    r.add_argument("course_id")
    r.add_argument("score", type=int)
    s = sub.add_parser("status")
    s.add_argument("--required", nargs="+", default=["ai-foundations", "applied-ai-foundations"])
    args = ap.parse_args(argv)
    path = Path(args.ledger)
    ledger = load(path)
    if args.cmd == "record":
        info = record(ledger, args.course_id, args.score)
        path.write_text(json.dumps(ledger, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
        print(json.dumps(info, ensure_ascii=False))
        return 0
    print(json.dumps(summary(ledger, args.required), ensure_ascii=False, indent=2))
    return 0


if __name__ == "__main__":
    raise SystemExit(main())

第 2 步:测试

from pathlib import Path
import json, subprocess, sys
from badge_tracker import record, summary, PASS
HERE = Path(__file__).resolve().parent

def test_threshold(tmp_path):
    led = {"attempts": []}
    assert record(led, "ai-foundations", 79)["passed"] is False
    assert record(led, "ai-foundations", 80)["passed"] is True
    st = summary(led, ["ai-foundations", "applied-ai-foundations"])
    assert st["missing"] == ["applied-ai-foundations"]

def test_cli(tmp_path):
    led = tmp_path / "l.json"
    subprocess.run([sys.executable, str(HERE/"badge_tracker.py"), "--ledger", str(led), "record", "ai-foundations", "90"], check=True)
    r = subprocess.run([sys.executable, str(HERE/"badge_tracker.py"), "--ledger", str(led), "status", "--required", "ai-foundations"], capture_output=True, text=True, check=True)
    assert "ai-foundations" in r.stdout

第 3 步:运行

$ badge_tracker record/status
{"course_id": "ai-foundations", "score": 90, "passed": true, "threshold": 80}
{"course_id": "applied-ai-foundations", "score": 75, "passed": false, "threshold": 80}
{
  "passed": [
    "ai-foundations"
  ],
  "missing": [
    "applied-ai-foundations"
  ],
  "ready_for_pathway_certificate": false
}

$ pytest -q
..                                                                       [100%]
2 passed in 0.06s

怎么检查结果?

  • record 打印 passed true/false。
  • status 列出 missing 课程。

调试示例

以为网页徽章会写回这个 JSON。 不会。这是你自己的学习账本;官网进度以登录后的 Academy 为准。

常见问题

现象 原因 处理
改阈值 改源码 PASS 或叉开分支
多 pathway 多次 status 换 --required
作弊刷分 不要 违反政策且无意义

模板规则

  • 诚实记录分数。
  • 徽章不作就业承诺。
  • 以官网进度为准。

项目资源

用途 地址
OpenAI Academy https://academy.openai.com/
Academy Home https://academy.openai.com/home
OpenAI Status https://status.openai.com/

进度可见,才知道下一门该补哪课。