| name | sjtu |
| version | 2.1.0 |
| license | MIT |
| description | 上海交通大学全能校园助手 —— 一组平台无关的命令行脚本,任何能执行 shell 的 AI agent 都可接入
(Claude Code / Codex / Cursor / Gemini CLI / LangChain / 自建 agent 皆可),不依赖任何特定网关、
浏览器代理或私有运行时。覆盖 Canvas 作业/成绩、选课社区课评、传承交大资料、交大邮箱、校园生活、
学术工具、水源社区等 20+ 项功能。
触发场景:
(1) 查看/追踪作业 DDL、提交状态、成绩 (Canvas)
(2) 同步 DDL 到 Apple 日历 / 导出 .ics
(3) 查询课程评价、对比老师评分 (选课社区 jCourse)
(4) 搜往年试卷 / 课程资料 (传承交大)
(5) 查交大邮箱未读 / 搜索 / 发信
(6) 食堂推荐、图书馆、空教室、校园巴士、教学周、校历
(7) 教务通知、交大新闻、正版软件、生存手册、在线工具
(8) 生成交大 PPT、手写 PDF、校园官方图库
(9) 搜索 / 浏览水源社区帖子
触发词: Canvas, 课程, 作业, DDL, 截止, 成绩, 课件, PPT, 总结, 复习, 提交作业, 批改,
食堂, 吃什么, 图书馆, 教室, 空教室, 巴士, 校车, 教学周, 第几周, 校历, 放假, 邮箱, 邮件,
选课, 评价, 老师怎么样, 软件, MATLAB, Office, 新闻, 教务, 通知, 传承, 往年, 试卷,
生存手册, 保研, 转专业, GPA, PPT模板, 手写, 校园地图, 视觉交大, 水源, 水源社区, 论坛, 帖子
|
上海交通大学全能校园助手 (sjtu)
平台无关。 本 skill 是 scripts/ 下的一组独立 CLI 脚本(Python3 / Node.js)。任何能运行
shell 命令、读文件的 agent 都能调用——不依赖任何特定网关、浏览器代理或私有运行时。
凭证集中在仓库根 config.json(已被 .gitignore 忽略,不会进版本库)。
一、给 Agent 的调用约定(必读)
- 执行前先
cd ~/openclaw-sjtu。脚本按仓库根定位 config.json / templates/ / fonts/,
不在此目录会找不到配置或资源。
- 调用形式:Python 脚本用
python3 scripts/<名>.py <子命令> [参数];
.mjs 脚本用 node scripts/<名>.mjs <子命令>(水源用 node,不是 python3)。
不带参数一般打印用法。
- 凭证:统一放仓库根
config.json(从 config.example.json 复制)。按需填——只填要用的
功能对应字段即可。部分脚本也支持等价环境变量(见 §2)。
- 写操作必须先确认:会改服务器/外部状态的命令(发邮件、传承下载消耗积分等),执行前必须向
用户复述对象并取得确认。本文档用 ⚠️ 标出。注:Canvas 提交作业当前未暴露为 CLI 子命令
(仅库函数
submit_assignment),不会被误触发。
- 缺凭证 = 明确报错:脚本不会假装成功。缺 key/token 会打印「缺什么、怎么配」,多数带
selftest。
- 状态语义:✅实时=真实抓线上数据;📌静态=内置离线数据(稳定但非实时,跨学期可能过期);
🔑需登录=缺凭证会明确报错;⚙️本地=纯本地生成;⚠️注意=有依赖缺失或接口变更,见说明。
- 环境提示:macOS 无
timeout 命令,文档示例都不用 timeout,脚本自带超时,直接运行即可。
二、配置 (config.json)
从 config.example.json 复制为 config.json,按需填写:
| 配置字段 | 用于功能 | 怎么获取 |
|---|
canvas_token | Canvas 全套(DDL/课程/成绩/课件/作业/日历) | oc.sjtu.edu.cn → 头像 → 设置 → 「+ 新建访问许可证」 |
canvas_profiles + canvas_default_profile | Canvas 学生/教师双身份 | 各生成一个 token,分别填到 canvas_profiles.student.token / .teacher.token,默认身份填 canvas_default_profile |
base_url | Canvas 站点 | 默认 https://oc.sjtu.edu.cn,一般不用改 |
save_dir | 课件下载目录 | 默认 ~/Downloads/Canvas课件 |
jcourse_api_key | 选课社区课评 | course.sjtu.plus → 个人中心 → API 密钥 |
dyweb_token | 传承交大资料 | jAccount 登录后抓 token(见 §3.5) |
sjtu_username / sjtu_password | 交大邮箱 IMAP/SMTP | 邮箱账号 + 密码(或授权码) |
shuiyuan_user_api_key + shuiyuan_user_api_client_id | 水源社区 | 脚本内 auth init 链接授权(见 §3.7) |
等价环境变量(优先级高于 config.json):JCOURSE_API_KEY、DYWEB_TOKEN、OPENCLAW_SJTU_CANVAS_PROFILE。
🔒 config.json 已在 .gitignore,含真实凭证,切勿 git add。只提交 config.example.json(占位符)。
三、功能 × 入口 × 认证 × 状态 总表
| 功能 | 入口脚本 | 认证 | 状态 |
|---|
| Canvas 课程 / DDL / 成绩 / 身份 | canvas_api.py | canvas_token | ✅ 实时 |
| 自动作业扫描 / 作答上下文 / 新作业监测 | auto_homework.py | canvas_token | ✅ 实时 |
| DDL+课程 → .ics 日历文件 | sjtu_timetable_ics.py | canvas_token | ✅ 实时 |
| DDL → macOS 日历同步 | calendar_sync.py | canvas_token | ⚙️ 本地(仅 macOS) |
| 课程评价 / 老师对比 (jCourse) | sjtu_course_review.py | jcourse_api_key | ✅ 实时 |
| 传承交大 往年资料 / 试卷 | sjtu_legacy.py | dyweb_token | 🔑 需登录 |
| 交大邮箱 未读 / 搜索 / 发信 | sjtu_mail.py | 邮箱账密 | 🔑 需登录 |
| 教务通知 / 交大新闻 | sjtu_news.py | 无 | ✅ 实时 |
| 正版软件查询 | sjtu_software.py | 无 | ✅ 实时 |
| 生存手册 | sjtu_survive.py | 无 | ✅ 实时 |
| 视觉交大 官方图库 | sjtu_visual.py | 无 | ✅ 实时 |
| 水源社区 (只读) | shuiyuan_discourse.mjs | shuiyuan_user_api_key | ✅ 实时 |
| 课件文本提取(配合 Canvas) | file_extractor.py | 无 | ✅ 本地 |
| 教学周 / 校历 / 校园巴士 | sjtu_info.py | 无 | 📌 静态 |
| 食堂推荐 / 菜单 | sjtu_canteen.py | 无 | 📌 静态 |
| 图书馆 信息 / 座位说明 | sjtu_library.py | 无 | 📌 静态 |
| 空教室 / 教学楼清单 | sjtu_classroom.py | 无 | 📌 静态 |
| 在线工具目录 | sjtu_tools.py | 无 | 📌 静态 |
| 交大 PPT 生成 | generate_ppt.py | 无 | ⚙️ 本地(需 python-pptx) |
| 手写 PDF 生成 | handwrite_pdf.py | 无 | ⚠️ 需装 handright |
| 镜像换源指引 | sjtu_mirror.py | 无 | ⚙️ 本地(list 接口已变) |
四、功能详解
每条都标注了真实子命令(已逐行核对源码 + 实跑)。脚本帮助里写 python3 sjtu_xxx.py,从仓库根
调用时实际路径是 scripts/sjtu_xxx.py。
4.1 Canvas 课程 / DDL / 成绩 ✅ — canvas_api.py
需 canvas_token。CLI 仅 5 个只读子命令,全局 --profile <name> 可放命令前后任意位置切换
学生/教师身份(缺省用 canvas_default_profile)。无参数时默认执行 courses。
python3 scripts/canvas_api.py me
python3 scripts/canvas_api.py courses
python3 scripts/canvas_api.py ddls
python3 scripts/canvas_api.py ddls-all
python3 scripts/canvas_api.py grades
python3 scripts/canvas_api.py --profile teacher courses
- 课程 ID 从
courses 输出取,用于其它需要 course_id 的脚本。
- DDL 走 Canvas Planner API 一次性拉取(含 submitted/graded/late/missing/feedback);时区固定 UTC+8。
- ⚠️ 课件下载、作业提交、讨论区、日历事件等是库函数,未做成 CLI 子命令;提交作业需另调
canvas_api.submit_assignment(...) 并确认,普通调用不会触发写操作。
ddls-all 的学期起始日在源码里硬编码(2026-02-17),跨学期需改源码。
- 依赖
requests;需能访问 oc.sjtu.edu.cn(校园网或可达网络)。
4.2 自动作业流水线 ✅ — auto_homework.py
需 canvas_token。5 个子命令(无参默认 scan):
python3 scripts/auto_homework.py scan
python3 scripts/auto_homework.py urgent 24
python3 scripts/auto_homework.py context <course_id> <assignment_id>
python3 scripts/auto_homework.py full <course_id> <assignment_id>
python3 scripts/auto_homework.py watch
context/full 会向 ~/Downloads/Canvas作业上下文/ 与 ~/Downloads/Canvas课件/ 下载文件;
生成的 ai_prompt.md 可喂 LLM 辅助作答。本身不提交作业。
context/full 提取课件正文需 python-pptx / pdfplumber / python-docx(缺失则该文件标注「需安装」,不崩)。
4.3 DDL → 日历 ✅ / ⚙️ — sjtu_timetable_ics.py + calendar_sync.py
需 canvas_token。sjtu_timetable_ics.py 3 个子命令,可选第二参为输出路径:
python3 scripts/sjtu_timetable_ics.py ddls [输出.ics]
python3 scripts/sjtu_timetable_ics.py calendar [输出.ics]
python3 scripts/sjtu_timetable_ics.py all [输出.ics]
python3 scripts/calendar_sync.py
- ICS 双击即可导入 Apple/Google 日历。
calendar / all 的学期区间硬编码 2026-02-17→2026-07-15。
calendar_sync.py 无参数、无 flag,运行即写本机日历(按事件标题去重);首次需在 macOS
「系统设置→隐私与安全性→自动化」授予终端/Python 控制「日历」权限。
4.4 课程评价 / 老师对比(选课社区 jCourse)✅ — sjtu_course_review.py
走 jCourse 开放 API(Bearer key),无需 cookie / 浏览器。需 jcourse_api_key。
python3 scripts/sjtu_course_review.py search 传热学
python3 scripts/sjtu_course_review.py detail 6807
python3 scripts/sjtu_course_review.py reviews 6807 5
python3 scripts/sjtu_course_review.py compare 传热学
python3 scripts/sjtu_course_review.py selftest
搜索结果与详情里的 #数字 是课程 ID,传给 detail / reviews。
4.5 传承交大 往年资料 / 试卷 🔑 — sjtu_legacy.py
传承新站(beta.share.dyweb.sjtu.cn)强制 jAccount 登录,无免登录接口。先拿 token:
python3 scripts/save_sjtu_cookies.py legacy
拿到 token 后:
python3 scripts/sjtu_legacy.py search 传热学
python3 scripts/sjtu_legacy.py course <课程ID>
python3 scripts/sjtu_legacy.py materials <课程ID>
python3 scripts/sjtu_legacy.py selftest
⚠️ 下载资料会消耗站内积分,本工具只列清单不自动下载。
4.6 交大邮箱 🔑 — sjtu_mail.py
需 sjtu_username / sjtu_password(IMAP 993 / SMTP 465,走 mail.sjtu.edu.cn,需校园网/VPN)。
凭证也可用 -u/-p 临时传(优先于 config.json)。
python3 scripts/sjtu_mail.py unread --limit 10
python3 scripts/sjtu_mail.py search --keyword 作业
python3 scripts/sjtu_mail.py summary
python3 scripts/sjtu_mail.py send --to x@sjtu.edu.cn --subject "标题" --body "正文" [--html]
⚠️ send 会真发邮件(From=登录账号),执行前必须向用户确认收件人/主题/正文。
4.7 水源社区(只读)✅ — shuiyuan_discourse.mjs(用 node)
需 shuiyuan_user_api_key(首次走链接授权)。Node.js ≥18,严格只读(代码层只允许 GET + 路径白名单,
不能发帖/回复/点赞)。访问 shuiyuan.sjtu.edu.cn 通常需校园网/VPN。
node scripts/shuiyuan_discourse.mjs auth init
node scripts/shuiyuan_discourse.mjs auth finish --payload "<payload>"
node scripts/shuiyuan_discourse.mjs auth status
node scripts/shuiyuan_discourse.mjs search "选课" --max-results 10
node scripts/shuiyuan_discourse.mjs latest --max-results 30
node scripts/shuiyuan_discourse.mjs categories
node scripts/shuiyuan_discourse.mjs topic <topic_id> --post-limit 5
node scripts/shuiyuan_discourse.mjs post <post_id>
node scripts/shuiyuan_discourse.mjs filter "category:xx tags:yy"
node scripts/shuiyuan_discourse.mjs image <图片URL> --output meta
node scripts/shuiyuan_discourse.mjs vision-check
- 凭证存
~/.openclaw/skills-data/shuiyuan-discourse/auth.json(0600)。
- 限流(429)会被规整为
rate_limited:true 并给重试间隔,等几十秒重试同一命令即可。
- 全局选项:
--site / --runtime auto|node|curl / --timeout / --auth-file 等。
五、信息查询与校园生活
教务通知 / 交大新闻 ✅(实时)— sjtu_news.py
python3 scripts/sjtu_news.py jwc 10
python3 scripts/sjtu_news.py news 10
python3 scripts/sjtu_news.py news 5 --column mtjj
python3 scripts/sjtu_news.py news 5 --json
python3 scripts/sjtu_news.py all 10
正版软件 ✅(实时)— sjtu_software.py
python3 scripts/sjtu_software.py list
python3 scripts/sjtu_software.py list --category 办公
python3 scripts/sjtu_software.py list --json
python3 scripts/sjtu_software.py search MATLAB
抓 software.sjtu.edu.cn;断网/解析失败会静默回退到内置 13 条数据(可能过时)。
生存手册 ✅(实时,GitBook)— sjtu_survive.py
python3 scripts/sjtu_survive.py toc
python3 scripts/sjtu_survive.py toc gpa
python3 scripts/sjtu_survive.py search bao-yan
python3 scripts/sjtu_survive.py read bao-yan
GitBook 章节 slug 为拼音,搜索用拼音片段(gpa / bao-yan / zhuan-zhuan-ye)比中文更准。
视觉交大 官方图库 ✅(实时)— sjtu_visual.py
python3 scripts/sjtu_visual.py themes
python3 scripts/sjtu_visual.py images 42 6
python3 scripts/sjtu_visual.py search 图书馆
python3 scripts/sjtu_visual.py download <图片直链> [输出路径]
课件文本提取 ✅(本地)— file_extractor.py
python3 scripts/file_extractor.py <文件>
python3 scripts/file_extractor.py <目录>
python3 scripts/file_extractor.py <目录> <输出目录>
位置参数 CLI,无子命令。PPTX/PDF 提取需 pip install python-pptx pdfplumber。配合 Canvas 课件做 AI 总结。
教学周 / 校历 / 巴士 / 食堂 / 图书馆 / 空教室 / 在线工具 📌(静态)
python3 scripts/sjtu_info.py week
python3 scripts/sjtu_info.py calendar
python3 scripts/sjtu_info.py bus
python3 scripts/sjtu_canteen.py list
python3 scripts/sjtu_canteen.py menu 二餐
python3 scripts/sjtu_canteen.py recommend
python3 scripts/sjtu_library.py info
python3 scripts/sjtu_library.py seats
python3 scripts/sjtu_classroom.py empty
python3 scripts/sjtu_classroom.py empty --building 东上院
python3 scripts/sjtu_classroom.py info
python3 scripts/sjtu_tools.py list
python3 scripts/sjtu_tools.py latex
📌 这几项为内置离线数据(学校无公开实时 API),每学期手工维护,跨学期可能过期。座位实时余量 /
真实空闲教室需 jAccount 登录教务系统,当前未实现。sjtu_tools 的详情命令会对 URL 做可达性探测
(校外多显示「无法连接」属正常)。
六、生成工具 ⚙️
交大 PPT — generate_ppt.py(需 pip install python-pptx)
python3 scripts/generate_ppt.py --list-templates
python3 scripts/generate_ppt.py --title "标题" --markdown notes.md \
--template "百廿红" --output out.pptx
python3 scripts/generate_ppt.py --title "标题" --no-polish
- 单命令多 flag(无子命令)。
--markdown 可传文件路径或内联文本;##→内容页、#→章节过渡页。
--template 传模板名子串即可(如「百廿红」匹配 1.百廿红-李一.pptx);缺省用交大通用模板。
- ⚠️ 未装
python-pptx 时脚本在导入阶段就退出(连 --list-templates 也跑不了),先装依赖。
手写 PDF — handwrite_pdf.py ⚠️(需 pip install handright)
python3 scripts/handwrite_pdf.py input.txt output.pdf --style casual
python3 scripts/handwrite_pdf.py --text "要写的内容" out.pdf --ruled
⚠️ 当前 handright 依赖未安装,运行会 ModuleNotFoundError;先 pip install handright
(Pillow 已装)。字体已就绪(仓库 fonts/ 及 workspace 下均有手写体)。
镜像换源指引 — sjtu_mirror.py
python3 scripts/sjtu_mirror.py pip
python3 scripts/sjtu_mirror.py conda
python3 scripts/sjtu_mirror.py brew
python3 scripts/sjtu_mirror.py docker
python3 scripts/sjtu_mirror.py npm
python3 scripts/sjtu_mirror.py list
pip/conda/brew/docker/npm 只打印换源指引文本,不修改任何配置文件,需用户自己执行。
⚠️ 仅 list 联网,其后端 API 已变更,结果可能不准。
七、子 Skill(独立模块,各有 SKILL.md)
主 /sjtu 覆盖日常功能;下列是独立成 skill 的进阶模块,多需 jAccount 登录或较重,按需委派:
| Skill | 用途 | 入口 |
|---|
| sjtu-deadlines | 跨平台聚合 DDL(Canvas+phycai物理实验+icourse163 MOOC+lcme实验预约) | python3 -m scripts.unified_ddl |
| sjtu-oneshot | 单次 jAccount 登录刷新所有 cookie + 拉全平台信息 | python3 scripts/sjtu_oneshot.py |
| sjtu-crawler | 全站门户爬虫(50+ 站点通知)+ LLM 蒸馏成结构化 JSON | python3 scripts/sjtu_crawler.py crawl |
| shuiyuan-rag-service | 水源 RAG 常驻 FastAPI 服务(127.0.0.1:9111,BGE 预加载) | uvicorn shuiyuan_rag_http:app |
| sjtu-cookie-saver | 手动登录抓第三方站 cookie/token(主要给传承交大) | python3 scripts/save_sjtu_cookies.py |
| sjtu-date | SJTU Date 匹配助手(填问卷/查匹配/破冰) | node scripts/sjtudate.mjs |
| lobster-square | clawsjtu.com 龙虾广场 API(独立项目,搭车存放) | bash scripts/call.sh |
委派对照(用户提到这些词时优先用对应子 skill):
- “我有什么 DDL / 作业 / 实验”(跨平台聚合)→ sjtu-deadlines
- “登录所有 SJTU 平台 / 刷新所有 cookies” → sjtu-oneshot
- “爬交大网站 / 抓教务通知 / 蒸馏公告” → sjtu-crawler
- “刷新传承 / 第三方站 cookie / token” → sjtu-cookie-saver
- “填 SJTU Date 问卷 / 查匹配 / 脱单” → sjtu-date
其他辅助脚本(不单独成 skill):
grading_assistant.py — 助教批改助手(批量拉学生提交 + 生成评分上下文,需 Canvas 教师端 token)
sjtu_distill.py — 用 Claude 把 crawler 爬下的文档蒸馏成结构化摘要
共享工具层:scripts/auth/(jAccount SSO + cookie store)、scripts/platforms/(各平台适配器)、
scripts/scheduler/(macOS launchd 服务)。
八、依赖安装
pip3 install requests beautifulsoup4 python-pptx pdfplumber python-docx handright Pillow reportlab
pip3 install -r scripts/requirements-platforms.txt
playwright install chromium
pip3 install fastapi uvicorn
- 水源、SJTU Date 等
.mjs 脚本需 Node.js ≥18(用内置 fetch,无需 npm 包)。
- 仓库自带
.venv,建议用它的 python 运行需第三方库的脚本(PPT/手写PDF/课件提取)。
九、故障排查
| 现象 | 原因 / 处理 |
|---|
未配置 ... key/token / Canvas token not configured | 对应功能凭证没填,按 §2 配置表补 config.json 字段 |
| Canvas 401 / token 失效 | oc.sjtu.edu.cn 重新生成访问许可证,更新 canvas_token |
| jCourse 课评报错 | 先 selftest;key 失效则 course.sjtu.plus 重新生成 |
传承交大 LoginRequired | token 缺失/过期,重跑 save_sjtu_cookies.py legacy |
| 邮箱连接超时 | IMAP/SMTP 需校园网或 VPN(mail.sjtu.edu.cn) |
| 水源返回 429 | 站点限流,正常现象,等几十秒重试同一命令 |
ModuleNotFoundError: handright | 手写PDF 缺依赖,pip install handright |
❌ 缺少 python-pptx | PPT 生成缺依赖,pip install python-pptx |
[提取失败: No module named 'pptx'/'pdfplumber'] | 课件提取缺依赖,pip3 install python-pptx pdfplumber |
| 部分子 skill 连不上(phycai/lcme) | 需校园网或 VPN |
command not found: timeout(macOS) | 文档示例无需 timeout,脚本自带超时,直接运行 |
十、注意事项
- 写操作(发邮件 / 传承下载消耗积分)执行前必须向用户确认。Canvas 提交作业未做成 CLI,需显式调库函数。
- 凭证失效:Canvas token、jCourse key、传承 token 失效时按 §9 重新生成。
- 📌 静态数据项(食堂 / 校历 / 巴士 / 教室 / 教学周 / 在线工具)为内置离线数据,跨学期可能过期。
- 校园网:邮箱、水源、部分子 skill(phycai/lcme)需校园网或 VPN。
config.json 含真实凭证,已被 git 忽略,切勿提交;只提交 config.example.json(占位符)。
- ⚠️ 已知待修:
sjtu_mirror.py list 后端接口已变更;handwrite_pdf.py 需先装 handright。