Skip to content
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 与校园会话、安全、隐私与合规。

要点

  • 可获取:课程搜索与补全、课程详情、开课班级、资料列表、资料详情、资料类型字典。
  • 前置:本人 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]


1. 平台架构

部分 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]


2. 认证

  1. 用户在受控窗口打开 https://share.dyweb.sjtu.cn/,完成 jAccount 登录。
  2. 网页把站点 token 写进浏览器本地存储的 token 项。[实测 2026-10-26]
  3. 之后每个请求带 Auth: <token>,同时带 Accept: application/json。
  4. 缺 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/json

token 相当于本人账号的登录态,按密码级别保管;不要放进 URL、日志或分享配置。


3. 端点表

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,语义是查询,本轮已实测。


4. 响应结构与分页

统一信封:

{"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]

5. 数据质量

  • 资料按班级分组: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]

6. 常见问题

  1. 401 login required:token 缺失或过期,重新登录抓取。
  2. API 与网页的失败形态不同:API 返回 401 JSON;未登录访问网页只返回 200 的 SPA 外壳,不会 302 跳转。[实测 2026-10-26]
  3. 别把 Auth 写成 Authorization: Bearer:本站只认 Auth: <token>,改用 Bearer 实测返回 401。[实测 2026-10-26]
  4. 用旧 beta 域名:2026-10-26 复测时 api.beta.share.dyweb.sjtu.cn 在 TLS 阶段就失败,照旧脚本抄地址会连不上。
  5. 下载扣了积分:下载是不可逆的写操作,需要用户明确确认目标资料和价格。
  6. 课程搜不到:/course/search 是子串匹配,不是模糊匹配——「高等数学」50 条、「数学」50 条,但「高数」0 条。关键词要写全。[实测 2026-10-26]
  7. 资料列表为空:可能是班级没资料,也可能是权限或归档状态;先看课程详情里的资料概况。
  8. 把 /material 当数组解析:返回的是 {classes, unarchived},按数组读会得到 undefined 或空列表。[实测 2026-10-26]
  9. 班级接口里没有资料:classes 端点的 materials 恒为 null,要用 /material?course_id=。[实测 2026-10-26]
  10. 一次拉整门课卡住:964 份资料的课程单响应约 780 KB,按班级分屏、懒加载。[实测 2026-10-26]

7. 最小示例

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 ?? [] };
}

只读调用可以按需缓存课程和班级元数据;资料列表每次现取,避免展示已删除或已归档变化的条目。


8. 不要做

  • 不要自动下载、自动兑换或批量刷积分;这些都会消耗账号资源。
  • 不要批量抓取资料并重新分发;课程资料的版权在教师和上传者。
  • 不要把 token 写进前端代码、分享链接或仓库。
  • 不要绕过登录、积分或上传审核。

9. 证据与来源

  • 站点 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 而非空数组。

Clone this wiki locally