PKU Auto Reservation
鉴于暑假预约入校过于火爆,便有了这个小工具来提高成功率。
由于 2FA 的存在,这个流程无法自动化,只能半自动化完成,故你仍然需要在零点准时守在电脑前。
这个工具现已彻底自动化了所有网络请求,包括 2FA 验证。
功能
- 🚀 全自动/半自动预约入校申请
- 🤖 允许无额外服务器的情况下自动化输入验证码
- ⏰ 零点定时提交申请,再无需上演速度与激情
- 📢 Bark 通知,包括半自动模式时提前半分钟通知准备输入、通知申请结果
简要上手教程
- 复制
config-sample.yaml
为config.yaml
,并填写其中的信息 - 安装依赖:
pip install -r requirements.txt
- 运行
python main.py
自动化输入验证码
自动化输入验证码需要设置 config.yaml
中的 auto
配置项为 true
由于作者设备所限,只给出 iOS 版本的方法。安卓的权限管理更为宽松,应当不难实现类似功能。
注意,彻底自动化需要 iOS 17 及以上版本,因为立即执行(而无需再手动点击)是 17 出的新功能。
首先,请解绑手机北京大学 APP 我的 - 手机令牌
,因为我们无法自动化获取 TOTP 令牌来完成验证,取而代之的是使用短信验证码。
为了使得服务器获得短信验证码,我们需要使用 快捷指令
来将短信内容发送到服务器。
本仓库提供一个示例自动化脚本,你可以有自己的实现,但是大致思路应当相同:
- 本仓库程序运行后,会自动请求验证码,并进行等待
- 使用 iOS 快捷指令提供的自动化功能,当收到含有关键字
北京大学
的短信时,自动发送 POST 请求到你私有部署的 HTTP 服务器 - 你的 HTTP 服务器收到请求后,通过一些手段,将内容写入本仓库根目录下的
code.txt
文件中 - 本仓库程序检测到
code.txt
文件中有内容后,会自动使用正则表达式提取验证码,并清空code.txt
文件以避免复用,然后继续运行完成 2FA 验证
示例自动化快捷指令
快捷指令各步骤搜索关键字:
- 信息
- 新建空白自动化
- 如果
- 设定变量
- 获取 URL 内容
示例 HTTP 服务器
参见 server-example.py
,记得修改其中的 code.txt
路径与头部信息鉴权。
对于 Nginx 服务器部署、SSL 证书自签与反向代理,超出了本仓库的范围,在此不再赘述。
无额外服务器
如果你没有额外的服务器或者域名,那么也可以如下操作:
- 确保零点的时候你的电脑和手机位于同一个局域网下并都保持开机
- 修改 HTTP 服务器的侦听 Host 为
0.0.0.0
- 在手机的自动化快捷指令上使用
http://<你的电脑局域网 IP>:<端口>
来访问电脑上的 HTTP 服务器并提交验证码
macOS 的局域网 IP 可以通过如下命令获取:
ifconfig | grep "inet " | grep -v 127.0.0.1 | awk '{print $2}'
Windows 的局域网 IP 可以通过如下命令获取:
ipconfig | findstr IPv4
Ubuntu 的局域网 IP 可以通过如下命令获取:
hostname -I
假设获取到的电脑局域网 IP 为 192.168.31.75
,那么示例代码如下:
server-example.py
...
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
快捷指令(注意此时因为没有 SSL 证书,协议是 HTTP 而不是 HTTPS)
自动获取验证码效果
半自动化输入验证码
半自动化输入验证码需要设置 config.yaml
中的 auto
配置项为 false
半自动化输入验证码会在需要输入验证码时,调用 input()
函数来获取你手动输入的验证码。
如果你配置了 Bark,那么程序会尝试在需要输入验证码时提前半分钟通知你准备输入(不足半分钟则立即通知)。
测试结果
燕园
新燕园
免责说明
- 本项目仅提供自动预约入校申请功能,节省同学时间,让广大同学拥有与黄牛的一战之力。
- 因网络环境问题,不保证申请成功。
- 仅供学习交流使用,申请信息如果与事实不符可能会带来不必要的麻烦。
- 本仓库严禁用于任何商业用途!!!