博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP【curl】专题
阅读量:5076 次
发布时间:2019-06-12

本文共 4398 字,大约阅读时间需要 14 分钟。

前段时间接手了一个活,客户要求是用PHP实现跳过网站下载的等待时间。很多网站下载都有一个时间限制,就是每隔多少秒才能使用下载。思来想去的,觉得用PHP模拟http访问还是最好的。起初用了php的file_get_content函数,结果不行。然后又用iframe标签,打算用js模拟下点击去实现,结果里面的文件总是不老实,找了点解决办法,使用
 

  

出现一种情况,就是chrome浏览器也是跳出,而IE总是在当前页面不停的刷啊刷的,不爽。然后直接给客户说,你的要求我实现不了。然后客户说用易语言就能实现啊,然后问他要了易语言模块的源码(超级网页访问模块),查了下源码,原来是用的底层访问。想了一夜,第二天窜起来后就在想这个问题,PHP如何实现底层的模拟http访问,百度老哥也挺给力的,很快给出了两种解决办法,一种是使用curl,另一种使用sock,然后就开始使用curl测试。下面是找到的curl最基本的代码
 
以下为引用的内容:  // 1. 初始化  $ch = curl_init();  // 2. 设置选项,包括URL  curl_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(); //初始化curl  curl_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'));  //构造IP  curl_setopt($ch, CURLOPT_REFERER, "http://www.xssxss.com/ ");   //构造来路

 

加上这两行代码,一个是伪造来源IP,一个是伪造header中的refere的,
实验了半天,郁闷了,伪造的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,
晚上睡在床上,翻来覆去的,这个问题为啥解决不了呢?说到底还是咱技术不过关啊。。。。继续修炼去了,争取今年再升一级!就能拿武器了,嘿嘿,以后升级就快啦!加油啊!

转载于:https://www.cnblogs.com/jima/archive/2012/11/20/wangjima.html

你可能感兴趣的文章
javascript闭包
查看>>
@Column标记持久化详细说明
查看>>
创建本地yum软件源,为本地Package安装Cloudera Manager、Cloudera Hadoop及Impala做准备...
查看>>
mysql8.0.13下载与安装图文教程
查看>>
站立会议08(冲刺2)
查看>>
url查询参数解析
查看>>
http://coolshell.cn/articles/10910.html
查看>>
[转]jsbsim基础概念
查看>>
mysql编码问题
查看>>
决策树与规则引擎
查看>>
nekohtml转换html时标签变大写的问题
查看>>
Python随笔1
查看>>
夺命雷公狗---Redis---6-案例操作1(注册-登录)
查看>>
IE8不显示图片alt了.
查看>>
C++中声明与定义的区别
查看>>
U3d PlayerPrefs
查看>>
《Linux命令行与shell脚本编程大全》 第八章管理文件系统
查看>>
前端css常用的选择小汇
查看>>
python之路-Memcache
查看>>
Hadoop Streaming框架使用(一)
查看>>