广州商学院教务系统下载所有成绩

修复版:在广州商学院教务系统成绩查询页面,增加一个“导出所有成绩”的按钮,方便导出所有学期的成绩。

作者
poboll
日安装量
0
总安装量
0
评分
0 0 0
版本
1.3
创建于
2025-07-19
更新于
2025-07-19
大小
7.2 KB
许可证
MIT
适用于

GCC-CJCX:广州商学院教务系统成绩导出助手

版本 语言 许可证 GitHub Stars

一份专为广州商学院(GCC)学生设计的浏览器用户脚本,旨在突破官方教务系统的限制,实现全量成绩单的一键导出。


核心原理:一次对后端 API 的精妙“欺骗”

要理解本脚本的原理,我们首先要明白现代网页应用(WebApp)通常分为前端(UI)后端(API)两个层面。前端是我们在浏览器上看到的界面,而后端是处理数据和逻辑的服务器。本脚本的本质,就是绕过前端界面的操作限制,直接与后端 API 进行一次精心构造的交互。

第一步:诊断问题——交互分析

官方教务系统的“成绩查询”页面存在一个核心痛点:其前端界面强制用户必须选择一个“学年”和“学期”才能进行查询或导出,这意味着用户无法通过正常操作来获取一份包含所有学期的完整成绩单。

通过浏览器的开发者工具(F12)对网络流量进行分析,我们可以观察到,当用户点击“导出”按钮时,浏览器会向服务器发送一个请求。这个请求并非刷新页面,而是一个后台的 API 调用。

第二步:锁定目标——API 端点

分析发现,负责导出的后端 API 端点是:

POST /cjcx/cjcx_dcXsKccjList.html

这个接口接收一系列参数,并直接返回一个 Excel 文件的数据流,而不是网页内容。这便是我们进行操作的完美目标。

第三步:解码请求——参数的秘密

一个正常的、导单个学期的请求,其发送的数据(Payload)大致如下:

gnmkdmKey=N305005
&xnm=2024
&xqm=12
&dcclbh=JW_N305005_GLY
&exportModel.selectCol=...
&csrftoken=xxxx-xxxx-xxxx-xxxx

这里的关键参数是:

  • xnm: 学年 (e.g., 2024)
  • xqm: 学期 (e.g., 12 代表第二学期)
  • csrftoken: 一个用于防止跨站请求伪造(CSRF)攻击的安全令牌。

第四步:构想方案——“空值”即“全部”

我们面临的核心挑战是:如何让后端一次性返回所有数据?

答案在于一个常见的后端设计逻辑:对于筛选参数,如果前端不传递值或传递空值,后端常常会将其解释为“无筛选条件”,即“查询全部”

本脚本正是利用了这一点。当我们点击“导出所有成绩”按钮时,脚本并不会去读取页面上用户选择的学年和学期,而是主动构造一个将 xnmxqm 参数值置为空字符串的请求

// 脚本构造的核心数据片段
let data = `gnmkdmKey=N305005&xnm=&xqm=&...`; 

第五步:突破防线——获取并注入安全令牌

仅仅修改参数还不够。现代 Web 应用为了安全,会验证请求是否源自合法会话。csrftoken 就是这道防线。服务器在渲染页面时,会将一个唯一的 csrftoken 埋藏在页面的 HTML 中一个隐藏的 <input> 标签里。

<input type="hidden" id="csrftoken" name="csrftoken" value="一长串唯一的令牌值">

脚本在执行时,会先像用户一样“查看”页面,用 jQuery 找到这个隐藏的输入框并读取其 value 值。

const csrftoken = $('#csrftoken').val();

然后,它将这个获取到的令牌附加到我们伪造的请求数据中,使其看起来像一个完全合法的、由用户亲自发起的请求,从而通过了服务器的安全验证。

第六步:接收与下载——文件流的处理

服务器验证通过后,会返回 Excel 文件本身的数据流。脚本通过设置 XMLHttpRequestresponseTypeblob 来正确接收这种二进制数据。

xhr.responseType = 'blob';

收到 blob 对象后,脚本在浏览器内存中为其创建一个临时的、唯一的 URL,然后模拟用户点击一个隐藏的下载链接,最终优雅地触发了浏览器的标准下载流程。

总结:本脚本通过直接与后端API对话,并利用“空值即全部”的逻辑漏洞,同时模拟合法用户的安全凭证,实现了对前端UI限制的完美绕过。整个过程安全、高效,且不触及任何敏感操作。

✨ 项目特性

基于以上原理,本脚本实现了以下核心特性:

  • 全量导出: 一键获取覆盖所有学期的完整成绩单,告别繁琐的手动操作。
  • 无缝集成: 动态生成“导出所有成绩”按钮,与原始页面UI融为一体,符合用户操作直觉。
  • 标准格式: 导出文件为通用的 .xlsx 格式,便于在各类办公软件中打开和处理。
  • 安全透明: 仅与官方API进行数据查询交互,不读取、不存储任何个人敏感信息,代码完全开源可审查。
  • 持久稳定: 只要后端接口逻辑不变,脚本即可长期有效。

🎬 动态演示

(建议在此处嵌入一段 GIF 动图,完整展示从登录(不可用)、进入成绩页面、点击按钮到文件成功下载的全过程)

动态演示GIF

🚀 安装与使用

前提:安装用户脚本管理器

为你的浏览器安装一款用户脚本管理器扩展,它是运行本脚本的基础。

步骤一:安装本脚本

点击链接后,脚本管理器将自动打开并提示你进行安装,确认即可。

步骤二:开始使用

  1. 正常登录(不可用)广州商学院教务系统。
  2. 导航至 信息查询 -> 成绩查询
  3. 你会看到新增的 “导出所有成绩” 按钮。
  4. 点击它,文件将自动开始下载。

🤝 参与贡献

我们欢迎任何形式的贡献,无论是代码还是建议。

  • 报告 Bug: 遇到问题?请在 GitHub Issues 中详细描述。
  • 提交代码: 修复或改进功能?欢迎提交 Pull Request。

📜 更新日志

  • v1.3 (2025-07-19)
    • 修复:致命的引号语法错误,该错误导致脚本完全无法加载。
    • 增强:自动获取并添加 csrftoken 到导出请求中,解决因缺少令牌导致的请求失败问题。
    • 优化:脚本注入时机,确保页面完全加载后再执行,提高稳定性。
  • v1.2 (2025-07-19)
    • 变更:更新作者及版权信息,项目主页指向 GitHub 仓库。
  • v1.0 (初始版本)
    • 功能:实现一键导出所有学期成绩的核心功能。

📄 许可证

本项目基于 MIT License 授权。


© 2025 在虎

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址