东南大学讲座抢课自动化系统设计与实现

发布时间:2026/10/27 17:38:49

东南大学讲座抢课自动化系统设计与实现 简介本资源是面向东南大学在校学生的Python自动化抢课工具专为解决人文与科学素养系列讲座名额紧张、人工预约耗时易失效等痛点而设计。系统基于网络爬虫与自动点击技术实现讲座信息实时监测、开放瞬间快速预约及退订补位响应显著提升抢课成功率与操作效率。压缩包共18个文件含3个核心Python脚本如seu_auth.py、main.py、2个PyInstaller打包配置.spec、2个前端辅助脚本auto_click.js、greasemonkey.js、1个OCR识别模型model.onnx、1个验证码哈希表csv、1个使用说明文档附赠资源.docx及1个README.md总大小10.09MB结构兼顾可运行性与可扩展性。目前已有73人学习下载读者可直接部署运行获取完整源码、认证逻辑实现、验证码识别方案、Cookie持久化机制及异常处理策略适合具备基础Python和Web交互能力的高校学生开展实践学习与二次开发。1. 为什么手动抢“人文与科学素养讲座”名额比调参还玄学东南大学信息门户的「学术交流与文体活动」板块里人文与科学素养系列讲座的名额释放规律像黑匣子不定时、不预告、不提示、不重放。我亲眼见过同学凌晨三点蹲守刷新手速快过机械键盘触发结果页面刚加载出“剩余0”后台已锁死也见过教务系统刚弹出“预约成功”3秒后跳转到“该场次已满”。这不是网络延迟问题——是服务器端做了毫秒级并发拦截且前端不暴露真实库存状态。这个 Pyth.zip 项目注意不是 Python 脚本集合而是完整可运行的自动化预约抢课系统正是为解决这一场景而生它不模拟点击、不依赖 Selenium 渲染而是直击信息门户 API 的预约链路用会话复用请求预签名状态机轮询在服务端未响应前就完成身份校验、场次筛选、席位锁定三步闭环。适合两类人一是课表密集、选修学分卡在临界点的大三学生二是想把“抢讲座”这件事从体力活变成可复现工程的同学。它不是外挂而是对公开接口的合规调用——所有请求头、Cookie、Token 均来自你本人登录态行为逻辑完全等同于手动操作只是更快、更稳、更准。2. 拆解信息门户预约链路从登录态捕获到席位锁定的四层协议东南大学信息门户info.seu.edu.cn对学术活动预约采用典型的“前端静态页 后端动态接口”架构。但关键在于所有预约动作并非发给一个统一 URL而是由四个强依赖、有严格时序的接口组成。这套链路在 2024 年春季学期起被加固——新增了 referer 校验、时间戳签名、session token 绑定三项防护。很多同学写的简单脚本只卡在第一步登录态失效根本没走到真正抢课环节。下面我带你一层层拆开每一步都对应 Pyth.zip 中core/目录下的核心模块。2.1 登录态捕获绕过 CAS 单点登录的会话透传方案信息门户使用学校统一 CAS 认证但直接访问https://info.seu.edu.cn/login会跳转到 CAS 页。Pyth.zip 不走浏览器模拟而是用 requests.Session() 主动构造 CAS 流程# core/auth.py import requests from urllib.parse import urlparse, parse_qs def get_cas_session(username: str, password: str) - requests.Session: s requests.Session() # Step 1: 获取 CAS 登录页提取 lt 和 execution 参数 resp s.get(https://cas.seu.edu.cn/cas/login, timeout10) lt re.search(rnamelt\svalue([^]), resp.text).group(1) execution re.search(rnameexecution\svalue([^]), resp.text).group(1) # Step 2: POST 凭据携带原始 Referer 和 User-Agent login_data { username: username, password: password, lt: lt, execution: execution, _eventId: submit } headers { Referer: https://cas.seu.edu.cn/cas/login, User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } resp s.post(https://cas.seu.edu.cn/cas/login, datalogin_data, headersheaders, timeout15) # Step 3: 检查是否跳转到 info.seu.edu.cn提取 JSESSIONID if info.seu.edu.cn in resp.url: # 成功此时 s.cookies 已包含有效 JSESSIONID 和 SEUSSO cookie return s else: raise RuntimeError(CAS 登录失败凭据错误或验证码触发)注意这里的关键不是密码正确性而是Referer必须精确匹配 CAS 登录页 URL否则服务端直接返回 403。Pyth.zip 默认启用--no-captcha模式即仅支持无图形验证码的账号多数学生账号已开通免验。若你的账号强制验证码需自行接入 OCR 模块见第 5 章。2.2 场次发现解析“人文与科学素养”板块的动态活动 ID 映射表讲座列表页https://info.seu.edu.cn/xszx/academicActivity/list.htm本身是静态 HTML但真实数据由 AJAX 加载。Pyth.zip 不解析 DOM而是逆向出/xszx/academicActivity/getListData.htm接口的请求规则type2固定值代表“人文与科学素养”分类type1 是学术报告type3 是文体活动page1页码但实际只返回前 20 条需循环请求timestamp必须是当前毫秒时间戳且服务端校验前后 5 秒偏差signMD5(type2timestamp1717023456789secret_keyseu_academic_2024) —— secret_key 是硬编码在config/secrets.py中的校内公开密钥非用户私钥# core/scheduler.py import time, hashlib, json def fetch_activity_list(session: requests.Session) - list: base_url https://info.seu.edu.cn/xszx/academicActivity/getListData.htm timestamp int(time.time() * 1000) sign_str ftype2timestamp{timestamp}secret_keyseu_academic_2024 sign hashlib.md5(sign_str.encode()).hexdigest() params { type: 2, page: 1, timestamp: str(timestamp), sign: sign } headers {Referer: https://info.seu.edu.cn/xszx/academicActivity/list.htm} resp session.get(base_url, paramsparams, headersheaders, timeout10) data resp.json() # 返回结构{code:0,msg:success,data:[{id:20240517001,title:量子计算导论,status:1,remain:32}]} return [item for item in data[data] if item[status] 1] # status1 表示可预约参数说明remain字段是服务端实时计算的余量但存在 2~3 秒缓存id是唯一预约凭证后续所有操作均基于此 ID。Pyth.zip 默认只抓取remain 0的场次避免无效请求。2.3 席位锁定三阶段原子化预约请求链真正的抢课发生在/xszx/academicActivity/reserve.htm。但直接 POST 会失败——它要求前置两个校验接口构成不可分割的原子链步骤接口关键参数作用1️⃣ 预检/xszx/academicActivity/checkReserve.htmactivityId,timestamp,sign校验用户资格、场次状态、余量真实性返回canReservetrue才允许下一步2️⃣ 锁定/xszx/academicActivity/lockSeat.htmactivityId,timestamp,sign,seatType1占用一个虚拟席位10 秒有效期返回lockId3️⃣ 提交/xszx/academicActivity/reserve.htmactivityId,lockId,timestamp,sign最终提交生成预约记录# core/reserver.py def reserve_activity(session: requests.Session, activity_id: str) - bool: timestamp int(time.time() * 1000) # Step 1: Pre-check check_params gen_sign_params({activityId: activity_id, timestamp: timestamp}) check_resp session.get( https://info.seu.edu.cn/xszx/academicActivity/checkReserve.htm, paramscheck_params, headers{Referer: https://info.seu.edu.cn/xszx/academicActivity/detail.htm?id activity_id}, timeout5 ) if not check_resp.json().get(canReserve): return False # Step 2: Lock seat lock_params gen_sign_params({ activityId: activity_id, timestamp: timestamp, seatType: 1 }) lock_resp session.get( https://info.seu.edu.cn/xszx/academicActivity/lockSeat.htm, paramslock_params, timeout5 ) lock_data lock_resp.json() if not lock_data.get(lockId): return False # Step 3: Final submit submit_params gen_sign_params({ activityId: activity_id, lockId: lock_data[lockId], timestamp: timestamp }) submit_resp session.post( https://info.seu.edu.cn/xszx/academicActivity/reserve.htm, datasubmit_params, timeout5 ) return submit_resp.json().get(code) 0 # code0 表示成功逻辑说明gen_sign_params()函数对所有参数按 key 字典序拼接后 MD5与 2.2 节一致。整个链路耗时控制在 800ms 内远低于服务端 10 秒锁定期确保高成功率。Pyth.zip 默认启用--fast-mode即并发执行多个场次的预检但锁定和提交仍串行避免单点失败导致全局阻塞。3. 配置与启动从解压到首次成功预约的 5 分钟实操Pyth.zip 解压后目录结构清晰无需安装任何第三方包requests、lxml、pyyaml 已内置 vendorPyth/ ├── config/ │ ├── secrets.py ← 存放学校密钥和账号模板 │ └── rules.yaml ← 场次筛选规则支持关键词、时间范围、余量阈值 ├── core/ │ ├── __init__.py │ ├── auth.py ← 登录模块 │ ├── scheduler.py ← 场次发现模块 │ └── reserver.py ← 预约执行模块 ├── main.py ← 入口脚本 └── README.md3.1 初始化账号与密钥填对三处成功率翻倍打开config/secrets.py修改以下三处其他字段保持默认# config/secrets.py USERNAME your_student_id # 东南大学学号纯数字 PASSWORD your_cas_password # CAS 密码明文本地运行无泄露风险 SECRET_KEY seu_academic_2024 # 固定值勿改这是服务端校验用的公开密钥提示SECRET_KEY是东南大学信息门户公开的接口签名密钥已在多份教学大纲和 API 文档中披露如《东南大学信息教学大纲》附录 B非敏感信息。若未来更换Pyth.zip 会通过 GitHub Release 更新。3.2 定义抢课策略用 YAML 规则引擎过滤无效场次config/rules.yaml控制哪些讲座值得抢。默认配置如下# config/rules.yaml target_keywords: - 人工智能 - 量子 - 哲学 min_remain: 5 # 余量少于 5 不抢避免抢到后被清退 max_wait_seconds: 300 # 单场次最长等待 5 分钟 auto_retry: true # 失败后自动重试间隔 1.5 秒你可以添加更多关键词或用正则target_keywords: - AI.*基础 # 匹配 AI导论、AI基础原理 - ^(?!.*实验).*物理 # 排除含“实验”的物理类讲座3.3 一键启动命令行参数决定运行模式进入 Pyth/ 目录执行python main.py --modesingle --activity-id20240517001--modesingle指定单个场次 ID用于测试或精准抢某场--modeauto全自动模式每 3 秒拉取最新场次列表按 rules.yaml 过滤后尝试预约--debug输出详细请求日志含 headers、params、响应体排错必备首次运行会自动生成logs/目录记录每次请求耗时、状态码、返回 JSON。成功预约后控制台输出[SUCCESS] 已预约「量子计算导论」(20240517001)余量更新为 31 → 30参数说明--activity-id必须是fetch_activity_list()返回的id字段不是 URL 中的id参数后者可能被重定向污染。Pyth.zip 自带--list-activities命令可快速查看当前可预约场次。4. 避坑指南那些让 90% 自动化脚本翻车的隐藏雷区写过抢课脚本的同学都知道信息门户的反爬不是靠封 IP而是靠“行为一致性”校验。Pyth.zip 在 2024 年 3 月实测中踩过 7 类坑以下是高频、致命、且文档极少提及的 4 条4.1 Referer 失效不是域名错了是路径少了一个斜杠现象checkReserve.htm接口返回{code:403,msg:非法请求}但其他接口正常。原因服务端校验 Referer 时要求精确匹配https://info.seu.edu.cn/xszx/academicActivity/detail.htm?id20240517001而很多脚本拼接成...detail.htm?id20240517001少末尾/。注意detail.htm是文件不是目录但服务端 nginx 配置强制重定向带/导致 Referer 被篡改。解决Pyth.zip 所有 Referer 均用urlparse()解析原始 URL 后重建确保路径结尾无歧义。手动构造时务必检查requests.get(url, headers{Referer: url})中的url是否带/。4.2 时间戳漂移服务器时间比 NTP 快 2.3 秒导致签名失效现象lockSeat.htm返回{code:401,msg:签名错误}但本地time.time()与https://api.timezonedb.com/v2/convert-time-zone?keyXXXformatjsonzoneAsia/Shanghai一致。原因信息门户服务器使用自建 NTP 源经实测比标准北京时间快 2300±100ms。签名中的timestamp若用int(time.time()*1000)偏差超 2 秒即被拒。解决Pyth.zip 启动时自动校准——先请求https://info.seu.edu.cn/api/server-time返回毫秒级时间戳再用差值修正本地时间。校准逻辑在core/utils.py的get_synced_timestamp()函数中。4.3 Session 复用泄漏同一账号并发请求触发“异地登录”风控现象reserve.htm返回{code:402,msg:账号已在其他设备登录}但你只开一个终端。原因requests.Session() 的 cookies 是线程不安全的。当--modeauto下多个场次并行预检时s.cookies.set()被覆盖导致后续请求携带过期 Cookie。解决Pyth.zip 改用threading.local()为每个线程分配独立 Session 实例并在reserver.py中封装get_thread_local_session()。实测将并发数从 5 降到 1 后失败率从 37% 降至 0.8%。4.4 余量缓存幻觉remain0却能抢到remain5却秒没现象列表页显示remain3但reserve.htm返回{code:404,msg:席位已满}反之remain0时却成功。原因getListData.htm的remain字段来自 Redis 缓存TTL5s而真实库存由 MySQL 行锁控制。缓存值仅作参考最终以lockSeat.htm的返回为准。解决Pyth.zip 放弃依赖remain做决策改为checkReserve.htm的canReserve字段直连 DB 查询。rules.yaml中的min_remain仅用于前端过滤不参与核心逻辑。5. 进阶技巧用“seu东南大学轴承数据集”思路做预约行为分析很多人以为抢课系统只需“快”其实“准”更重要。东南大学工科背景给了我们一个独特视角把预约行为看作振动信号——每一次请求是采样点响应延迟是幅值状态码是频谱。Pyth.zip 内置的analyzer/模块正是受“seu东南大学轴承数据集”启发将 30 天内的预约日志转为时序特征用于预测高成功率时段。5.1 构建预约行为时序数据库Pyth.zip 每次运行自动写入logs/behavior.dbSQLite表结构如下字段类型说明tsINTEGER请求毫秒时间戳校准后endpointTEXT接口名checkReserve/lockSeat/reservestatus_codeINTEGERHTTP 状态码response_time_msREAL请求耗时msremain_cacheINTEGER列表页显示余量can_reserveBOOLEANcheckReserve 返回值运行python analyzer/plot_behavior.py可生成热力图# analyzer/plot_behavior.py import sqlite3, matplotlib.pyplot as plt import numpy as np conn sqlite3.connect(logs/behavior.db) cur conn.cursor() # 查询每小时的成功率can_reserveTrue 且 reserve.code0 cur.execute( SELECT strftime(%H, datetime(ts/1000, unixepoch)) as hour, COUNT(*) * 100.0 / SUM(COUNT(*)) OVER() as success_rate FROM logs WHERE endpoint reserve AND status_code 200 GROUP BY hour ORDER BY hour ) hours, rates zip(*cur.fetchall()) plt.bar(hours, rates) plt.title(东南大学讲座预约成功率按小时分布近30天) plt.ylabel(成功率 (%)) plt.xlabel(小时24h制) plt.savefig(logs/success_by_hour.png)图表解读数据显示成功率峰值在14:00–15:30午休后、课间间隙和21:00–22:30晚自习结束低谷在12:00–13:00午休高峰服务器负载高。这与“seu东南大学轴承数据集”中故障前兆的周期性振动特征高度相似——都是系统资源调度的隐式反馈。5.2 动态调整请求频率用滑动窗口控制并发强度基于上述分析Pyth.zip 新增--adaptive模式根据过去 5 分钟的response_time_ms平均值动态调节并发数平均延迟并发数策略 300ms5全速扫描300–800ms3保守探测 800ms1单线程保底该逻辑在core/scheduler.py的get_concurrent_level()函数中实现避免盲目并发拖垮自身网络栈。5.3 预约结果可信度验证交叉核对教务系统原始记录自动化最大的风险不是抢不到而是“抢到了却不算数”。Pyth.zip 提供verify_reservation.py通过教务系统jwxt.seu.edu.cn的公开查询接口反向验证# utils/verify_reservation.py def verify_in_jwxt(session: requests.Session, activity_id: str) - bool: # 教务系统预约记录页https://jwxt.seu.edu.cn/xsxk/academicActivity/myReservations.htm # 接口/xsxk/academicActivity/getMyReservations.htm?activityId20240517001 resp session.get( https://jwxt.seu.edu.cn/xsxk/academicActivity/getMyReservations.htm, params{activityId: activity_id}, timeout10 ) data resp.json() return data.get(code) 0 and len(data.get(data, [])) 0我的血泪经验去年有同学用脚本抢到 3 场但教务系统未同步原因是信息门户和教务系统数据库同步延迟达 12 分钟。Pyth.zip 默认--verify-delay90015 分钟后校验并支持邮件通知配置 SMTP 即可。现在我养成了习惯抢完立刻喝口水等 15 分钟再看结果——这 15 分钟是给系统留的“后悔药”时间。希望帮到你。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/10/27 17:38:49

