这是一个基于 Selenium 和 PyQt5 的图形化自动化脚本,旨在帮助用户实现 健身房 和 羽毛球馆 的预约。用户可以通过图形界面进行配置,并在预设的时间自动完成场馆的预约操作。
此项目原理是搜索对应网页元素并点击(简称赛博连点器),无法向服务器直接发送POST请求,如果网络环境较差或服务器繁忙,则有极大可能预约失败。
本脚本不保证一定能抢到,请根据自身情况使用
健身房的预约时间固定在 每日中午 13:00,恰好与两位开发者的午休时间重叠。每次午休醒来,预约名额早已被抢空,带来了极大的不便。因此,我们决定开发一款自动化预约工具,减少人为操作的麻烦,提高预约成功率。
与此同时,开发者的朋友们喜欢 羽毛球运动,但由于预约人数众多,场地经常被抢空。为了让大家都能更轻松地约到球场,我们在项目中增加了 羽毛球馆预约功能,试着一并解决这个长期困扰大家的问题。
本项目提供了可执行文件版本,便于用户直接运行。如果是第一次运行,建议先选择 游泳馆测试健身房的预约 和 乒乓球 测试羽毛球的预约。
日志文件会保存在 log.txt 中,便于用户查看程序的运行情况和调试信息。
羽毛球和健身房的预约分别定时在12:00和13:00自动执行,请保持电脑开启,防止程序被杀后台
如果程序运行时窗口被隐藏且没有命令行可用,可以通过以下方式关闭程序:
-
任务管理器:
-
Ctrl + Shift + Esc打开任务管理器。
-
找到 python.exe 或者Chromemain.exe进程
-
结束进程。
-
或者不用关也行,小脚本对内存占用较低
-
-
验证码基于adddocr识别,有识别错误概率
-
测试程序运行开始时,请不要操作,程序会自动停止并写入日志信息到log.txt
-
目前没有写如果 预约时间段被老师占了怎么办 的逻辑,所以大家定时前建议先去看看时间段是否有效
-
目前仅支持谷歌浏览器,版本兼容暂不确定,测试环境chrome浏览器主版本号134能跑通
如果你不想使用打包版本,可以通过以下步骤进行源码运行:
-
克隆仓库:
git clone https://github.com/script-develop/XMU_Reservation-script.git
-
安装依赖:
pip install -r requirements.txt
-
配置环境:确保你已经安装了 Selenium 和 PyQt5 等依赖包。
-
运行程序:
python Chromemain.py
本项目由 @jadeproheshan 和 @NEO-114514共同开发
欢迎大家提出改进建议和贡献代码!如果你有任何问题或发现 bug,请在 GitHub 上提交 issue 或直接创建 Pull Request。 下一步迭代计划放在文档最后,欢迎大家提交PR
本项目实现了一个智能化的配置和预约管理模块,主要由以下三个核心部分组成:
-
配置模块:用于图形界面的展示和配置管理。
-
驱动初始化模块:负责浏览器驱动的初始化。
-
预约模块:根据用户的需求进行预约操作。
配置模块由两个主要文件组成:
-
configui.py:负责图形界面展示,基于
PyQt5实现。-
功能:
-
提供用户交互界面,支持输入框、下拉菜单、按钮等组件。
-
通过
exec()方法返回窗口的关闭状态,并触发退出逻辑。 -
interact()方法连接用户界面和程序逻辑,更新配置。
-
-
代码示例:
def interact(self, callback1, callback2): self.confirm_button.clicked.connect(callback1) # 与逻辑中的 confirm 绑定 self.type_combo.currentIndexChanged.connect(callback2) # 与更新时间选项绑定
-
-
configlogic.py:负责业务逻辑操作,继承自
PyQt5父类。-
功能:
- 读取和保存配置数据,配置通过
config属性传递给主程序。
- 读取和保存配置数据,配置通过
-
交互:
confirm()方法负责处理用户输入并保存配置数据。
-
该模块用于简化主函数逻辑,主要功能包括:
-
初始化浏览器驱动,并通过
chrome_options配置浏览器选项。 -
使用
webdriver-manager自动安装和管理浏览器驱动。
代码示例:
chrome_options = Options()
chrome_options.add_argument('--ignore-certificate-errors')
chrome_options.add_argument('--ignore-ssl-errors')
chrome_options.add_argument('--acceptInsecureCerts')
chrome_options.add_argument('--start-maximized') # 启动时最大化窗口
os.environ['WDM_SSL_VERIFY'] = '0'
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=chrome_options)-
登录模块:模拟用户登录到指定的场馆预约平台,填写用户名和密码,点击登录按钮。
-
代码示例:
driver.get("http://ids.xmu.edu.cn/authserver/login?type=userNameLogin&service=http%3A%2F%2Fcgyy.xmu.edu.cn%2Fidcallback")
-
-
预约模块:分为简单预约和复杂预约两类,适配不同场馆的预约需求。
-
简单预约:通过
Selenium模拟点击完成预约。 -
复杂预约:对于需要验证码的场馆,使用
ddddocr库进行验证码识别,并模拟日期选择等操作。
-
验证码识别:通过 ddddocr 库进行验证码识别,设置最多 5 次识别尝试。
代码示例:
from ddddocr import DdddOcr
ocr = DdddOcr()
result = ocr.classification(image_path)-
支持不同浏览器:目前仅支持 Chrome 浏览器,未来计划支持其他浏览器,如 Edge。
-
细化预约功能:进一步优化预约功能,支持更多场馆的预约需求。
-
优化参数配置:将内部硬编码的参数改为配置文件,增强扩展性。
-
提高效率:通过 Cookie 和本地缓存提高登录和预约效率。
-
优化复杂预约算法:提高复杂预约的成功率,尤其是在高并发情况下。
-
封装验证码处理:将验证码识别封装为独立模块,提高代码复用性。
-
优化打包策略:分析并优化打包策略,减少不必要的依赖,确保生成的文件体积小且高效。
-
后台进程管理:改善后台脚本管理,避免程序被意外终止。