四、基于HTTPS协议的12306抢票软件设计与实现--水平DNS并发查询分享

时间:2023-01-07 00:00:25

一、基于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   查询日志接口

事实上这个接口算是新添加的吧,也就是在查询车票运行前先运行个查询日志接口,我实验了一下,发现不运行这个接口也行,只是查询车票的接口就会变的慢一点,所以我最后还是加上了,很easy。仅仅用发下请求就可以了。

接口: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是全球都能够訪问的站点,须要提供高并发等功能。因此在各地都提供了多个server,通过DNS解析,不同地区的用户訪问距离本地近期的server来进行解析,通过这样12306来分解各地的高并发请求。但这种话就造成了另外一个问题,就是不同地区的用户在同一抢票时间抢同样的火车票。但看到的页面数据会有区别。有的能够看到剩余车票。而有的看不到,这是由于他们訪问的不是同一个12306server。不同的缓存导致的。

水平DNS查询的功能简单来说就是能列出12306各地server同样车票的剩余情况,看下图便知。

四、基于HTTPS协议的12306抢票软件设计与实现--水平DNS并发查询分享

上图显示的就是全球各地12306server同一时间同样车票的显示情况(我这仅仅是演示,要看到区别,能够在放票的那段时间。能够看到不同的server会显示不同的结果)。

事实上实现也很easy。首先通过DNS查询工具,查询出12306站点(kyfw.12306.cn)相应的各地的serverip地址。然后每一个地区都分别请求同样的车次,然后再table里面列举出来就可以,简单吧。

这个功能是很有用的,能够间接的反应出各地server的反应快慢。最后假如某个地区的车次信息显示有票,那么仅仅须要把程序当前DNS改动一下,让kyfw.12306.cn域名相应到那个IP地址就可以,然后就能够訪问那个IP地址进行异地server订票。

最后再说下,在我实验水平DNS查询的时候,发现假设选择了异地server进行订票,会发现你须要在异地server上又一次登录下才干够订票(能够说明12306在全国各地的应用server并没有共享session)。