手头一个项目,需要获取远程站点的一些图片,遇到一些小问题所以稍微调查了一下。由于站点那端做了一些Check,首先屏蔽了非浏览器的访问,其次屏蔽了高频率的访问,导致我们无法跑抓图片的程序。

        服务端要对客户端的请求做筛选,在程序这一层能做得无非就是对HTTP_HEAD做检查,这种屏蔽的程序以前也做过,以后有机会再贴代码。

根据这个思路,对应方式无非几个

1.模拟IE,Chrome等头信息。

curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11"); 

可以多准备几条,压到一个数组里面,然后随机使用这些头。

我们这个代码暂时还不需要,所以代码里面没有这部分逻辑。

2.随机产生客户端IP,使得服务端无法判断高频访问。

curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR:111.222.333.4', 'CLIENT-IP:' . $ip));

这里的IP可以像我下面的代码一样随机产生,也可以来源于预制数组。

通过如下代码,轻松获取远程图片。

代码:

<?php
    $downLoadUrl = "http://www.baidu.com/xxxx.jpg";
    try {
	// Radom IP  $ip_long = array(
          array('607649792', '608174079'), //36.56.0.0-36.63.255.255
	  array('1038614528', '1039007743'), //61.232.0.0-61.237.255.255
	  array('1783627776', '1784676351'), //106.80.0.0-106.95.255.255
	  array('2035023872', '2035154943'), //121.76.0.0-121.77.255.255
	  array('2078801920', '2079064063'), //123.232.0.0-123.235.255.255
	  array('-1950089216', '-1948778497'), //139.196.0.0-139.215.255.255
	  array('-1425539072', '-1425014785'), //171.8.0.0-171.15.255.255
	  array('-1236271104', '-1235419137'), //182.80.0.0-182.92.255.255
	  array('-770113536', '-768606209'), //210.25.0.0-210.47.255.255
	  array('-569376768', '-564133889'), //222.16.0.0-222.95.255.255
	);
	$rand_key = mt_rand(0, 9);
	$ip= long2ip(mt_rand($ip_long[$rand_key][0], $ip_long[$rand_key][1]));
	//echo $ip;
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR:111.222.333.4', 'CLIENT-IP:' . $ip));
	curl_setopt($ch, CURLOPT_REFERER, "http://www.test.com");
	curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11");			
	curl_setopt($ch, CURLOPT_URL, $downLoadUrl);
	curl_exec($ch);
	$img = ob_get_contents();
	curl_close($ch);

        } catch (Exception $e) {
	    echo $e;
	}
?>
最后修改日期: 2015年7月1日

作者