[实践Ok]代理服务器获取图片文本等的方法及PHP下通过curl和file_get_contents函数实现代理的使用方法

转载自:http://www.justwinit.cn/post/5680/

实践file_get_contents函数实现代理Ok如下:
  1. <?php  

  2. $aContext = array(  

  3. 'http' => array(  

  4. 'proxy' => 'tcp://192.168.168.251:80',  

  5. 'request_fulluri' => true,  

  6.    ),  

  7. );  

  8. $cxContext = stream_context_create($aContext);  

  9. //以上经过测试确实Ok

  10. $sFile = file_get_contents("http://www.taobao.com", False, $cxContext); //有代理时:返回淘宝的html代码  

  11. //$sFile = file_get_contents("http://www.taobao.com");//无代理提示: Some packets have been blocked!

  12. echo$sFile;  


  13. ?>  

<?php $aContext = array( 'http' => array( 'proxy' => 'tcp://192.168.168.251:80', 'request_fulluri' => true, ), ); $cxContext = stream_context_create($aContext); //以上经过测试确实Ok $sFile = file_get_contents("http://www.taobao.com", False, $cxContext); //有代理时:返回淘宝的html代码 //$sFile = file_get_contents("http://www.taobao.com");//无代理提示: Some packets have been blocked! echo $sFile; ?>


   如何测试不同代理服务器访问是代理的问题还是自己网站的问题,如不用代理能访问到某个图片,而用了代理则访问不到某个图片?测试如下:
一:以代理去获取某个图片的方法:
1.登录代理服务器:
telnet 192.168.168.251 80
2.通过代理获取图片:
get http://p1.img.cctvpic.com/xiyou/userp_w_picpath/2012/10/18/163312135054919266639.jpg


二:自己电脑不用代理获取图片的方法,利用Telnet获取Web页面:
1.直接telnet到网站80端口:
telnet cctvpic.com 80
Trying 60.5.254.37...
Connected to cctvpic.com.
Escape character is '^]'.
2.获取到网站的图片:
get http://p1.img.cctvpic.com/xiyou/userp_w_picpath/2012/10/18/163312135054919266639.jpg


一: curl 的方式使用代理的方法:
  1. <?php  

  2. function curl($url)  

  3. {  

  4. $str_url = $url;  

  5. $ch_curl = curl_init ();  

  6.    curl_setopt ( $ch_curl, CURLOPT_TIMEOUT, 3 );  

  7.    curl_setopt ( $ch_curl, CURLOPT_HEADER, false );  

  8.    curl_setopt ( $ch_curl, CURLOPT_HTTPGET, 1 );  

  9.    curl_setopt ( $ch_curl, CURLOPT_RETURNTRANSFER, true );  

  10.    curl_setopt ( $ch_curl, CURLOPT_URL, $str_url );  


  11. //HTTP的代理

  12. $proxy="192.168.168.251:80";  

  13.    curl_setopt($ch_curl, CURLOPT_HTTPPROXYTUNNEL,true);  

  14.    curl_setopt($ch_curl, CURLOPT_PROXYTYPE,CURLPROXY_HTTP);  

  15.    curl_setopt($ch_curl, CURLOPT_PROXY, $proxy);  

  16. //curl_setopt($ch_curl, CURLOPT_PROXYUSERPWD, '');


  17. /*

  18.    //Sock 4 的代理

  19.    curl_setopt($ch_curl, CURLOPT_PROXYTYPE,4);

  20.    //Sock 5 的代理

  21.    curl_setopt($ch_curl, CURLOPT_PROXYTYPE,5);

  22.     */

  23. $str_return = curl_exec ( $ch_curl );  

  24. if ($str_return === false)  

  25.    {  

  26. return false;  

  27.    }  

  28.    curl_close ( $ch_curl );  

  29. return$str_return;  

  30. }  

  31. $url = "http://p1.img.cctvpic.com/xiyou/userp_w_picpath/2012/10/18/163312135054919266639.jpg";  

  32. $contents = curl($url);  

  33. var_dump($contents);  

  34. file_put_contents("/tmp/1p.jpg",$contents);  

  35. ?>  


