PHP【curl】专题

来源:互联网 发布:mysql从入门到精通 编辑:程序博客网 时间:2024/05/21 19:40
前段时间接手了一个活,客户要求是用PHP实现跳过网站下载的等待时间。很多网站下载都有一个时间限制,就是每隔多少秒才能使用下载。思来想去的,觉得用PHP模拟http访问还是最好的。起初用了php的file_get_content函数,结果不行。然后又用iframe标签,打算用js模拟下点击去实现,结果里面的文件总是不老实,找了点解决办法,使用
<script language="javascript" type="text/javascript">if(top.location!=self.location)top.location=self.location;</script>
出现一种情况,就是chrome浏览器也是跳出,而IE总是在当前页面不停的刷啊刷的,不爽。然后直接给客户说,你的要求我实现不了。然后客户说用易语言就能实现啊,然后问他要了易语言模块的源码(超级网页访问模块),查了下源码,原来是用的底层访问。想了一夜,第二天窜起来后就在想这个问题,PHP如何实现底层的模拟http访问,百度老哥也挺给力的,很快给出了两种解决办法,一种是使用curl,另一种使用sock,然后就开始使用curl测试。下面是找到的curl最基本的代码
以下为引用的内容:// 1. 初始化$ch = curl_init();// 2. 设置选项,包括URLcurl_setopt($ch, CURLOPT_URL, "http://www.baidu.com");curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_HEADER, 0);// 3. 执行并获取HTML文档内容$output = curl_exec($ch);// 4. 释放curl句柄curl_close($ch);
上面可以实现最基本的一些功能,但是无法POST提交数据,需要继续百度了,下面是完整的访问代码(我的找不到了,郁闷下,用别人的替代下):
$url = 'http://www.nowamagic.net/service/taskSubmit';//接收XML地址$header = "Content-type: text/xml";//定义content-type为xml(可以省去)$ch = curl_init(); //初始化curlcurl_setopt($ch, CURLOPT_URL, $url);//设置链接curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//设置是否返回信息curl_setopt($ch, CURLOPT_HTTPHEADER, $header);//设置HTTP头curl_setopt($ch, CURLOPT_POST, 1);//设置为POST方式curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_data);//POST数据$response = curl_exec($ch);//接收返回信息if(curl_errno($ch)){//出错则显示错误信息print curl_error($ch);}curl_close($ch); //关闭curl链接echo $response;//显示返回信息
其中
 $xml_data可以的参数可以使用'uid='.$uid.'&pwd='.$pwd这样的格式,都可以的。

$response
是返回的数据,嗯,基本上使用get访问就可以直接略过下载时间限制了,但是还需要POST才能进行下载,
然后开始伪造IP,嗯,这是个体力活,成不成就靠它了
curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR:8.8.8.8', 'CLIENT-IP:8.8.8.8'));  //构造IPcurl_setopt($ch, CURLOPT_REFERER, "http://www.xssxss.com/ ");   //构造来路

加上这两行代码,一个是伪造来源IP,一个是伪造header中的refere的,
实验了半天,郁闷了,伪造的IP不起作用。。。。大大的郁闷了下。它服务器应该是这样检查来源IP的,
function getRealIpAddr(){    if (!empty($_SERVER['HTTP_CLIENT_IP']))    {        $ip=$_SERVER['HTTP_CLIENT_IP'];    }    elseif (!empty($_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; }
这段代码的原文地址:http://js8.in/681.html(用人家的,具体用途去那里看吧。)
嗯,这段代码很厉害,直接在使用IE模拟底层Http通信,
new ActiveXObject("WinHttp.WinHttpRequest.5.1");  
这里是new一个IE的WinHttp控件(易语言的超级网页访问模块也是这样)。
这个也有点小问题啊。。。就是IE打开的时候,总是提示安全警告。。。。。无语了,你说谁要是打开你的网站,蹦出来一个安全警告,,他会继续浏览你的网页吗?所以,,这个自己用还可以,放网页上太不合适了。。。有哥们这里肯定想问了,为啥不用ajax通信呢,我想用啊,但是不行啊,ajax这玩意就和file_get_content这函数实现的原理是一样的,都不能模拟底层Http通信,所以直接pass,
晚上睡在床上,翻来覆去的,这个问题为啥解决不了呢?说到底还是咱技术不过关啊。。。。继续修炼去了,争取今年再升一级!就能拿武器了,嘿嘿,以后升级就快啦!加油啊!

原创粉丝点击