春节要到了,一年一度的春运即将来临,奈何一票难求,何解?于是12306的各种插件、抢票软件应运而生,而为了抢占这个商机,各路人马应正了那句八仙过海,各显神通。抢票软件实质也就是模拟一个用户登录买票的完整过程,本文就来简单讲讲抢票软件基本思路。
要想做一个抢票软件,无论怎么样都要对HTTP(S)协议有一定的了解,所以,看本文前请对HTTP(S)协议有个基本的认识。HTTP协议请求由三部分组成,分别是:请求行、消息报文头、请求正文,我们这里主要要用到消息报文头和请求正文。如下图,首部行就是消息报文头。
在开始模拟用户之前,必须要先对报文头信息进行分析,然后模拟用户进行登录,这就需要找到网站的SESSIONID,这样才能保持后面的通信的正确性(我们这里使用的Chrome浏览器的开发工具进行分析的)。每个用户访问网站都会有一个SESSIONID,是包含在报文头里面的,我们需要找到如下内容的头信息:
这个就是从服务器传送过来的SESSIONID,当然参数名称不一定是JSESSIONID。
我们先用代码获取这个标识“1EF0EC42E01BD15A1489F75A640CE567”,并保存在本地集合COOKIE中。如下是C#代码:
HttpHelper.CreateGetHttpResponse部分代码如下:
这里要分析所有的服务器页面返回的COOKIE设置(例子代码中只分析了一个页面的COOKIE),获得所有COOKIE并保存下来后,就完成了大部分的工作,剩下的就是每次向服务器发起请求时都要带上获取到的COOKIE值。接下来我们再来看看登录的该怎么操作,首先找到登陆请求的页面以及提交的表单参数名称,这些信息都可以在Chrome的开发工具中找到,如下:
请求地址
提交的参数列表
从第一个红框中可以看出,还有几个COOKIE不是上面代码获取到的,所以在开发工具中仔细找找看,挨个获取并保存。第二个红框就是提交登录信息,在提交登录信息之前,还要提交一个验证码检测的请求,通过后验证后再提交登录请求。这里的验证码比较难处理,很难实现自动处理,只能遇到验证码时弹出提示框,由用户输入验证码信息后,获取信息再提交到服务器进行验证码识别。
验证码请求的地址和参数
登录成功后,就是查询获取车次信息,展示出来提供直观的效果。这些完成后,还有一个核心功能,就是预约抢票,预约抢票设计是很简单的,就是计算当前时间和放票时间的一个时间差,启动一个定时器定时发起抢票。但是这里有一个问题,12306网站的会话保持时间很短,如果预约时间过长很可能会丢失用户会话,开始抢的时候会被要求重新登陆。所以这里还要启用一个定时线程去保持这个会话,设置一个比网站会话超市时间更短点的时间,定时向服务器发起请求,并查看是否会话超时,如果超时则提前向用户提醒重新登录,如果没有超时则继续保持预约,等待最后的放票并抢票。当然,有验证码的地方都需要人为操作来处理,不然就只有卡在验证码那里。
整个抢票思路就这样了,剩下的就是怎么让软件使用更人性,界面更优美,各种提醒更及时,然后其他的就给上天吧。
领取专属 10元无门槛券
私享最新 技术干货