也来分析一波12306刷票软件(一)

前言

众所周知的,每逢过节都有"一票难求"的情况,出行的供需平衡始终是未变的,但正是由于刷票软件的出现,通过"技术插队"打乱了原先排队购票的概率平衡。如果有人质疑刷票软件所面对的法律条款的公平性,我只能说除了法律角度,站在其他任意的角度,公平的分量都还不够重;所以本文仅仅从技术角度进行探讨,不牵涉过多的法律角度.....

这里不得不给12306Bypass的开发者打call,在一开始12306官网没有开放任何接口的前提下能做到如此程度,加上试过一些其他的刷票软件,分流的速度较快,所以开发者在技术上实在是令人敬仰的。

所以本系列文章就将从12306刷票软件,是如何通过发送http请求模拟登录12306网站并购票的全过程进行分析。

关于查票接口

12306服务器的用户量巨大,所以为了防止攻击或者防止“刷票”,开发者常常会将很多查询或者购票中某步骤的url或者协议细节发生改变。比如当下我查询从南京-成都的车票的查询接口是这样的:

https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date=2019-02-22&leftTicketDTO.from_station=NJH&leftTicketDTO.to_station=CDW&purpose_codes=ADULT

查询接口在前段时间还有这样的:

https://kyfw.12306.cn/otn/leftTicket/query
https://kyfw.12306.cn/otn/leftTicket/queryX
https://kyfw.12306.cn/otn/leftTicket/queryY

在以后12306可能会彻底变更相关url,但是换汤不换药,所以掌握其原理是有一定好处的。下面开始进入我们的正文吧!

抓包分析

首先我们仍然通过上述的查询接口进行查询南京-成都的票:

2019-01-26_22-42-44.png

抓包后可以得到一个ajax请求,分析response可以得到以下json格式的数据:

{"data":{"flag":"1","map":{"CDW":"成都","ICW":"成都东","NJH":"南京","NKH":"南京南"},"result":["%2BYr4O3QBJqaAW8m9hlHrgZpObReWoYJM8kS%2BFYxr6zH%2FuQSey%2FK%2FeizQBRmibXQeecUCamBJBSRt%0Ax3CdtQ5ZCSgRRCl8n%2BPbNqMy4rsRpeuQnjMvSK%2FT0xWX%2FF%2FZC%2FI9tPjs2VLDv9nTambDAK1TY43Z%0ANwOiT1IXvS7ZQcKOdNClMDVj3%2Fqsc7xAv1Vzn7vsBfCKFCBbVvO7PKZkJCYb9yV1avfIogZk0XMX%0AHb2x6nsC1iEf7AJ4TbaggHC5oVL5i3dLJ0f6f......."]

余票信息都在result里面,刷票软件一般此时就会利用这里的数据进行显示。自己之前写过的携程心愿飞机票信息项目也差不多是基于这个原理。值得一提的是在查询的时候,城市的名字会被缩写,缩写的规则在哪里呢?答案是通过一个station_name.js文件进行查询:

2019-01-26_22-58-36.png

可以发现station_name.js后面有一个scriptVersion=1.9091,这其实是为了让浏览器每次都重新加载新的station_name.js文件,而不是使用浏览器缓存中的js文件,以防错过站点信息的及时更新。

关于如何利用程序模拟http请求去发包,我们会放在本系列靠后一点进行讲解。

在这一节里,首先需要对发包的一些格式有一个形象的理解:2019-01-26_23-14-58.png

其中Accept、Accept-Encoding、Accept-Language、Connection、Cache-Control、Host、If-Modified-Since 等参数都不是非常重要,User-Agent是我们数据爬虫的伪造身份证,不提;唯一需要注意的地方是Cookie与Referer,Referer是因为接口可能发生变更,而所有的重头戏是在Cookie上,它的值非常奇怪:

JSESSIONID=99B42284A8B0D181CEA93242EA31D2AB; BIGipServerotn=871367178.38945.0000;RAIL_EXPIRATION=1548773998340; RAIL_DEVICEID=EV6HbTvK_zZkVeBlE0wf6RLWO8L23z_mW3d2VPY76Co51-sIOiWCTh4wh1edqif2eTQlyjNr-A_qhBmKYP50UJdrzKMUMiZJq0OVXdlSdDp9i126zkSTKifDXX_9giW6j9yiNpbf2SxX9xkNZdoWYI-1YW_Qxuam; BIGipServerpool_passport=267190794.50215.0000; 
route=c5c62a339e7744272a54643b3be5bf64; 
_jc_save_fromStation=%u4E0A%u6D77%2CSHH; 
_jc_save_toStation=%u6210%u90FD%2CCDW; _jc_save_fromDate=2019-01-26; _jc_save_toDate=2019-01-26; _jc_save_wfdc_flag=dc

JSESSIONID是服务器给我们的验证令牌,我们后面的登录甚至支付操作都必须带上这个数据,否则服务器会认为我们的请求是非法的。所以这个数据的获取也是难点之一。

总结一下刷票软件的难点:

1、获取Cookie并自动登录12306

2、实现抢购设置的某日期的某车次的票自动化

3、如何避免进入排队系统

4、如何循环监控某车次的票,直到有票,自动抢购

5、抢票时若出现异常,自动重新抢票,直到成功

我们将在下一篇继续进行分析。

最后欢迎关注公众号[云思之岸],此公众号会分享一些程序员相关技术(主要)或者涉及一些感悟、一些经验、一些故事、一些编曲或摄影知识等非技术的内容,来自一名会音乐、爱健身的不合格程序员。

wx.jpg

猜你喜欢

转载自www.cnblogs.com/yunlambert/p/10325334.html