在微信公众平台开发违章查询是一件比较辛苦的事,因为违章查询的数据在各省市公安部门的服务器上,对外只有网页查询提供,所以只有去分析网页,然后通过模拟提交来实现。
黑龙江违章查询地址为 http://www.hljjj.gov.cn:8081/Home/Wfcx
实际查询时,抓取到的请求如下
通过查看网页源码得到验证:
1
可以看到,实际查询路径为 /Home/getWfcx,也就是说,真实的查询地址为
http://www.hljjj.gov.cn:8081/Home/getWfcx
查询请求为
hpzl=02&dy=黑&xzqh=A&hphm=EZ352&clsbdh=LGBF1DE099R156742&jkbj=0&ts=1396242672751
返回的内容如下:
号牌号码 | 号牌种类 | 违法时间 | 金额 | 记分 | 缴款状态 | 处理状态 | 违法地点 | 违法内容 | 决定书编号 | 采集机关 |
黑AEZ352 | 小型汽车 | 2013-12-30 15:14:00 | 100 | 3 | 未缴款 | 未处理 | 国道绥满公路578公里 | 驾驶中型以上载客载货汽车、危险物品运输车辆以外的其他机动车行驶超过规定时速未达20%的 | 黑龙江省绥化市肇东市交警大队 | |
黑AEZ352 | 小型汽车 | 2013-7-16 14:37:00 | 100 | 0 | 未缴款 | 未处理 | 比优特旗舰店 | 不按规定停车 | 黑龙江省鹤岗处罚大队 | |
黑AEZ352 | 小型汽车 | 2013-7-15 18:42:00 | 100 | 0 | 未缴款 | 未处理 | 比优特旗舰店 | 不按规定停车 | 黑龙江省鹤岗处罚大队 | |
黑AEZ352 | 小型汽车 | 2013-6-26 9:41:00 | 100 | 0 | 未缴款 | 未处理 | 防疫站 | 不按规定停车 | 黑龙江省鹤岗处罚大队 | |
黑AEZ352 | 小型汽车 | 2013-6-17 12:40:00 | 100 | 3 | 未缴款 | 未处理 | 哈尔滨市-铁路街全路段 | 违反禁止标线指示 | 巡逻大队 | |
黑AEZ352 | 小型汽车 | 2013-6-7 10:44:00 | 100 | 0 | 未缴款 | 未处理 | 市农行道口 | 不按规定停车 | 黑龙江省鹤岗处罚大队 | |
黑AEZ352 | 小型汽车 | 2013-5-26 18:37:00 | 100 | 0 | 未缴款 | 未处理 | 老交通局 | 不按规定停车 | 黑龙江省鹤岗处罚大队 | |
黑AEZ352 | 小型汽车 | 2013-5-14 9:13:00 | 100 | 0 | 未缴款 | 未处理 | 老交通局 | 不按规定停车 | 黑龙江省鹤岗处罚大队 |
其返回的结果不是一个标准的json,而是一个网页格式,所以还需要html解析处理,
而对于请求发送,直接构造字符串用curl进行POST提交
实现代码如下:
1 function getTrafficInfo($longnumber) 2 { 3 if (!preg_match("/^违章#黑[A-Ra-r]w{5}#w{17}$/",$longnumber)){ //城市简拼 4 return "查询格式错误!n请发送'违章#车牌号码#机动车识别代号'n例如'违章#黑AEZ352#LGBF1DE099R156742'"; 5 } 6 7 $headers = array( 8 "User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1", 9 "Accept: application/json, text/javascript, */*", 10 "Accept-Language: en-US,en;q=0.8", 11 "Referer: http://www.hljjj.gov.cn:8081/Home/Wfcx", 12 "X-Requested-With: XMLHttpRequest", 13 "Content-Type: application/x-www-form-urlencoded", 14 ); 15 16 $numberarray = explode ("#", $longnumber); 17 $provinceCode = substr($numberarray[1], 0, 3); 18 $cityCode = substr($numberarray[1], 3, 1); 19 $plateNumber = substr($numberarray[1], 4, strlen($numberarray[1]) - 4); 20 $vehicleNumber = $numberarray[2]; 21 $curTime = explode (" ", microtime()); 22 $curMicroTime = round($curTime[1].($curTime[0]*1000)); 23 24 $post2 = "hpzl=02&dy=黑&xzqh=$cityCode&hphm=$plateNumber&clsbdh=$vehicleNumber&jkbj=0&ts=$curMicroTime"; 25 26 $ch = curl_init(); 27 curl_setopt($ch, CURLOPT_URL, "http://www.hljjj.gov.cn:8081/Home/getWfcx"); 28 curl_setopt($ch, CURLOPT_HEADER, false); 29 curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 30 curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 31 curl_setopt($ch, CURLOPT_POSTFIELDS, $post2); 32 $content=curl_exec($ch); 33 curl_close($ch); 34 $output = json_decode($content, true); 35 36 if($output[0] != "0"){ 37 return "【错误】类型:".$output[0].", 原因:".$output[1]; 38 }else{ 39 $str = $output[2]; 40 include('simple_html_dom.php'); 41 $html = str_get_html($str); 42 $result = ""; 43 $titleArray = array("号码", "种类", "时间", "金额", "记分", "缴款", "处理", "地点", "内容", "编号", "机关"); 44 foreach($html->find('table tr') as $tr){ 45 if ($tr->find('td', 0)->innertext == "号牌号码"){ 46 continue; 47 } 48 for ($i = 2; $i <= 10; $i++) { 49 $result .= $titleArray[$i].":".$tr->find('td', $i)->innertext."n"; 50 } 51 $result .= "n"; 52 if (strlen($result) > 2000){break;} 53 } 54 return trim($result); 55 } 56 }