前段时间接手了一个活,客户要求是用PHP实现跳过网站下载的等待时间。很多网站下载都有一个时间限制,就是每隔多少秒才能使用下载。思来想去的,觉得用PHP模拟http访问还是最好的。起初用了php的file_get_content函数,结果不行。然后又用iframe标签,打算用js模拟下点击去实现,结果里面的文件总是不老实,找了点解决办法,使用
出现一种情况,就是chrome浏览器也是跳出,而IE总是在当前页面不停的刷啊刷的,不爽。然后直接给客户说,你的要求我实现不了。然后客户说用易语言就能实现啊,然后问他要了易语言模块的源码(超级网页访问模块),查了下源码,原来是用的底层访问。想了一夜,第二天窜起来后就在想这个问题,PHP如何实现底层的模拟http访问,百度老哥也挺给力的,很快给出了两种解决办法,一种是使用curl,另一种使用sock,然后就开始使用curl测试。下面是找到的curl最基本的代码 上面可以实现最基本的一些功能,但是无法POST提交数据,需要继续百度了,下面是完整的访问代码(我的找不到了,郁闷下,用别人的替代下):
$xml_data可以的参数可以使用'uid='.$uid.'&pwd='.$pwd这样的格式,都可以的。
$response
是返回的数据,嗯,基本上使用get访问就可以直接略过下载时间限制了,但是还需要POST才能进行下载,
然后开始伪造IP,嗯,这是个体力活,成不成就靠它了
实验了半天,郁闷了,伪造的IP不起作用。。。。大大的郁闷了下。它服务器应该是这样检查来源IP的,
function getRealIpAddr() { if (!emptyempty($_SERVER['HTTP_CLIENT_IP'])) { $ip=$_SERVER['HTTP_CLIENT_IP']; } elseif (!emptyempty($_SERVER['HTTP_X_FORWARDED_FOR'])) //这里用来判断是否使用代理服务器 { $ip=$_SERVER['HTTP_X_FORWARDED_FOR']; } else { $ip=$_SERVER['REMOTE_ADDR']; } return $ip; }
郁闷了,直接上来获取真实物理IP,想想CURL到底能不能模拟http底层IP地址呢,查了下手册,
$_SERVER["REMOTE_ADDR"]//这行是查看客户端物理IP地址的。
无奈,去国外论坛查了一圈,无法实现模拟最底层的IP,想了想sock估计也是这鸟样,所以就没查了。
如果使用上面的代码进行文件下载的时候,下载时的15秒限制是去了,但是每个IP10分钟之内最多下载1次,这个真无法实现了,因为PHP在使用curl时,是使用的apache服务器地址访问的,这玩意的地址,我总不能来回改来改去吧。嗯,,最后想到了使用js,嘿嘿。这玩意是在客户端上运行的,不错不错,不用我服务器了,嗯,就是下面这段代码:使用IE的Winhttp控件,只能IE下运行!!! WinHttp.WinHttpRequest.5.1。 先声明下,不能干坏事哟!
function RemoteCall(method, url, param, header){ var obj = new ActiveXObject("WinHttp.WinHttpRequest.5.1"); obj.Open(method||"GET", url, false); obj.Option(4) = 13056; obj.Option(6) = false; obj.setRequestHeader("Cookie", "string");//先设置一个cookie,防止出错,见官方文档 obj.setRequestHeader("Cookie","你的新浪微博cookie"); obj.setRequestHeader("Host","t.sina.com.cn"); obj.setRequestHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); obj.setRequestHeader("User-Agent","Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 QQDownload/1.7 FirePHP/0.5"); obj.Send(param); return obj; } function post(url,param){ var obj = new ActiveXObject("WinHttp.WinHttpRequest.5.1"); obj.Open("POST", url, false); obj.Option(4) = 13056; obj.Option(6) = false; obj.setRequestHeader("Cookie", "string"); obj.setRequestHeader("Cookie","你的新浪微博cookie"); obj.setRequestHeader("Host","t.sina.com.cn"); obj.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"); obj.setRequestHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); obj.setRequestHeader("User-Agent","Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 QQDownload/1.7 FirePHP/0.5"); obj.Send(param); return obj; }
嗯,这段代码很厉害,直接在使用IE模拟底层Http通信,
new ActiveXObject("WinHttp.WinHttpRequest.5.1");
这里是new一个IE的WinHttp控件(易语言的超级网页访问模块也是这样)。
这个也有点小问题啊。。。就是IE打开的时候,总是提示安全警告。。。。。无语了,你说谁要是打开你的网站,蹦出来一个安全警告,,他会继续浏览你的网页吗?所以,,这个自己用还可以,放网页上太不合适了。。。有哥们这里肯定想问了,为啥不用ajax通信呢,我想用啊,但是不行啊,ajax这玩意就和file_get_content这函数实现的原理是一样的,都不能模拟底层Http通信,所以直接pass,
晚上睡在床上,翻来覆去的,这个问题为啥解决不了呢?说到底还是咱技术不过关啊。。。。继续修炼去了,争取今年再升一级!就能拿武器了,嘿嘿,以后升级就快啦!加油啊!