<?php function curl($url) { $str_url = $url; $ch_curl = curl_init (); curl_setopt ( $ch_curl, CURLOPT_TIMEOUT, 3 ); curl_setopt ( $ch_curl, CURLOPT_HEADER, false ); curl_setopt ( $ch_curl, CURLOPT_HTTPGET, 1 ); curl_setopt ( $ch_curl, CURLOPT_RETURNTRANSFER, true ); curl_setopt ( $ch_curl, CURLOPT_URL, $str_url ); //HTTP的代理 $proxy="192.168.168.251:80"; curl_setopt($ch_curl, CURLOPT_HTTPPROXYTUNNEL,true); curl_setopt($ch_curl, CURLOPT_PROXYTYPE,CURLPROXY_HTTP); curl_setopt($ch_curl, CURLOPT_PROXY, $proxy); //curl_setopt($ch_curl, CURLOPT_PROXYUSERPWD, ''); /* //Sock 4 的代理 curl_setopt($ch_curl, CURLOPT_PROXYTYPE,4); //Sock 5 的代理 curl_setopt($ch_curl, CURLOPT_PROXYTYPE,5); */ $str_return = curl_exec ( $ch_curl ); if ($str_return === false) { return false; } curl_close ( $ch_curl ); return $str_return; } $url = "http://p1.img.cctvpic.com/xiyou/userp_w_picpath/2012/10/18/163312135054919266639.jpg"; $contents = curl($url); var_dump($contents); file_put_contents("/tmp/1p.jpg",$contents); ?>


二:PHP使用file_get_contents的代理方法获取远程网页的代码:
  1. <?php    

  2. $url = "http://justwinit.cn/";    

  3. $ctx = stream_context_create(array(    

  4. 'http' => array('timeout' => 5,    

  5. 'proxy' => 'tcp://60.175.203.243:8080',    

  6. 'request_fulluri' => True,)    

  7. )    

  8. );    

  9. $result = file_get_contents($url, False, $ctx);    

  10. echo$result;    

  11. ?>    

<?php $url = "http://justwinit.cn/"; $ctx = stream_context_create(array( 'http' => array('timeout' => 5, 'proxy' => 'tcp://60.175.203.243:8080', 'request_fulluri' => True,) ) ); $result = file_get_contents($url, False, $ctx); echo $result; ?>




附录:代理服务器的类型

代理服务器的类型很多,如HTTP代理、FTP代理、SOCKS代理等,每种代理对应其自身的功能。
HTTP代理:能够代理客户机的HTTP访问,主要是代理浏览器访问网页,它的端口一般为80、8080、3128等;
FTP代理:能够代理客户机上的FTP软件访问FTP服务器,它的端口一般为21、2121;
RTSP代理:代理客户机上的Realplayer访问Real流媒体服务器的代理,其端口一般为554;
POP3代理:代理客户机上的邮件软件用POP3方式收发邮件,端口一般为110;
SOCKS代理:SOCKS代理与其他类型的代理不同,它只是简单地传递数据包,而并不关心是何种应用协议,既可以是HTTP请求,所以SOCKS代理服务器比其他类型的代理服务器速度要快得多。SOCKS代理又分为SOCKS4和SOCKS5,二者不同的是SOCKS4代理只支持TCP协议(即传输控制协议),而SOCKS5代理则既支持TCP协议又支持UDP协议(即用户数据包协议),还支持各种身份验证机制、服务器端域名解析等。SOCK4能做到的SOCKS5都可得到,但SOCKS5能够做到的SOCKS则不一定能做到,比如我们常用的聊天工具QQ在使用代理时就要求用SOCKS5代理,因为它需要使用UDP协议来传输数据。

从另一个角度来说,代理可以分为三种,即高度匿名代理、普通匿名代理和透明代理。高度匿名代理不改变客户机的请求,这样在服务器看来就像有个真正的客户浏览器在访问它,这时客户的真实IP是隐藏的,服务器端不会认为我们使用了代理;普通匿名代理能隐藏客户机的真实IP,但会改编我们的请求信息,服务器端有可能会认为我们使用了代理(仅仅是可能而已,一般说来是没问题的),但其实这种代理的安全性可能比高度匿名代理更高,有的代理甚至会剥离客户机发送信息中的一部分,这样服务器端就根本探测不到我们所用的操作系统版本和浏览器版本;第三种是透明代理,它不但改编我们的请求信息,还会传送真实的IP地址