火车晚点汇总查询


//文章迁移-20161112
7月份回家的时候,由于水灾,火车始发晚点了5个多小时。微博上抱怨时,很多同行的或者车上有亲友的人们都问我当时的晚点情况,从而也认识了一些再其他城市学习的老家的小伙伴们~
当时大家都在刷微博微信抱怨晚点,很少有人去12306上查询官方的的晚点时间。同时,这里的广铁集团微信公众号上也有自己的晚点查询服务,能够更详细的查询到晚点信息。
前几天,又到了提前买回家的车票的时间了。想到暑假的事,突然想做一个汇总查询--广铁有自己的查询网址,那其它铁路局一定也有,而且主要服务是在微信公众号上。于是我便加了10几个铁路局的公众号去看有没有晚点服务--最后找到广铁、上局、南昌局、成局、武局、沈阳局、西安局7个铁路局有正晚点服务,但沈阳局似乎引用的是12306的服务,西安局只能查询西安站的车次,武汉局查询什么车次都会返回错误,于是只采用了12306与前面四个铁路局的服务。
12306的官方正晚点查询网址在这里,界面是这个样子:

【图片挂了不想补了】
那个验证码当时觉得有点麻烦。。。。。
为了得到12306晚点服务的api地址,所以在点提交后抓包看看提交了哪些内容。
【图片挂了不想补了】
车站填北京,车次填Z1,验证码如实填27326 点提交抓包后得到如下信息:

1.提交方式是GET方式。
2.提交内容为:cz=%B1%B1%BE%A9&cc=Z1&cxlx=0&rq=2016-11-12&czEn=-E5-8C-97-E4-BA-AC&tp=1478943133712
3.从上面可以看出,提交的内容不包含验证码信息。也就是说,这个验证码是客户端JS自认证的。。。有点出乎意料

接下来就要分析提交了什么内容,第一个cz我想应该代表车(c)站(z)代码为%B1%B1%BE%A9,很明显是个加密的URL编码,编码方式为GB2312。接下来是cxlx,是选择查询出发时间还是到达时间,到达为0,出发为1。rq为当前日期。czEn这个很有趣,看上去是个URL编码,实际上还真是。。是UTF8的站名编码,只是把“%”替换成了“-”。最后一个tp为查询时间的unix时间戳,精确到毫秒级的(其实毫秒级的三位并不重要).
这样的话,便可以构建查询的url的GET参数了,PHP代码见下(UTF8编码)。

function SetURL($ekina,$checi,$dao) //车站名,车次名,到=0/出发=1 ,起始点=1 晚点=0
{

$url="cz=".urlencode(mb_convert_encoding($ekina,'gb2312','utf-8'))."&cc=".$checi."&cxlx=".$dao."&";
$tmp=preg_replace("/%/","-",urlencode($ekina));
$url=$url."rq=".date("Y-m-d")."&czEn=".$tmp."&tp=".time()."255";
    $url="http://dynamic.12306.cn/map_zwdcx/cx.jsp?".$url;
return $url;

}

之后用CRUL就行,返回的是纯文本格式,不包含任何标签。
之后如法炮制去探究其他局的晚点查询。上局的比较麻烦,有服务器验证的验证码,而且限制不能js跨域,PHP模拟去应当可以,但感觉很麻烦,最后直接套了个Frame上去。广铁集团和成都局返回的都是json格式,很好去处理,但南昌局返回的是一个带广告的HTML网页(笑),需要正则处理下。
最后的效果见:http://train.b612.me

声明:Asteroid B612|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 火车晚点汇总查询


薄桃色の花びら