Skip to content

TheFunny233/NJUGymsReservationHelper

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

NJUGymsReservationHelper

呢喃抢场妙妙脚本 这是一个基于 Python 的呢喃体育场馆自动抢场脚本。它结合了 Selenium (用于处理复杂的登录和 Cookies 获取) 和 Requests ( 用于高效的数据抓取和订单提交),支持定时任务、自动打码、滑块验证、自动同伴补全以及 Server酱消息推送。

✨ 主要功能

  • 自动登录: 使用 Selenium 模拟浏览器登录统一身份认证系统,自动识别图形验证码(基于 ddddocr)。
  • 定时任务: 内置调度器 (schedule),支持每天特定时间(脚本默认设置成 07:58)自动唤醒登录,并阻塞等待至 08:00 准时抢场。
  • 自动滑块验证: 集成 ddddocr 识别滑块缺口,并使用 AES 加密生成位置数据通过验证。
  • 智能选场: 支持设置优先时间段,如果首选被占,支持灵活模式自动寻找当天其他空闲场次。
  • 同伴补全: 如果指定的同伴人数不足,脚本会自动从账号的同伴列表中按顺序补充(具体顺序由返回值决定)。
  • 消息推送: 抢场结果支持通过 Server酱 推送到微信/手机。

🛠️ 环境准备与安装

请确保你的电脑的 ** 3.8 ≤ Python ≤ 3.12** ,并安装了 Google Chrome 浏览器。

安装依赖

在项目根目录下,运行以下命令安装所需的 Python 库:

pip install -r requirements.txt

📖 使用方法

第一步:获取场馆与项目 ID

在配置脚本前,你需要知道你想抢的项目ID(例如苏州校区网球场的ID)。有两种方法获取:

方法 A:运行辅助函数查看 (推荐)

  1. 打开 main.py,滑到最底部的 if __name__ == "__main__": 区域。
  2. 取消注释 print_parsed_gyms_data(campus_filter="苏州校区") 这一行。
    • 如果你想查看所有校区的场馆,直接使用 print_parsed_gyms_data() 即可。
    • 一般来说体育场馆的更新很缓慢,如果那天苏州校区更新了新的体育场所,但是本地缓存没有,可以运行更新缓存的所有体育场馆,取消注释 更新缓存的所有体育场馆: 的下面几行代码,同样注意配置好用户名和密码
    # 更新缓存的所有体育场馆:
    # USERNAME = "241880000"
    # PASSWORD = "password"
    # url = "https://authserver.nju.edu.cn/authserver/login?service=https://ggtypt.nju.edu.cn/venue/login"
    # session = login(url, USERNAME, PASSWORD)
    # if session:
    #     sort_all_campus_venues_data(session)
    
  3. 运行脚本:
    python main.py
  4. 控制台会打印出树状结构的场馆信息,找到你想要的项目 ID (例如 171)。

方法 B:自己查看本地缓存文件 查看 parsed_gym_data.json 文件。你可以直接打开这个文件,搜索场馆名称(如“羽毛球”),找到对应的 id 字段。

第二步:修改配置参数

打开 main.py,修改底部的用户配置区域:

if __name__ == "__main__":
    # === 用户配置 ===
    USERNAME = "YOUR_STUDENT_ID"  # 你的学号/工号
    PASSWORD = "YOUR_PASSWORD"  # 统一身份认证密码

    TARGET_ID = 171  # 目标项目ID (通过第一步获取,如 171)
    TARGET_BUDDIES = ['114514', '...']  # 指定同伴的学号/ID (如果没有同伴需求或者你不知道你的同伴ID,填 [],但是请你手动在系统上把你的同伴先添加好,脚本才能选择)
    PRIORITY_TIMES = ["19:00", "20:00"]  # 优先抢的时间段的起始时间 (如果不指定,填 [])
    IS_FLEXIBLE = True  # True: 优先时间段满了抢其他的; False: 只抢优先时间段
    SERVER_API = ""  # Server酱的推送API (不需要推送则留空)

    # ...

第三步:启动挂机

配置完成后,直接运行脚本:

python main.py
  • 控制台显示 "📅 计划每天 07:58 自动唤醒..." 即表示启动成功。
  • 请保持电脑唤醒状态(不要休眠),脚本会在设定时间自动执行登录、等待和秒杀流程。

📝 To-Do List

  • 提高鲁棒性: 增加异常重试机制(如登录失败自动重试、网络超时重连),进一步优化滑块验证的通过率。
  • 移除 Selenium: 目前登录依赖 Selenium 获取 Cookies,速度较慢且消耗资源。计划通过逆向 JS 加密(密码加密与验证码逻辑),实现纯 Requests 协议登录,大幅提升启动速度。
  • 云端部署适配: 经测试发现场馆预约接口无需校园网环境,计划将脚本迁移至 GitHub Actions腾讯云 Serverless (云函数) 平台,实现零成本、免运维的云端自动抢场。
  • 配置文件分离: 将用户配置从代码中分离到 config.yaml.env 文件中,避免代码中硬编码敏感信息。
  • 多线程支持: 引入线程池,支持同时监控多个场馆。

⚖️ 免责声明

  1. 仅供学习交流: 本项目初衷是用于学习 Python 网络爬虫与自动化测试技术,请勿用于任何商业用途。
  2. 遵守规则: 请使用者遵守学校相关规章制度,合理使用公共资源。
  3. 风险自担: 使用本工具产生的任何后果(包括但不限于账号封禁、预约失败等)由使用者自行承担,开发者不承担任何责任。

About

南京大学抢场妙妙脚本

Resources

License

Stars

2 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages