火车晚点汇总查询

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

%e6%9c%aa%e5%91%bd%e5%90%8d%e6%88%aa%e5%9b%be
那个验证码当时觉得有点麻烦。。。。。
为了得到12306晚点服务的api地址,所以在点提交后抓包看看提交了哪些内容。
%e6%9c%aa%e5%91%bd%e5%90%8d%e6%88%aa%e5%9b%be
车站填北京,车次填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://tools.b612.in/train

发表评论

电子邮件地址不会被公开。 必填项已用*标注