提要:
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(出发日期)
响应信息如图所示: