手头一个项目,需要获取远程站点的一些图片,遇到一些小问题所以稍微调查了一下。由于站点那端做了一些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;
}
?>