复旦、华师、西交等图书馆座位自动预约脚本支持多所高校
【多所学校均适用】图书馆空间预约系统自动预约脚本 | Java | 座位预约、研讨间预约;抢座快人一步
【复旦大学研讨间 复旦大学座位预约 华东师范大学座位预约系统 六盘水师范学院座位预约系统 西南交通大学座位预约系统 新疆农业大学座位预约系统】
根据盛卡恩官网介绍,上述高校均使用了他们的座位预约系统。其实还有很多其他学校也是,可以看看你们学校的座位预约系统是是不是下面这样的:
或者可以简单抓包你们预约的请求,看是不是有的请求有 "https://www.skalibrary.com"。
如果满足上面条件的话,基本上确定是盛卡恩系统了。
基本的功能都满足了:
- 单个座位预约
- 多个座位遍历,防止某个座位被抢(比如其他人也用了脚本,也占了你想要占的座位)
- 随机选择一个座位占座(需要预先配置好座位 id 数组,没写,但是很简单)
说一下进阶的功能:
- 每次随机选择一个座位预约,防止有的同学看你每天都在同一个座位,觉得你是每天守着时间点抢座的(我已经感受到了,每天对面坐着同一个小妹子,怕日子久了出问题)
- 每天早上定时开始预约座位,抢先一步,不用定闹钟早起抢座,享受优质睡眠和优质座位
还有更进一步(这个不提供接口,因为比较冒险,不过肯定可以就是了,感兴趣的可以自己试试):
- 脚本签到,与临时签离结合使用,临时离开时间可以自由续杯
- 根据学号查询其他同学在馆状态,可惜还不能查到具体的座位信息
- 获取所有预约历史(目前系统只允许用户获取最近 10 条),在过年的时候做一个图书馆座位预约报告,舒服的一批
请勿滥用,仅供交流学习~,使用时请遵守学校相关的规章制度,管理条例!
脚本地址:https://github.com/quarkape/ecnu-lib-auto-book.git
接下来开始抓包分析预约过程(以华东师范大学图书馆预约系统为例):
老规矩,还是先抓包,用到了 fiddler。具体来说就是电脑和手机连接 wifi 并保证处于同一局域网下。然后手机修改 wifi 的配置,手动配置主机地址和端口号,由 fiddler 代 {过 }{ 滤} 理即可开始抓包。
亲测,在电脑上打开公众号网页没用,会检测到非手机端微信,所以只能用此方法。
好了,开始抓包。我一般都是先在手机上把关键的操作做一遍,然后一条一条的分析每个请求的作用。
第一个请求,从 url 可以看到请求函数为 login,可以大胆推断这个请求就是用户登录。因此简单分析请求头、请求体和请求方法即可。这个不难,代码如下:
注意,上述代码返回 hashmap,是因为里面的参数在最后的预约请求中要用到。
- 第二个请求,请求函数是 addUser,请求体里面也包含了学号等信息,但是域名不是学校的了,是一个第三方的域名,我查了一下,应该是上海盛卡恩智能系统有限公司。我猜测这个请求可能与闸机有关?没有测试过这个请求到底有没有实际作用,但是保险起见还是必须要加上的。因此,第二段代码为:
- 第三个请求,请求函数是 area,响应体正文中说明了是获取图书馆区域信息的。如果我们想要进一步写一个第三方的工具,用户注册,选择座位,我们帮用户自动预约的话,这个接口可以帮助用户自助选择座位。因为对于我来说,我想要预约的位置还是比较固定的,只需要固定位置的 id 即可预约,所以这个接口对于我来说暂时没有作用,这里不贴代码。完整代码可以 github 项目地址。
- 第四个请求,请求函数是 space_days,由响应体的正文内容也可以看到,这个请求是获取可预约时间日期的。发送这个请求只会返回今明两天的日期,所以理论上来说,想要提前预约两天后的座位是不可能的了。最后的预约请求不会用到这个参数。
- 第五个请求,请求函数是 space_time_buckets,从响应体正文来看,是获取可预约时间段。发送这个请求会返回当前请求时间 -23:50。也就是说可预约时间段是此刻到晚上 11 点 50。这个截止时间基本不会变,但是开始时间是此刻。这个请求返回的两个参数对于最后的预约是有用的,于是代码如下:
- 第六个请求,请求函数是 spaces_old,作用是获取座位预约信息,比如是否被预约等等。
- 第七个请求,请求函数是 spaces,作用是获取空间信息。
- 第八个请求,请求路径是 profile/books,根据返回内容来看,是获取用户的预约历史。只能传入 token 和用户名两个参数。因此估计这个请求只能够获取一定范围内的预约历史。如果能够获取更多预约历史的话,或许可以做一个可视化的展示等等。
- 第九个请求,终于来到了预约座位了。请求地址中需要包含座位 id,所以之前的座位 id 需要提前保存。除此之外,还包括了很多其他的参数,代码如下:
- 还有一个请求是很有用的,那就是登出用户。用户登陆之后获取一个 token,有效期只有两三个小时。如果登录之后再登录会提示重复登陆。因此有必要先登出,再登录,每次请求都保证能够获取到最新的 token。
- 最后说一下完整的预约流程:首先登出当前用户,然后登录获取 token,再向 skalibrary 写入信息,然后请求预约时间,得到一些参数,再根据这些参数预约座位即可。代码如下:
在上述代码中,我还加入了发送邮件的功能。