首页 > 代码库 > 四、基于HTTPS协议的12306抢票软件设计与实现--水平DNS并发查询分享
四、基于HTTPS协议的12306抢票软件设计与实现--水平DNS并发查询分享
一、基于HTTPS协议的12306抢票软件设计与实现--实现效果
二、基于HTTPS协议的12306抢票软件设计与实现--相关接口以及数据格式
三、基于HTTPS协议的12306抢票软件设计与实现--垂直查询效果分享
哎,又过年了,同志们又要抢票回家了,这票卖的可真快啊,瞬间的功夫就没有票了,一票难求啊!
这两天闲着没事,刚好又要抢春节的票了,就把原来写的抢票软件给打开试了一下,发现竟然不能查票了,于是就又改了一下。其实是改了两下,一是:让原来的程序能够用起来(适应新接口),而是加上了水平DNS并发查询。下面就依次说下吧。
一、接口变更
其实这次12306并没有大改,只有一下几个接口改了。
1.1 登陆验证码
这个只是去了个action的后缀(.do),不改也没有问题,但怕以后出问题,就改了一下。
接口:https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew
参数:和之前一样。
1.2 查询车票
接口:https://kyfw.12306.cn/otn/leftTicket/queryT (后面加了一个T)
参数未变。
1.3 查询日志接口
其实这个接口算是新增加的吧,也就是在查询车票执行前先执行个查询日志接口,我实验了一下,发现不执行这个接口也行,不过查询车票的接口就会变的慢一点,所以我最后还是加上了,很简单,只用发下请求就行了。
接口:https://kyfw.12306.cn/otn/leftTicket/log
方法:GET
参数:和查询车票即可参数一样。
返回值:不用管。
1.4 获取联系人接口
这个接口也没有大改,如果你的联系人少的话就不用管了。因为我的联系人有两页,但按照之前我提供的接口的话只能获取第一页的联系人,导致第二页的联系人不能正常获取,因此修改为如下:
接口:https://kyfw.12306.cn/otn/passengers/query
方法:GET 或 POST
参数:pageIndex (第几页)
pageSize (每页多少条记录)
返回值:json格式,稍微解析下就可以了,字段名字没有变。
二、水平DNS并发查询
其实这次改动最大的地方算是加了个水平DNS查询吧。因为12306是全球都可以访问的网站,需要提供高并发等功能,因此在各地都提供了多个服务器,通过DNS解析,不同地区的用户访问距离本地最近的服务器来进行解析,通过这样12306来分解各地的高并发请求。但这样的话就造成了另外一个问题,就是不同地区的用户在同一抢票时间抢相同的火车票,但看到的页面数据会有差别,有的可以看到剩余车票,而有的看不到,这是因为他们访问的不是同一个12306服务器,不同的缓存导致的。
水平DNS查询的功能简单来说就是能列出12306各地服务器相同车票的剩余情况,看下图便知。
上图显示的就是全球各地12306服务器同一时间相同车票的显示情况(我这只是演示,要看到差别,可以在放票的那段时间,可以看到不同的服务器会显示不同的结果)。
其实实现也非常简单,首先通过DNS查询工具,查询出12306网站(kyfw.12306.cn)对应的各地的服务器ip地址,然后每个地区都分别请求相同的车次,然后再table里面列举出来即可,简单吧。
这个功能是非常实用的,可以间接的反应出各地服务器的反应快慢。最后假如某个地区的车次信息显示有票,那么只需要把程序当前DNS修改一下,让kyfw.12306.cn域名对应到那个IP地址即可,然后就可以访问那个IP地址进行异地服务器订票。
最后再说下,在我实验水平DNS查询的时候,发现如果选择了异地服务器进行订票,会发现你需要在异地服务器上重新登录下才可以订票(可以说明12306在全国各地的应用服务器并没有共享session)。
四、基于HTTPS协议的12306抢票软件设计与实现--水平DNS并发查询分享