爬虫应用——“我去图书馆”公众号脚本抢座原理

图书馆自习室座位太难抢了 !

2021-09-08 更新

时代变了!《我去图书馆》大更新,详情见GitHub链接。
https://github.com/xiaocinchen/rob_the_seat

前情提要

因为要考研而且图书馆自习室座位很难抢,很早就有过用脚本抢座的打算。之前有试过使用autojs进行按键的模拟,但觉得效率一般而且不够灵活。也有考虑过仔细研究一下它的前端,但觉得很花时间但我又很懒,所以就一直没有后续。直到前天一个同学给我发了一篇关于《“我去图书馆”公众号代码抢座的实现》的知乎文章(该文章已404),深受启发。感谢文章作者并在此对其介绍方法进行修正和补充。感谢@宅梁丶共同开发解决问题。

原理简述

抢座这个功能,实质上是通过前端发送get请求给后端处理实现的。通过抓包工具可以发现,这个get请求的http报文大概是这样的。

userAgent = 你的userAgent
cookie = 你的cookie
referurl = "https://wechat.v2.traceint.com/index.php/prereserve/layout/libid={所抢自习室编号}.html&{学校编号}"
        headers = {
            'Accept': 'application/json, text/javascript, */*; q=0.01',
            'X-Requested-With': 'XMLHttpRequest',
            'User-Agent': userAgent,
            'Sec-Fetch-Mode': 'cors',
            'Sec-Fetch-Site': 'same-origin',
            'Referer': referurl,
            'Accept-Encoding': 'gzip, deflate,br',
            'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
            'Cookie': cookie
        }

(所抢自习室编号和学校编号可以使用抓包工具获得)
然后将这个报文用get方法发送到这个url

url="https://wechat.v2.traceint.com/index.php/prereserve/save/libid={所抢自习室编号}&"+ randomNum +"=" + seat + "&yzm="

其中有两个参数

  • randomNum。它是一串随机的字符串,例如:7Zn7xhW3QRCkj
  • seat。即你想抢的座位的坐标。

先说randomNum,通过几次试验发现,这串随机字符串每次都会改变。于是去寻找它的来源,最终在明日预约页面的html码中发现了生成随机字符串的js文件。该页面链接大概是这样的

https://wechat.v2.traceint.com/index.php/prereserve/layout/libid={所抢自习室编号}.html&{学校编码}

生成随机字符串的js文件是引用的js中的倒数第二个,大概长这样:

https://static.wechat.v2.traceint.com/template/theme2/cache/layout/{一串随机字符串}.js

点开之后发现它生成随机字符串有两种规则,并且应该是随机选取规则。

但是我们没有必要去探究它的具体算法,我们直接执行它就好了!(使用python execjs模块)

当然直接执行是不行的,我们需要对它进行修改。仔细观察发现它内含了ajax的发送,我们把这部分以及T函数的部分删掉(就是把执行不了的地方删了!),直接返回reserve_seat()的结果就行了!

接下来是seat,即座位的编号。这个很简单,只要进入设置常用座位的界面,然后看一下源码就行了。找到你想要预定的座位div里的data-key。例如:5,26

于是构造完http报文然后提交get请求就可了!

(至于截胡,把url里的preserve改成reserve即可)

具体流程

欢迎评论点赞!

4 thoughts on “爬虫应用——“我去图书馆”公众号脚本抢座原理

  1. 老哥您好,我想请问明日预约的验证码该怎么处理呢?我也写了一个码,可惜我们学校明日预约需要验证码,抓包看是在js获取那一步,可惜技术不到家,希望得到您的帮助!祝您生活愉快!

    1. 你是获取不了验证码还是处理不了验证码?获取验证码需要去抓包看接口,前端从哪个接口获取的验证码图片。拿到验证码后需要深度学习来识别,得自己制作数据集。

  2. 老哥你好,请教一下,针对cookie失效的问题,有办法解决吗,能够永久保活吗

发表评论