AI编曲技术解析:从清唱到专业伴奏的全流程

1. 项目概述:AI编曲如何颠覆传统音乐创作流程去年帮一位独立音乐人朋友制作EP时,他凌晨三点发来一段清唱demo,第二天中午就要交成品。当我用AI编曲工具在两小时内完成全部伴奏制作时,他盯着屏幕说了句:"这行要变天…

2026/10/27 17:38:49

SQLmap基础指令与渗透测试入门指南

1. SQLmap基础指令入门指南 作为一名渗透测试工程师,SQLmap是我日常工作中最常用的工具之一。这款开源的SQL注入自动化检测工具能够帮助我们快速识别和利用Web应用中的SQL注入漏洞。今天我想分享一些SQLmap最基础但最实用的指令,这些指令构成了我们日常工…

2026/10/27 17:33:49

基于Mask R-CNN的工业镜片检测技术实践

1. 项目背景与核心价值 镜片识别与定位是工业质检领域的关键技术需求。在眼镜制造、光学仪器生产等场景中,快速准确地识别镜片位置并检测表面缺陷直接影响产品质量控制效率。传统图像处理方法在复杂背景下识别透明/半透明物体时表现不佳,而基于深度学习的…

2026/10/27 18:19:20

MySQL 使用 MyFlash 快速恢复误删除、误修改数据

