项目分享 2026-07-17 22:29 43

NFUCourseHelper:广州南方学院多账号选课助手

平时使用教务系统选课时,最麻烦的往往不是“点一下选课”,而是反复登录、寻找批次、查询课程、确认教学班,再在多个任务之间来回切换。为了把这些步骤集中起来,我做了 NFUCourseHelper:一款面向广州南方学院教务系统的 Windows 多账号选课助手。

项目目前已经开源,提供 Windows 免安装版本,也支持从 Python 源码运行:

GitHub 项目主页:Yakult00/NFUCourseHelper-Modular
Windows 版本下载:GitHub Releases

这个项目用于管理本人有权访问的教务系统账号,不会保证选课成功。最终结果始终以学校教务系统中的记录为准。

项目能做什么

  • 多账号管理:在一个程序中保存、切换和分别登录多个学生账号。
  • 账号任务隔离:每条任务绑定明确账号,不同账号使用独立 Session、Cookie 和批次上下文。
  • 登录与批次分离:登录只负责获取或刷新 Cookie,需要查询新课程时才读取选课批次。
  • 课程和教学班查询:按课程名称查询课程,显示教师、上课时间、地点和容量等教学班信息。
  • 手动选课:对当前选中的教学班发起一次提交,适合临时操作。
  • 并发任务:多个课程任务可以同时运行,不需要按课程一个一个等待。
  • 任务持久化:课程、教学班 ID 和必要的批次字段保存在本地,软件重启后仍可恢复。
  • 结果二次确认:接口提示成功后再次读取服务器已选列表,避免把“提交成功”误认为“最终选中”。
  • 自动重试与恢复:登录超时后继续重试;Cookie 失效或出现 JAS-04 时,只恢复受影响的 worker。
  • 已选与退课:读取当前账号已选课程,并在确认后提交退课请求。

最重要的改进:任务缓存直接运行

第一次建立任务时,程序仍然需要读取当前账号的选课批次,并查询对应课程和教学班:

登录/刷新 Cookie
→ 读取选课批次
→ 查询课程与教学班
→ 添加并保存任务
→ 启动任务

任务保存完成后,课程所属批次、教学班 ID 和必要运行字段会一起写入本地任务快照。以后重新打开软件,只需要让账号重新取得有效 Cookie:

打开软件
→ 登录/刷新 Cookie
→ 直接启动已有任务
→ 恢复任务批次快照
→ 多 worker 并发提交
→ 查询已选列表确认结果

只要缓存完整,启动任务时就不会再次请求批次列表、Display 页面或教学班详情。这样做的好处是减少启动前的网络请求,也避免服务器拥堵时“主页已经登录,但任务因为重新读取批次失败而无法启动”。

多账号是如何隔离的

教务系统中,即使不同学生看到的批次名称相同,请求里的学院、专业、年级、班级、校区和批次动态字段也可能不同。因此项目没有把一个账号的完整参数直接复制给其他账号。

每个账号分别维护:

  • 独立的 requests.Session 和 Cookie;
  • 学生身份信息与选课批次;
  • Display 页面动态字段;
  • 任务缓存快照;
  • 登录锁、请求锁和停止事件;
  • worker 的运行状态和错误恢复流程。

每条任务都保存 account_id。如果修改账号凭据,或者把任务改绑到另一个账号,程序会自动使原来的批次快照失效,防止旧账号参数串到新账号。

并发任务与运行状态

任务启动后,同一批次中的多个课程可以并发执行。每个 worker 都有独立的 Session、请求控制和停止状态,不需要先把五门课程逐个准备完再开始第一轮提交。

为了避免主日志区不断刷屏,提交次数、当前状态和最新服务器返回结果会显示在对应任务行后面。主日志只保留登录、恢复、启动、停止和最终确认等关键过程。

并发并不等于无限请求。程序保留任务间隔和并发数量设置,使用时应根据教务系统实际情况合理配置,避免给服务器造成额外压力。

