Repository navigation
Share
ChangYo edited this page Oct 26, 2026
·
1 revision
| 项 | 值 |
|---|---|
| 平台 |
share.dyweb.sjtu.cn(接口在 api-v2.share.dyweb.sjtu.cn) |
| 认证 | jAccount 登录后的站点令牌(Auth 头) |
| 数据方向 | 只读为主;下载和兑换消耗积分 |
| 难度 | 中 |
| 最后验证 | 2026-10-26 |
| 证据等级 | B(私有接口 + 关键端点实测,无官方文档) |
传承·交大是课程资料共享站,按课程和开课班级组织往年上传的资料。资料由用户上传,不代表教师、学院或学校部门背书;站点没有开放文档,接口来自前端请求和社区实现。
- 可获取:课程搜索与补全、课程详情、开课班级、资料列表、资料详情、资料类型字典。
- 前置:本人 jAccount 登录后的站点 token,放在
Auth请求头里,不是Bearer。 - 注意:没有免登录读取接口,缺 token 直接 401;下载资料会扣积分,本页不提供自动下载。
- 资料列表不是数组:
/material返回{classes, unarchived}两层结构。[实测 2026-10-26]
| 对象 | 内容 | 备注 |
|---|---|---|
| 课程 |
id、code、name、english_name、credits、hours、level、organization、material_count、latest_material_uploaded_at、is_deprecated
|
详情与搜索返回同一套字段 |
| 开课班级 |
id、teacher(含姓名、职称、院系)、material_count、materials、updated_at
|
一门课实测 40 个班级;该端点 materials 恒为 null
|
| 资料列表 | 顶层 classes[] + unarchived[]
|
不是分页数组 |
| 资料 |
id、name、description、digest、ext、file_name、path、size、points、material_type、user_id、class_id、created_at、has_purchased、is_mine、like_count、comment_count、purchase_count
|
积分字段叫 points
|
| 资料类型 |
id、name
|
实测 6 类,id: 1 为「课件」 |
社区脚本用多候选键名容错(id/ID/course_id、title/name/file_name),说明它并未在全部端点上核对过字段名;本页表格按 2026-10-26 实际响应整理。[实测 2026-10-26]
| 部分 | Base URL | 鉴权 | 用途 |
|---|---|---|---|
| 网页 | https://share.dyweb.sjtu.cn/ |
jAccount SSO | 浏览、上传、兑换、下载 |
| 业务 API | https://api-v2.share.dyweb.sjtu.cn/api/v1 |
Auth: <token> |
本页主体 |
| 网页运行时 | 同一域名下的 SPA | localStorage token
|
站点自己从这里取 token |
社区脚本里写的是旧地址 api.beta.share.dyweb.sjtu.cn。2026-10-26 复测时该域名在 TLS 握手阶段失败,已经不可用;只读实测走的是 api-v2.share.dyweb.sjtu.cn。[实测 2026-10-26]
- 用户在受控窗口打开
https://share.dyweb.sjtu.cn/,完成 jAccount 登录。 - 网页把站点 token 写进浏览器本地存储的
token项。[实测 2026-10-26] - 之后每个请求带
Auth: <token>,同时带Accept: application/json。 - 缺 token 或 token 失效时返回 HTTP 401,响应体是
{"code":401,"data":null,"message":"login required","success":false},没有匿名读取的余地。[实测 2026-10-26]
GET https://api-v2.share.dyweb.sjtu.cn/api/v1/material-type
Auth: <token>
Accept: application/jsontoken 相当于本人账号的登录态,按密码级别保管;不要放进 URL、日志或分享配置。
Base:https://api-v2.share.dyweb.sjtu.cn/api/v1
| 接口 | 方法 | 关键参数 | 返回 | 状态 |
|---|---|---|---|---|
/course/search |
POST | body {"keyword": "..."}
|
课程列表,与补全同样封顶 50 条 | 已实测 |
/course/get/{id} |
GET | 路径 | 课程详情,字段见数据清单 | 已实测 |
/course/get/{id}/classes |
GET | 路径 | 开课班级,materials 恒为 null
|
已实测 |
/material |
GET | course_id |
{classes, unarchived} |
已实测 |
/material/get/{id} |
GET | 路径 | 单份资料详情 | 已实测 |
/material-type |
GET | - | 6 种资料类型 | 已实测 |
/prompt/course |
GET | keyword |
补全列表,上限 50 条 | 已实测 |
「已实测」指 2026-10-26 用本人 token 拿到 200 并核对了字段;/course/search 虽然是 POST,语义是查询,本轮已实测。
统一信封:
{"code": 200, "data": {}, "message": "", "success": true}- 成功判定看
success,不是只看 HTTP 200;失败时message是原因。 - 未登录实测:HTTP 401、
success为false、data为null、message为login required。[实测 2026-10-26] -
code为 401 或 HTTP 401 时表示需要重新登录。 -
/material的data是对象{classes: [...], unarchived: [...]},不是数组;社区脚本的_as_list只认数组和items/list/results/...这些键,恰好取不到这两个,会静默返回空列表。[实测 2026-10-26] - 其余端点
data是对象(课程详情)或数组(类型字典、班级、补全),按端点分别处理,不要写一个通用解包。[实测 2026-10-26] - 没有分页参数:
/material?course_id=10791一次返回 40 个班级、857 份归档资料和 109 份未归档资料,约 780 KB。大课程要按班级切片展示,不要一次渲染。[实测 2026-10-26] -
/prompt/course与/course/search都封顶 50 条:5 个关键词里 4 个返回恰好 50 条,/course/search同样返回 50 条、没有翻页字段。匹配方式是子串,「高数」查不到「高等数学」。[实测 2026-10-26]
-
资料按班级分组:
classes[]按开课班级分组,unarchived[]是尚未归档的资料;两份数据要分别展示。[实测 2026-10-26] -
总数对不上:课程详情的
material_count是 964,按班级 857 + 未归档 109 求和是 966;不要用总数做分页或完整性断言。[实测 2026-10-26] -
积分:字段是
points(实测样本为 2),配合has_purchased、is_mine判断是否已兑换;把「能列出」和「能下载」当成两件事。[实测 2026-10-26] - 上传者与版权:资料由用户上传,课程组和教师没有审核义务;转载、二次分发要单独判断。
-
班级端点不完整:
/course/get/{id}/classes的条目course_id为 0、course为null、materials恒为null、material_count恒为 0(两门课各 40 条),只能拿班级和教师,资料必须走/material。[实测 2026-10-26]
-
401
login required:token 缺失或过期,重新登录抓取。 -
API 与网页的失败形态不同:API 返回 401 JSON;未登录访问网页只返回 200 的 SPA 外壳,不会 302 跳转。
[实测 2026-10-26] -
别把
Auth写成Authorization: Bearer:本站只认Auth: <token>,改用 Bearer 实测返回 401。[实测 2026-10-26] -
用旧 beta 域名:2026-10-26 复测时
api.beta.share.dyweb.sjtu.cn在 TLS 阶段就失败,照旧脚本抄地址会连不上。 - 下载扣了积分:下载是不可逆的写操作,需要用户明确确认目标资料和价格。
-
课程搜不到:
/course/search是子串匹配,不是模糊匹配——「高等数学」50 条、「数学」50 条,但「高数」0 条。关键词要写全。[实测 2026-10-26] - 资料列表为空:可能是班级没资料,也可能是权限或归档状态;先看课程详情里的资料概况。
-
把
/material当数组解析:返回的是{classes, unarchived},按数组读会得到 undefined 或空列表。[实测 2026-10-26] -
班级接口里没有资料:
classes端点的materials恒为null,要用/material?course_id=。[实测 2026-10-26] -
一次拉整门课卡住:964 份资料的课程单响应约 780 KB,按班级分屏、懒加载。
[实测 2026-10-26]
const API = 'https://api-v2.share.dyweb.sjtu.cn/api/v1';
async function getMaterials(token: string, courseId: number) {
const response = await fetch(`${API}/material?course_id=${courseId}`, {
headers: { Auth: token, Accept: 'application/json' },
});
if (response.status === 401) throw new Error('站点 token 已失效,请重新登录传承');
if (!response.ok) throw new Error(`传承 HTTP ${response.status}`);
const envelope = await response.json();
if (envelope.success !== true) throw new Error(envelope.message || '接口返回失败');
const data = envelope.data;
if (!Array.isArray(data?.classes) && !Array.isArray(data?.unarchived)) {
throw new Error('资料列表结构已变化');
}
return { classes: data.classes ?? [], unarchived: data.unarchived ?? [] };
}只读调用可以按需缓存课程和班级元数据;资料列表每次现取,避免展示已删除或已归档变化的条目。
- 不要自动下载、自动兑换或批量刷积分;这些都会消耗账号资源。
- 不要批量抓取资料并重新分发;课程资料的版权在教师和上传者。
- 不要把 token 写进前端代码、分享链接或仓库。
- 不要绕过登录、积分或上传审核。
- 站点 token 的位置、
Auth头、401 信封、/material的分组结构、字段名:[实测 2026-10-26,本人 token,只读];记录未入库。 - 未登录请求
/material-type返回 HTTP 401 +login required,旧 beta 域名 TLS 握手失败:[实测 2026-10-26,未登录,只读探测] - 端点清单、信封结构、字段容错、旧 beta 域名:
[代码]openclaw-sjtu/sjtu_legacy.py - 服务入口、条款、隐私政策与上传规范:
[官方]传承·交大、服务条款、隐私政策、资料上传规范 - 下载扣分、积分记录、上传审核未实测。
- 2026-10-25:首版。记录
api-v2生产入口、Auth头与只读端点;下载、上传、积分操作未纳入。 - 2026-10-26:补未登录响应封装;旧 beta 域名从「可能是旧入口」改为「已不可用」。
- 2026-10-26:带 token 复测六个 GET 端点,证据等级 C → B;更正
/material返回结构、补真实字段名、material_count与实际求和差 2。 - 2026-10-26:复核对齐后修正
/classes端点的materials为null而非空数组。
本 Wiki 记录的是开发实践,不是学校官方承诺。每个结论都标注证据与日期;校园平台会调整字段、权限和登录方式,动手前请按页面里的「最后验证」复核。发现过期内容请提 Issue 或直接改。