现在网络上有许多网站都提供快递查询功能,集国内外常用快递为一体,免去了记忆各快递公司网址的麻烦,给人们生活带来一点点改便捷。呵呵,据说的有站长还靠这个赚钱,不过此处并不讲如何进行网赚,只是谈一下如何利用一个PHP的开源类HttpClient实现快递查询的功能。本文主要内容是包括如何获取验证码及COOKIE,实现查询功能,并将结果抓取回来显示。以申通快递查询为例首先从这儿http://scripts.incutio.com/httpclient/下载HttpClient.class.php申通快递查询网页是http://115.238.100.211:8081/result.aspx利用FireFox 的HttpHeader 插件分析整个查询过程:1、首次打开http://115.238.100.211:8081/result.aspx通过GET方式打开result.aspx,显示页面,此时会设置Cookie,Cookie名为ASP.Net_SessionId2、点击显示验证码,显示出验证码,填写好验证码及单号通过HttpHeader信息可知,当点击“显示验证码”时,页面是以POST的方式提交一次,POST的内容有:wen:快递单号码codestr:验证码,没填为空button1:值为"显示验证码"__VIEWSTATE和__EVENTVALIDATION:均为result.aspx生成的数据提交信息过后再以GET的方式请求VerifyCode.aspx,请求的同时发送Cookie显示验证码3、点击查询,显示查询结果,整个查询过程结束同第2步一样分析,点击“查询”后就只是再POST一次,POST的内容有:wen:快递单号码codestr:验证码button2:值为"查询"__VIEWSTATE和__EVENTVALIDATION:均为result.aspx生成的数据PS:通过试验发现,__VIEWSTATE和__EVENTVALIDATION的值不一定要使用最新的,我们可以直接使用以前的值就行===================分割=============经过以上3步就可以正确显示查询结果了,下面我们用HttpClient类来实现这个功能。1、建立index.php页面,引用HttpClient.class.php文件
PHP code <? php sesstion_start(); require ' ./HttpClient.class.php ' ; $request = new HttpClient( ' 115.238.100.211 ' , 8081 ); $request -> setDebug( true ); // 打开debug模式,方便调试,在正式使用时可以注释该句 $request -> setHeadersOnly( true ); // 因为只用得到Cookies,只需得到HttpHeader就可以了 $request -> get( ' /result.aspx ' ); // 请求result.aspx $cookies = $request -> getCookies(); // 获取Cookies并保存在$_SESSION中,或以其他方式保存 $_SESSION [ ' ASP.Net_SessionId ' ] = $cookies [ ' ASP.Net_SessionId ' ]; ?> < form action = " do.php " method = " post " > 运单号: < input type = " text " name = " wen " /> 验证码: < input type = " text " name = " codestr " />< img src = " Image.php " /> < input type = " submit " value = " 查询 " /> </ form > 2、建立Image.php,用来获取验证码图片 PHP code <? php sesstion_start(); require ' ./HttpClient.class.php ' ; $request = new HttpClient( ' 115.238.100.211 ' , 8081 ); // $request->setDebug(true);//打开debug模式,方便调试,在正式使用时可以注释该句 $postData = array ( // $postData为发送的内容 ' wen ' => '' , ' codestr ' => '' , ' button1 ' => ' 显示验证码 ' , ' __VIEWSTATE ' => ' /此处不让用太长的字符 ' , ' __EVENTVALIDATION ' => ' / ' ); $request -> setCookies( $_SESSION ); // 设置Cookie $request -> referer = ' http://115.238.55.94:8081/result.aspx ' ; // 设置Referer,可有可无 $request -> post( ' /result.aspx ' , $postData ); // 重新POST $request -> get( ' /VerifyCode.aspx ' ); // 请求验证码 header ( ' Content-Type: image/Jpeg; charset=gb2312 ' ); // 设置Header为image/jpeg,当header为image/jpeg是,打开debug模式将看不到任何东西 print $request -> getContent(); // 显示验证码 ?> 3、建立do.php,用来显示查询结果 PHP code <? php sesstion_start(); require ' ./HttpClient.class.php ' ; $request = new HttpClient( ' 115.238.100.211 ' , 8081 ); $request -> setDebug( true ); // 打开debug模式,方便调试,在正式使用时可以注释该句 $postData = array ( // $postData为发送的内容 ' wen ' => $_POST [ ' wen ' ] , ' codestr ' => $_POST [ ' codestr ' ] , ' button2 ' => ' 查询 ' , ' __VIEWSTATE ' => ' /wEPDwULLTEyNjUzMjYwNzEPZBYCAgMPZBYEAgUPD2QWAh4Jb25rZXlkb3duBaw BaWYoZXZlbnQud2hpY2ggfHwgZXZlbnQua2V5Q29kZSl7ICAgaWYgKChldmVudC53aGlj aCA9PSAxMykgfHwgKGV2ZW50LmtleUNvZGUgPT0gMTMpKSB7ICAgZG9jdW1lbnQuZ2V0R WxlbWVudEJ5SWQoJ0J1dHRvbjInKS5jbGljaygpO3JldHVybiBmYWxzZTt9fSAgICBlbH NlIHtyZXR1cm4gdHJ1ZX07IGQCCw8PZBYCHgdvbkNMaWNrBQdjaGVjaygpZGRWBZp31Y8 9SFTztLcto+W51LON+Q== ' , ' __EVENTVALIDATION ' => ' /wEWBQK34PznAgKdouaVDwKAr8CLCAKM54rGBgK7q7GGCD3 WCeTWZNB9r68c4gT9kMFtFu2X ' ); $request -> setCookies( $_SESSION ); // 设置Cookie $request -> post( ' /result.aspx ' , $data ); // 发送 $html = $request -> getContent(); // 得到查询结果 echo $html ; // 显示查询结果 ?> 到此,申通快递整个查询过程就结束了。接下来要做的就是如何处理$html,让显示结果符合你的口位。 其他快递查询大同小异,一个使用示例见 http://www.ickd.cn/shentong.html 除了HttpClient类外,还有Snoopy类也能实现相同功能 注意:由于论坛限制__VIEWSTATE和__EVENTVALIDATION的值中间有回车,如果你要测试用,请删除其中的回车符,或是到 此处下载源码