需求分析:
大四的最后一学期,毕业在即,终日泡在图书馆准备毕业设计,偶然碰到萍萍,才知道我们学校图书馆可以提前一天六点预约第二天的座位,我恍然大悟怪不得每天早上去三楼以上座无虚席。
当时还在二月,天气还冷,二楼、三楼座位多,不过大多都在大厅没有空调,坐在那就一个感觉冷,代码都敲不下去。当我从她那听到那个消息后,回去就订了第二天早上六点的闹钟,虽然抢到了位,但是是真是不好受,六点醒了以后仿佛就睡不着了,到图书馆一点精神没有,连着两天终于受不了了,决定写个程序完成自动预约的功能。
开始分析:
首先大致了解一下图书馆整个流程,发现不是很难,应该可以做出来。
大致步骤如下:
- 登陆
- 获取座位预约信息
- 开始预约
咋一看还挺简单,随着功能越来越完善,就越来越复杂。
具体步骤:
- 登陆
这种纯数字验证码,而且还没有加干扰线,只是做了倾斜处理,属于最简单的验证码了,没什么好说的,形同虚设。
f12打开 浏览器开发者工具,username,password都是原生的,毫无疑问verify就是验证码。先加上headers,cookie,发现可以登录,OK 到这完成了第一步。
在这先贴上登录成功返回的json数据后面会用到,刚开始我没注意到这个问题导致我走了好多弯路。。
2.获取座位信息
经过我多次刷新页面,归纳总结得出17就是每个楼层每个区的编 ,二三楼层有三个区每个区的编 都不一样。四楼以上每层楼只有一个区,每层楼就只有唯一的编 。而后面的id在获取座位信息的时候会用到,说到这里我就想到我踩的一个坑,刚开始只分析了一天的数据,我以为那个id(就是后来用到的segment)是固定的,只是第二天比第一天加一,后来我才知道是递增的。。
在获取座位信息的时候用到了上一个请求结果的两个参数,写到这我又想到另一个坑,就是startTime,endTime。如果是预约当天的座位startTime就是发起请求的时间,如果预约第二天的座位startTime是08:00。而且day也是第二天的日期,在这我又百度了个轮子,可以自动获取第二天的日期。
下面是座位预约信息的响应结果
这里面需要的信息就是id:代表唯一的座位 ,name和no都一样:代表座位 ,status:1代表空闲,0,代表已预约。这是我又踩了一个坑。自助预约0.9版本当想预约的座位预约是已预约的状态,会自动循环其他座位,但由于列表索引与座位 相差一位,我的程序会显示预约成功而实际预约的是错一位的座位 。还有一个bug,如果当前预约的座位是空闲而下一个座位是已预约,程序会陷入死循环,一直获取空间预约信息,分析代码发现,我只在上一个判断中return,而下面的判断没有return,而是continue!!!
3.最后就到了预约,这儿我就直接贴代码吧
可以看到预约用到的token,expire,就是登陆成功响应的结果。
补充及总结:
程序使用ConfigParser来设置配置文件,方便其他人修改信息及使用。
使用schedule调度器让程序每天早上六点自动运行,(bug:如果调度器设置为06:00会提示未到预约时间,一般设置为06:00:05)
0.9版本中一次只能输入一个座位 ,如果预约不到就只能从循环中随机预约,
1.0版本将座位 改为类似列表的形式,可以自己设置候补座位。
程序结合任务计划管理程序简直完美,任务计划程序可以让我的程序每天早上五点五十万自动运行,一小时后自动关闭,而不是晚上一直让程序运行。不过昨天早上成功了,今天早上我的电脑自动关机了,不知道怎么回事,准备今晚上再试试。
文章知识点与官方知识档案匹配,可进一步学习相关知识Python入门技能树首页概览208564 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!