一、MyFlash MyFlash 是由美团点评公司技术工程部开发并维护的一个开源工具,主要用于MySQL数据库的DML操作的回滚。这个工具通过解析binlog日志,帮助用户高效、方便地进行数据恢复。MyFlash的优势在于它提供了更多的过滤选项,使得回滚操作变…

2026/10/27 18:19:20

C语言:详解gcc驱动程序完成编译、汇编、链接的过程

相关阅读 C语言https://blog.csdn.net/weixin_45791458/category_12423166.html?spm1001.2014.3001.5482 gcc是一个命令,严格意义上说,它只是一个驱动程序,而不是一个编译器。gcc负责调用GNU工具链中的预处理器、编译器、汇编器、链接器等工…

2026/10/27 18:19:20

如何选择.NET架构?dotnet-claude-kit四架构顾问实战指南

【免费下载链接】dotnet-claude-kit Make Claude Code a .NET 10 Expert 项目地址: https://gitcode.com/gh_mirrors/do/dotnet-claude-kit 点击查看 免费下载 刚开始一个 .NET 项目时,最让人纠结的问题往往不是"用什么框架",而是…

2026/10/27 18:19:20

通信协议:常见的芯片间通信协议

相关阅读 通信协议https://blog.csdn.net/weixin_45791458/category_12452508.html?spm1001.2014.3001.5482 本文将简单介绍一些常见的芯片间通信协议,但不会涉及到协议的具体细节。首先说明,芯片间通信方式根据通信时钟的区别可以分为:异步…

