设为首页 收藏本站
查看: 404|回复: 0

[经验分享] PHP【curl】专题

[复制链接]

尚未签到

发表于 2015-8-26 09:35:58 | 显示全部楼层 |阅读模式
前段时间接手了一个活,客户要求是用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. 设置选项,包括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;   
}  

  

这段代码的原文地址:http://js8.in/681.html(用人家的,具体用途去那里看吧。)

嗯,这段代码很厉害,直接在使用IE模拟底层Http通信,




new ActiveXObject("WinHttp.WinHttpRequest.5.1");   

  这里是new一个IE的WinHttp控件(易语言的超级网页访问模块也是这样)。


这个也有点小问题啊。。。就是IE打开的时候,总是提示安全警告。。。。。无语了,你说谁要是打开你的网站,蹦出来一个安全警告,,他会继续浏览你的网页吗?所以,,这个自己用还可以,放网页上太不合适了。。。有哥们这里肯定想问了,为啥不用ajax通信呢,我想用啊,但是不行啊,ajax这玩意就和file_get_content这函数实现的原理是一样的,都不能模拟底层Http通信,所以直接pass,

晚上睡在床上,翻来覆去的,这个问题为啥解决不了呢?说到底还是咱技术不过关啊。。。。继续修炼去了,争取今年再升一级!就能拿武器了,嘿嘿,以后升级就快啦!加油啊!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-104337-1-1.html 上篇帖子: PHP字符编码问题-总结 下篇帖子: PHP之如何判断数字(数字字符串不算)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表