鉴于游泳馆预约平台已经更换,本文所述方法已失效。

最近天气逐渐变热,同学们对中区游泳池的需求量越来越大,票一放出来,没多久就抢完了,没点手速还真抢不过。因此,我决定深入研究一下购票系统,看看能不能写个脚本。

这回用到的软件还是Charles,配置方法见前面的一篇文章。下面直接开始抓包。

将手机连上Chalres代理,登录购票系统,随便找一张票,选定日期,点击“提交订单”,进入了“订单详情”页面,等待几秒后,点击“我已阅读并同意此协议”,此时,Charles抓到了一条我们需要的数据包:


这是条Post请求,向https://yuyue.ustc.edu.cn/client/easyserpClient/ticket/freeBuyTicket发送了一个表单,表单内容为:

参数 说明
ticketInfo 票务信息(包含id与价格)
token 一个疑似用于身份认证的字符串
shopNum 经测试为常量
useDay 日期(%Y-%m-%d)

经分析,表单参数ticketInfo中的tickedId的值与场次数相关,每天的第n场对应的ticketId为n+1(虽然不知道为什么要这么搞)。

拿到接口,我立刻用Postman试了一下,发现这个接口除了token外,确实不需要其他任何身份信息。另外我还发现前面的所有其他数据包都是不必要的过场,只要调用上面这个接口,就可以直接购票。那么我们只要获取token就可以了。更重要的是,该token是一个由微信号唯一确定的固定值,不会过期,因此可以一劳永逸。

然而,我发现这个token的获取并不容易。经我研究,它应该是和微信号绑定的,而非我们学校的身份认证系统,这是因为在登录身份认证系统之前,就已经抓到包含token的数据包了。最终通过token购得的票,会进入上一次使用该token进行登录的科大帐号下(感觉这种操作有点奇怪hhh)。

这里我还没有登录科大身份认证系统,但已经在数据包中发现了我的token

这里要获取token需要拿到一个临时code,而这个code,应该是通过wx.login拿到的。我没有搞过微信这套东西的逆向,因此暂时把这个问题搁置了。

总之,只要拿到了自己的token,就可以长期为自己爬票了,多是一件美事啊!

最后,我发现useDay这个参数可以随便改,这样我们就可以绕过前端,提前预约到任意日期的游泳票了,比如这样:


成功爬到一张5月30号的票(逃


有一说一,学校的系统仍需改进啊。