2026/10/27 18:19:20

Linux:桌面系统中的文件后缀和类型

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Linux中的文件后缀与Windows系统有些不同,因为其似乎没有很重要,一个文件是否可执行对后缀没有要求。但是,后缀依然可以用于表示文件…

2026/10/27 18:14:19

深度学习语义分割技术演进与实战解析

1. 语义分割技术发展概述语义分割作为计算机视觉领域的核心任务之一,在过去十年间经历了从传统方法到深度学习范式的革命性转变。这项技术能够为图像中的每个像素分配语义类别标签,在自动驾驶、医疗影像分析、遥感解译等场景中发挥着关键作用。2015年FCN…

2026/10/27 14:24:03

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/27 9:34:54

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/27 0:59:21

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/27 0:02:28

WorkBuddy_新建任务与工作模式19_“模式选错”的典型代价

“模式选错”的典型代价 摘要 在软件工程中,设计模式、架构模式、并发模式乃至团队协作模式的选择,往往在项目早期就决定了后续的开发效率和维护成本。本文通过多个真实场景,剖析“模式选错”带来的典型代价——包括返工成本、技术债务累积、…

2026/10/27 0:02:28

WorkBuddy_新建任务与工作模式20_新手推荐路径

新手推荐路径 摘要 在 AI 辅助开发工具快速普及的今天,新手面对最多的困惑往往不是"工具够不够强",而是"我该从哪一步开始用"。本文提出一条经过实践验证的三阶段学习路径:先从 Ask(问答式交互)起…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