前言

由于准备考研,这学期我基本都是泡在图书馆学习了,图书馆二楼的自习室的位置需要每天预约,但是图书馆的插座有限,只有部分位置有插座,因此有些靠近插座的位置需要每天提前预约。于是我萌生了写一个自动预约座位程序的想法。

流程


预约部分

首先通过工具抓包图书馆预约页面的相关接口。抓包的方法我不再赘述,前面写过一篇文章利用Charles进行抓包使用教程(一)

模拟登陆,提交信息,发送预约情况到微信。

  • get访问登录页面,获取cookie和表单里面的隐藏code和str字段
  • 利用python实现图书馆自习室自动预约及签到功能-秋名山の纸飞机
  • 构造登录post数据,加入从表单里面拿到的隐藏两个字段
  • post构造后的数据,模拟登录,激活cookie
  • 利用python实现图书馆自习室自动预约及签到功能-秋名山の纸飞机
  • post预约请求,实现预约座位
  • 解析返回结果,判断是否成功,并微信提醒结果
  • 利用python实现图书馆自习室自动预约及签到功能-秋名山の纸飞机

利用python实现图书馆自习室自动预约及签到功能-秋名山の纸飞机

定时功能

每天晚上八点整,图书馆会释放后天的位置。因此,我在云服务器上设定成每天晚上八点自动预约。

由于云主机时区不同,python读取本地时间必然与我们不同.所以要记得更改时区为东八区

$ tzselect

启动cront服务,启用cront日志到/var/log

利用python实现图书馆自习室自动预约及签到功能-秋名山の纸飞机

实现效果

这个程序我二月份就写好了,运行了三个多月,很稳定。(动图点击查看详情)

利用python实现图书馆自习室自动预约及签到功能-秋名山の纸飞机


签到部分

这部分的内容有点搞笑,由于图书馆签到系统采用微信签到,而其实现的原理是利用微信开放的蓝牙APi接口,搜索附近的其他蓝牙设备。自习室各个角落分布了若干蓝牙设备,如果搜索到信号源,则签到成功。由于刚开始我没有定位到正确的HTTP数据包,于是没有写签到部分,导致签到部分都是手动完成。五一假期的时候趁着图书馆人少,于是我以自习室门口的签到机器作为入口进行研究。

利用python实现图书馆自习室自动预约及签到功能-秋名山の纸飞机

找签到接口的时候保安就坐在我的后面,但是我们要知道,越是心虚反而越是没了底气,这时候要挺直身板,不慌不忙才能事半功倍。

我再次抓机器的包,发现Charls这次连数据包都抓不到了,排除了配置的问题后,我分析原因可能有如下:

  • APP内作了证书双向校验(无解,另寻他法 )
  • 签到信息走的不是http协议(Charles只能抓HTTP协议的数据),诸如tcp/udp此类的协议Charles抓不到。(可以用Wireshark抓包)

解决方法:

  • 第一种几乎无解,只能逆向apk文件来找源码,任务量太大了
  • 第二种方法我第二天尝试了,但是Wireshark不是简单设置代理就可以了,这个软件的原理是监听网卡,实现抓包。这需要我笔记本连接有线宽带,然后Wifi无线网卡作为热点共享给签到机器。由于准备不齐全当天并没有实施,第二天我和我研友带上了螺丝刀和老虎钳还有扩张坞“准备作案”利用python实现图书馆自习室自动预约及签到功能-秋名山の纸飞机然后被保安发现了。她叫来了图书馆的一个管理人员,问我们在干嘛。附上保安模糊照一张。利用python实现图书馆自习室自动预约及签到功能-秋名山の纸飞机

我们一阵解释之后,无奈只能放弃该方案。

  • 这两天重新手机抓包,终于找到了签到接口,发现就是简单的post操作。

至此,预约和签到的功能全部完成。这个软件我不打算开源,也不打算给其他人使用。因为这个软件只适用于天天去图书馆的人,偶尔去的人会造成位置资源的浪费,到最后出事了背锅的还是我。利用python实现图书馆自习室自动预约及签到功能-秋名山の纸飞机


写在后面

虽然没有用了很厉害的方法,但是我觉得分析问题的思路是可以借鉴的,它能让我们日后遇到问题找到解决的方法。

说点题外话,这是我今年写的第二篇文章,虽然我还有很多想写的东西,但是由于生活琐事无暇顾及其他,贴吧自动签到系统也没有时间去维护了。等我研究生考试结束,我会再来用心经营博客。

考研究生的路注定是要吃点苦的,知道为什么河里的起来的鱼要比鱼塘里养的鱼好吃吗?(动图点击查看详情)

利用python实现图书馆自习室自动预约及签到功能-秋名山の纸飞机
利用python实现图书馆自习室自动预约及签到功能-秋名山の纸飞机

因为鱼塘里的鱼,天天有人喂,没有天敌追,就等着养肥给人吃,一天到晚游快游慢都一样,身上鱼肉不多,鱼油不少。而河里的鱼,为了吃饱,为了避免被更大的鱼吃掉,它必须要不断地游。这样生存下来的鱼,那鱼肉吃起来自然有营养、爽口。

五六十年代出生的人,应该也就是我们 父母那一辈,当时计划经济制度下,他们的生活被社会安排好了,先科员再科长、 当后处长再局长,混到哪算哪:学徒、技工、高级技工;教师、中级教师、高级教师,总之无论哪个行业都论资排来。这样的生活如何让人奋发努力,所以经济发展缓慢。
可见,舒适环境是很难培养出坚强品格,被安排好的人生, 也很难做出伟大事业。

有些人问我,为什么要考研,说实话我也不是很确定当初为什么选择了考研这条路,我大可不必考研,寒假期间写了一个数字货币全自动化搬砖的脚本,3月份赚了2万多,真的是躺着赚钱,利用python实现图书馆自习室自动预约及签到功能-秋名山の纸飞机然后再去找个专业对口的工作渡过这几年,但这不是我想要的生活。实现个人价值的方法有千万种,可以工作可以考研,我选择了考研,无论最后成功与否,都是很有意义的一件事吧...

利用python实现图书馆自习室自动预约及签到功能-秋名山の纸飞机

市场经济社会下,机会就大多了,你可以从社会的任何一个位置开始起步,只要你真有决心,没有人可以拦着你。
事实也证明,三十年河东三十年河西,无论出身是什么,之前是凄苦还是富足,都有出人头地的一天。当然,这也就意味着,面临的竞争也是空前激烈的,一不小心,你的位置就可能被人插足,甚至你就得out 出局。

我有个很要好的高中同学,家里的条件不错,父母都是事业单位体制内的人,他爸爸开宝马,他爷爷开宝马,每次出去酒吧玩的时候,他爸爸一通电话就把我们安排了,无论如何都算是中产阶级以上的人,但是他依旧学习很努力,在高中时期,我一直以他作为标杆。现在他在英国利物浦读本科,学的依旧还是那么勤奋。

不怕苦,吃苦半辈子,怕吃苦,吃苦一辈子。如果你觉得上学读书是受罪,假设你可以活到80岁,其实你最多也就吃了20年苦。用人生四分之一的时间来换取其余时间的幸福生活,这点苦不算啥。再说了,在图书馆跟着这么多漂亮的女孩子一起学习,这也能算是吃苦?利用python实现图书馆自习室自动预约及签到功能-秋名山の纸飞机