用HttpClient类实现查询申通快递的功能

现在网络上有许多网站都提供快递查询功能,集国内外常用快递为一体,免去了记忆各快递公司网址的麻烦,给人们生活带来一点点改便捷。
呵呵,据说的有站长还靠这个赚钱,不过此处并不讲如何进行网赚,只是谈一下如何利用一个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_SessionId
2、点击显示验证码,显示出验证码,填写好验证码及单号
通过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的值中间有回车,如果你要测试用,请删除其中的回车符,或是到 此处下载源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值