Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/Lucent-Snow/zju-scholar --skill zju-scholar명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SOC 직업 분류 기준
SKILL.md 표시 중
| name | zju-scholar |
| description | 浙大学习助手,查询课表、成绩、作业、课程资源、智云课堂和 CC98。 |
| uri | skill://zju-scholar |
| updated | 2026-07-04T12:23:56+08:00 |
| version | 2 |
通过 Python 脚本调用浙大教务网(ZDBK)、学在浙大(Courses)、智云课堂和 CC98 论坛的数据。 所有数据脚本统一输出 JSON,且共享同一份本地 session / WebVPN 状态。
这是一个统一入口 skill,不是单脚本工具。内部按平台和功能拆分,避免把不同来源、 不同稳定性的接口揉在一起。
脚本位于本 Skill 目录下的 scripts/ 子目录。
默认安装路径:
~/.claude/skills/zju-scholar%USERPROFILE%\.claude\skills\zju-scholar以下示例中 <SKILL> 代表实际安装路径,请替换为上述路径。
需要先登录才能查询数据。凭证保存在 skill 文件夹的 data/ 目录中。
在校外网络环境下,脚本会自动检测并通过 WebVPN 代理访问校内服务。
# 首次登录(保存凭证 + 登录所有服务,自动检测网络环境)
python <SKILL>/scripts/zju_login.py -u 学号 -p 密码
# 强制使用 WebVPN(校外网络)
python <SKILL>/scripts/zju_login.py --webvpn
# 后续登录(使用已保存的凭证)
python <SKILL>/scripts/zju_login.py
# 查看状态
python <SKILL>/scripts/zju_login.py --status
# 设置智云 JWT(自动获取失败时手动设置)
python <SKILL>/scripts/zju_login.py --zhiyun-token TOKEN
登录浙大统一认证,同时登录教务网、学在浙大、智云课堂,将 session 保存到本地。
教务网(ZDBK)数据:课表、成绩、考试。
# 获取当前学期课表(自动推算,推荐)
python <SKILL>/scripts/zju_academic.py courses
# 获取指定学期课表
python <SKILL>/scripts/zju_academic.py courses --year 2024 --semester 1
# 获取所有成绩和 GPA
python <SKILL>/scripts/zju_academic.py grades
# 仅当前学期成绩
python <SKILL>/scripts/zju_academic.py grades --current
# 指定学期成绩
python <SKILL>/scripts/zju_academic.py grades --year 2025 --semester 1
# 获取当前学期考试安排(默认)
python <SKILL>/scripts/zju_academic.py exams
# 获取所有考试安排
python <SKILL>/scripts/zju_academic.py exams --all
学期自动推算规则(UTC+8):
不传 --year/--semester 时自动使用当前学期,推荐这种用法。
学在浙大平台数据:课程管理、作业DDL、课件资料、云盘资源。
# 当前课程列表
python <SKILL>/scripts/zju_courses.py course-list --page-size 20
python <SKILL>/scripts/zju_courses.py course-list --status ongoing --page-size 20
python <SKILL>/scripts/zju_courses.py course-list --status finished --page-size 20
# 课程详情 / 模块 / 活动 / 课堂互动 / 课件
python <SKILL>/scripts/zju_courses.py course-detail --course-id 94434
python <SKILL>/scripts/zju_courses.py modules --course-id 94434
python <SKILL>/scripts/zju_courses.py activities --course-id 94434
python <SKILL>/scripts/zju_courses.py classrooms --course-id 94434
python <SKILL>/scripts/zju_courses.py coursewares --course-id 94434
# 作业或活动详情
python <SKILL>/scripts/zju_courses.py activity --activity-id 123456
# 课堂互动详情
python <SKILL>/scripts/zju_courses.py classroom --classroom-id 654321
# 云盘资源
python <SKILL>/scripts/zju_courses.py resources --type document --page-size 10
python <SKILL>/scripts/zju_courses.py resource-download --resource-id 19533038 --output-dir downloads
python <SKILL>/scripts/zju_courses.py resource-upload --file ./notes.pdf
状态语义:
ongoing:进行中的课程notStarted:尚未开始的课程finished:已结束课程实现说明:
POST /api/my-coursesfinished 会先读 my-semesters,再按学期聚合课程并本地过滤 ended/finished/completed/closedactivities[].uploads[] 展平,而不是读取不存在的顶层文件列表# 默认推荐:列出当前账号课程
python <SKILL>/scripts/zju_zhiyun.py my-courses --keyword 数据科学
# 视频元数据 / PPT 时间轴 / 字幕原文
python <SKILL>/scripts/zju_zhiyun.py videos --course 数据科学
python <SKILL>/scripts/zju_zhiyun.py ppt --course 数据科学
python <SKILL>/scripts/zju_zhiyun.py transcript --sub-id 12345
# 一键获取讲座纯文本(默认过滤口头语,不带时间戳、不带翻译)
python <SKILL>/scripts/zju_zhiyun.py lecture --course 数据科学
python <SKILL>/scripts/zju_zhiyun.py lecture --course 数据科学 --timestamps
python <SKILL>/scripts/zju_zhiyun.py lecture --course 数据科学 --no-filter-fillers
# 获取指定视频字幕(默认过滤口头语后的纯文本)
python <SKILL>/scripts/zju_zhiyun.py subtitle --sub-id 12345
python <SKILL>/scripts/zju_zhiyun.py subtitle --sub-id 12345 --timestamps
python <SKILL>/scripts/zju_zhiyun.py subtitle --sub-id 12345 --no-filter-fillers
# 导出课件幻灯片为 PDF(通过 PPT 时间轴 API,无需浏览器)
python <SKILL>/scripts/zju_zhiyun.py courseware-pdf --course 实验心理学
python <SKILL>/scripts/zju_zhiyun.py courseware-pdf --course 实验心理学 --all
python <SKILL>/scripts/zju_zhiyun.py courseware-pdf --course 实验心理学 --sub-id 1912570
python <SKILL>/scripts/zju_zhiyun.py courseware-pdf --course 实验心理学 --all --output ./pdfs
# 启用感知哈希去重(去除相邻相似帧,默认阈值 15)
python <SKILL>/scripts/zju_zhiyun.py courseware-pdf --course 实验心理学 --all --dedup
python <SKILL>/scripts/zju_zhiyun.py courseware-pdf --course 实验心理学 --all --dedup --dedup-threshold 20
# 可选:全站搜索课程(当前平台下可能为空)
python <SKILL>/scripts/zju_zhiyun.py search --teacher 张三
python <SKILL>/scripts/zju_zhiyun.py search --keyword 数据科学
python <SKILL>/scripts/zju_zhiyun.py search --teacher 张智君 --keyword 生理心理学
使用原则:
search/posts 默认控制在必要范围内,避免高频翻页# 登录 CC98
python <SKILL>/scripts/zju_cc98.py login --username 用户名 --password 密码
# 查看登录状态
python <SKILL>/scripts/zju_cc98.py status
# 每日签到(已签到会提示)
python <SKILL>/scripts/zju_cc98.py signin
# --- 用户 ---
python <SKILL>/scripts/zju_cc98.py me # 当前用户详情
python <SKILL>/scripts/zju_cc98.py user --user-id 12345 # 其他用户详情
python <SKILL>/scripts/zju_cc98.py search-user --name LucentSnow # 按用户名查 ID
python <SKILL>/scripts/zju_cc98.py my-topics # 我的帖子
python <SKILL>/scripts/zju_cc98.py user-topics --user-id 12345 # 某用户的帖子
python <SKILL>/scripts/zju_cc98.py browse-history # 浏览历史
python <SKILL>/scripts/zju_cc98.py unread # 未读消息数
python <SKILL>/scripts/zju_cc98.py followers # 粉丝列表
python <SKILL>/scripts/zju_cc98.py followees # 关注列表
python <SKILL>/scripts/zju_cc98.py followee-topics # 好友动态
# --- 帖子浏览 ---
python <SKILL>/scripts/zju_cc98.py hot --period weekly # 热门帖子
python <SKILL>/scripts/zju_cc98.py hot --period monthly
python <SKILL>/scripts/zju_cc98.py hot --period history
python <SKILL>/scripts/zju_cc98.py new-topics # 新帖列表
python <SKILL>/scripts/zju_cc98.py random-topics # 随机帖子
python <SKILL>/scripts/zju_cc98.py search --keyword 常微分 --size 5
python <SKILL>/scripts/zju_cc98.py search --keyword 常微分 --board-id 68 --size 5
# --- 帖子详情 ---
python <SKILL>/scripts/zju_cc98.py topic --topic-id 6454407
python <SKILL>/scripts/zju_cc98.py posts --topic-id 6454407 --from 0 --size 10
python <SKILL>/scripts/zju_cc98.py hot-posts --topic-id 6454407
python <SKILL>/scripts/zju_cc98.py like-status --post-id 123456 # 点赞状态
# --- 收藏 ---
python <SKILL>/scripts/zju_cc98.py favorites # 收藏帖子列表
python <SKILL>/scripts/zju_cc98.py fav-groups # 收藏夹分组
# --- 消息 ---
python <SKILL>/scripts/zju_cc98.py recent-contacts # 最近聊天用户
python <SKILL>/scripts/zju_cc98.py system-notifications
python <SKILL>/scripts/zju_cc98.py all-boards
python <SKILL>/scripts/zju_cc98.py board-info --board-id 2
python <SKILL>/scripts/zju_cc98.py board-topics --board-id 2
python <SKILL>/scripts/zju_cc98.py best-topics --board-id 2
python <SKILL>/scripts/zju_cc98.py toggle-like --post-id 123456
python <SKILL>/scripts/zju_cc98.py post-reply --topic-id 6454407 --content 回复内容
python <SKILL>/scripts/zju_cc98.py create-topic --board-id 2 --title 标题 --content 内容
python <SKILL>/scripts/zju_cc98.py edit-post --post-id 123456 --content 新内容
python <SKILL>/scripts/zju_cc98.py add-favorite --topic-id 6454407
python <SKILL>/scripts/zju_cc98.py chat-history --user-id 12345
python <SKILL>/scripts/zju_cc98.py hot --period weekly --webvpn
| 参数 | 含义 |
|---|---|
| --year 2024 --semester 1 | 2024-2025 秋冬学期 |
| --year 2024 --semester 2 | 2024-2025 春夏学期 |
| --year 2024 --semester 3 | 2024-2025 短学期 |
zju_academic.py courses(自动推算当前学期)zju_academic.py gradeszju_academic.py grades --currentzju_academic.py exams(默认当前学期)zju_courses.py todoszju_courses.py activities --course-id ... / zju_courses.py coursewares --course-id ...zju_courses.py resources --type documentzju_zhiyun.py search --teacher 张三(旁路能力,可能为空)zju_zhiyun.py lecture --course 数据科学zju_zhiyun.py videos ... / zju_zhiyun.py ppt ...zju_zhiyun.py courseware-pdf --course ... --allzju_academic.pyzju_courses.pyzju_zhiyun.pyzju_cc98.pyzju_session.py、zju_output.py、zju_api.py、zju_cache.py职责边界:作业/DDL 归学在浙大(zju_courses.py todos),教务层只管课表、成绩、考试。
如果用户说“统一入口”,优先理解为这个 skill 统一承接能力,而不是合并成一个脚本。 新增能力时保持按平台、按功能分类。
所有数据都存储在 skill 文件夹内:
data/credentials.json — 学号、密码data/session.json — 登录后的 session 信息data/cc98_credentials.json — CC98 用户名、密码data/cc98_session.json — CC98 access_token / refresh_tokendata/profile.json — 用户学业档案(年级、当前学期、校区等)cache/ — 缓存目录(课表、成绩等查询结果)output/ — 大文本输出目录(字幕、讲座文本等)存储用户当前的学业状态,所有脚本共享。格式:
{
"grade": "大二下",
"year": "2025",
"semester": "2",
"label": "2025-2026 春夏",
"campus": "紫金港"
}
year + semester 是课表/成绩/考试的默认学期参数zju_login.pyzju_academic.py / zju_courses.py / zju_zhiyun.py 都输出统一 JSON,可直接供 AI 继续处理ok/platform/feature/source/generated_at/meta/datasearch 仅作为旁路能力,但现在会自动补齐 user_id/user_name,并在关键词无结果时尝试更短的模糊片段--teacher,结果会明显更准--no-filter-fillersoutput/ 目录,JSON 只返回文件路径、字数和前 300 字预览;AI 需要全文时用 read 工具读取文件text 字段返回last_search_in_1_secondszju_login.py --webvpn 建立的 ZJU WebVPN 会话访问httpx, pycryptodome (见 scripts/requirements.txt)
\n\n### 已知 bug 修复记录(2026-06-30)\n\nzju_zhiyun.py get_transcript() Content-Type bug:智云课堂 transcript API 返回 Content-Type: text/html 即使响应体是有效 JSON(服务器配置问题)。修复:先尝试 JSON 解析,解析失败才检查 Content-Type。不要在 JSON 解析之前过滤 Content-Type。\n\nzju_login.py 错误处理:原 except Exception as e: print(f\"登录失败: {e}\") 在异常消息为空时无法诊断。修复:添加 traceback.print_exc() 输出完整堆栈。\nContent-Type: text/html,即使响应体是有效 JSON。之前的代码先检查 Content-Type,发现是 HTML 就直接返回 None,导致有效的字幕数据被过滤掉。scripts/zju_zhiyun.py 第 632-655 行附近,get_transcript 方法_cmd_subtitle 函数在 transcript 返回 None 时增加了更准确的错误提示(区分 JWT 过期 vs 确实没有字幕)except Exception as e 只打印异常消息,如果消息为空则完全无信息。print(f"登录失败: {type(e).__name__}: {e}") + traceback.print_exc(),输出完整堆栈。scripts/zju_login.py 第 267-271 行附近