【毕设梳理】开始尝试抓包

提要:

1. 使用fiddler抓取12306登录信息。

2. 分析12306登录信息。

3. 分析12306查票信息。


 1. 使用fiddler抓取12306登录信息。

12306网站使用的是HTTPS协议,使用fiddler抓取需要以下几个步骤:

Tools -> Options… -> HTTPS,之后如下图选中:

 

之后便可以抓取HTTPS协议的请求和响应了。

参考:https://jingyan.baidu.com/article/19020a0a1e9d4b529d2842bd.html

 

百度上有的教程有写需要导出证书,因按照以上步骤已经可以抓取12306网站的请求和响应,暂先不研究其他步骤。

关于抓取手机端信息(暂未尝试),参考:http://blog.csdn.net/idlear/article/details/50999490

 

——2018/02/08 更新

使用Chrome浏览器,按F12,选择network,也可以获取请求和相应。如下图:


 2. 分析12306登录信息。

登录时,可以看见fiddler上有很多条请求信息,但其中包括了许多与登录无关的信息,例如用GET请求跳转到登陆成功界面等。我们需要从中找到登录行为向12306系统发送的请求。根据显示,大概可以猜想登陆行为是由三个请求完成:首先是通过GET获取12306的图片验证码,接着通过POST发出验证验证码请求,最后通过POST发出验证用户账号和密码的请求。如下图所示:

 

为了验证我的猜想,可以通过三种情况下抓取的请求来检测:

1) 密码正确,验证码错误。

2) 密码错误,验证码正确。

3) 密码和验证码都错误。

 

最后结果是(图片不贴):

1) 验证码验证错误 -> 请求新的验证码图片

2) 验证码验证成功 -> 密码验证错误 -> 请求新的验证码图片

3) 验证码验证错误 -> 请求新的验证码图片

 

总结结论步骤:

1) 向https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand&0.04960293982524333

用GET方法请求验证码,&后是一个随机数,尝试可知可以不加这个随机数,得到的响应是一个jpg图片。

2) 向https://kyfw.12306.cn/passport/captcha/captcha-check

用POST方法请求验证验证码,请求参数为answer&login_site&rand,得到的响应是一个包括result_message和result_code的JSON对象。

3) 如果验证码验证成功,

向https://kyfw.12306.cn/passport/web/login

用POST方法请求验证账户密码,请求参数是username&password&appid,得到的响应是一个包括result_message、result_code和uamtk的JSON对象。


3. 分析12306查票信息。

查票只用一个GET方法向

https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date=2018-02-11&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=JBN&purpose_codes=ADULT

请求即可,其中需要的参数在url中有显现:

leftTicketDTO(车票信息,具体如下):train_date(日期)、from_station(出发地)、to_station(目的地)

purpose_codes(0X00指学生票,ADULT指成人票)

 

经过多次尝试,如选席位、选车次类型、甚至选往返日期等,GET方法依然只发送如上所述的参数,说明筛选功能是页面做的,12306服务器发来的只有跟据GET请求信息获得的全部车次的JSON数据,而不会事先筛选车次或席位返还给页面。

响应信息如图所示:

其中data是一个JSON对象,result是我们所需要的所有车次及其信息:车次、出发站、到达站、出发时间、到达时间、票数等等,用|隔开。

 

上图中的240000G30910是火车编号,通过它能查出该列车更加详细的信息,即用GET方法向

https://kyfw.12306.cn/otn/czxx/queryByTrainNo?train_no=240000G30910&from_station_telecode=BXP&to_station_telecode=JBN&depart_date=2018-02-11

发送请求,需要的参数是train_no(列车编号)、from_station_telecode(出发站编码)、to_station_telecode(到达站编码)和depart_date(出发日期)

响应信息如图所示:

 

posted @ 2018-02-08 00:01  逝逝  阅读(198)  评论(0编辑  收藏  举报