为什么还要二次确认

有些接口返回 {"flag":"1"} 或“提交成功”,只代表请求被接受,并不一定代表课程已经出现在最终选课结果中。NFUCourseHelper 会在提交后重新读取已选课程列表,并使用课程号、教学班 ID 等信息核对结果。

因此界面会区分:

  • 请求已发送;
  • 接口返回成功;
  • 服务器已选列表确认成功;
  • 仍未确认,需要继续检查或重试。

异常恢复逻辑

默认网络请求超时为 120 秒。登录失败时会按照间隔持续重试,直到成功或用户主动停止。

正常情况下,缓存任务不会重新读取批次。只有以下情况才刷新当前账号或 worker:

  • 第一次创建任务,尚未生成完整缓存;
  • 任务缺少必要批次字段或学生上下文;
  • 账号、密码或任务绑定发生变化;
  • Cookie 或登录会话已经失效;
  • 服务器返回 JAS-04 等校验错误;
  • 学校更换了选课批次或教学班。

恢复只针对出现问题的 worker,不会要求所有账号一起重新登录,也不会让一个账号的错误阻塞其他账号任务。

本地数据与隐私

软件会在运行目录创建两个配置文件:

jwxt_config.json
jwxt_tasks.json
  • jwxt_config.json 保存本地账号配置,可能包含账号和密码。
  • jwxt_tasks.json 保存课程任务、教学班和白名单批次字段。
  • 任务文件不会保存 Cookie、Session、CSRF Token 或 worker 临时对象。
  • 两个配置文件都被项目的 .gitignore 排除,不会进入正常 Git 提交。

使用时不要把配置文件上传到公开网盘,也不要在截图、Issue 或日志中泄露学号、密码、Cookie 和请求 token。

下载安装

Windows 免安装版

  1. 进入项目的 Releases 页面
  2. 下载 NFUCourseHelper-Windows-x64.zip
  3. 完整解压到一个可写目录。
  4. 双击运行 NFUCourseHelper.exe

Windows 免安装版本不需要提前安装 Python,但不要直接在压缩包中运行程序。

从源码运行

git clone https://github.com/Yakult00/NFUCourseHelper-Modular.git
cd NFUCourseHelper-Modular
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install -r requirements.txt
python main.py

源码运行需要 Windows 10/11、Python 3.10 或更高版本,并且当前网络可以正常访问广州南方学院教务系统。

项目结构

项目按职责拆分为网络客户端、页面解析、数据模型、本地存储、任务调度和图形界面:

NFUCourseHelper-Modular/
├─ main.py
├─ nfu_course_helper/
│  ├─ client.py
│  ├─ parsers.py
│  ├─ models.py
│  ├─ storage.py
│  └─ gui/
│     ├─ accounts.py
│     ├─ courses.py
│     ├─ tasks.py
│     └─ selected.py
├─ docs/
└─ tests/

项目包含账号与批次隔离、动态字段解析、缓存恢复、多 worker 并发、敏感字段过滤、掉线恢复和 GUI 构造等自动化测试。

项目地址

GitHub:https://github.com/Yakult00/NFUCourseHelper-Modular

Windows 下载:https://github.com/Yakult00/NFUCourseHelper-Modular/releases/latest

项目会继续根据实际使用情况完善账号兼容、缓存恢复、任务状态展示和异常处理。如果发现问题,建议在提交 Issue 时隐藏学号、密码、Cookie、Token 和完整请求参数。

使用边界

  • 仅用于访问和管理使用者本人有权使用的教务系统账号。
  • 请遵守学校规章、教务系统使用条款和适用法律法规。
  • 请合理设置并发数量和请求间隔,不要影响教务系统正常运行。
  • 软件不能保证选课成功,最终结果以学校教务系统记录为准。
Tags: python, 自动化, 开源项目, 选课助手

发表评论