技术相关 · 2015年4月21日

think php 的 IP定位与判断来自用户还是蜘蛛爬虫

废话不多说,先上代码

//判断是否为爬虫
function ist_crawler() {
	$userAgent = strtolower($_SERVER['HTTP_USER_AGENT']);
	$spiders = array(
		'Googlebot', // Google 爬虫
		'Baiduspider', // 百度爬虫
		'Yahoo! Slurp', // 雅虎爬虫
		'YodaoBot', // 有道爬虫
		'msnbot',// Bing爬虫
		'360spider',//360爬虫
		'sosospider'//soso爬虫
		// 更多爬虫关键字
	);
	foreach ($spiders as $spider) {   //判断是否为爬虫
		$spider = strtolower($spider);
		if (strpos($userAgent, $spider) !== false) {
			return true;
		}
	}
	return false;
}

定义个函数,利用

$_SERVER['HTTP_USER_AGENT']

来判断是否是爬虫。中间可以添加更多的爬虫。

下面IP定位有两种代码。

一是自己下载IP地址库,到thinkPHP 的/MyApp/ORG/Net/

		if(ist_crawler()){  //如果是爬虫
			//print_r($userAgent);
			return false;
		}
		else{     //不是爬虫
			import('@.ORG.Net.IpLocation');// 导入IpLocation类
			$Ip = new IpLocation('UTFWry.dat');// 实例化类 
			//$ipt = get_client_ip();
			if(getenv("HTTP_X_FORWARDED_FOR")){   //判断是否来自代理
			$ipt = getenv("HTTP_X_FORWARDED_FOR");
		    }
			else if(getenv("HTTP_CLIENT_IP")){
				$ipt = getenv("HTTP_CLIENT_IP");
			}
		    else if(getenv("REMOTE_ADDR")){  //外围IP
			$ipt = getenv("REMOTE_ADDR");
		    }
			$area = $Ip->getlocation($ipt); //根据IP地址库信息
			//print_r($area);
			$try = $area[country]; 
			$try = explode("市",$try);  //分割地区数组数值
			$try =$try[0];
			$country = explode("省",$try);
			$try =$country[0];  //省份
			$cont = $country[1]; //市区
		}

二是定义接口,可以来自淘宝,百度等。

/*** 获取 IP  地理位置* 淘宝IP接口* @Return: array */
function getCity($ip)
		{
			$url="http://ip.taobao.com/service/getIpInfo.php?ip=".$ip;
			$ip=json_decode(file_get_contents($url));   
			if((string)$ip->code=='1'){
				return false;
			}
			$data = (array)$ip->data;
			return $data;   
		}
/** * 获取用户真实 IP */
function getIP()
		{
			static $realip;
			if (isset($_SERVER)){
				if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])){
					$realip = $_SERVER["HTTP_X_FORWARDED_FOR"];
				} else if (isset($_SERVER["HTTP_CLIENT_IP"])) {
					$realip = $_SERVER["HTTP_CLIENT_IP"];
				} else {
					$realip = $_SERVER["REMOTE_ADDR"];
				}
			} else {
				if (getenv("HTTP_X_FORWARDED_FOR")){
					$realip = getenv("HTTP_X_FORWARDED_FOR");
				} else if (getenv("HTTP_CLIENT_IP")) {
					$realip = getenv("HTTP_CLIENT_IP");
				} else {
					$realip = getenv("REMOTE_ADDR");
				}
			}


			return $realip;
		}

if(ist_crawler()){
			$cont = "厦门市" ;
			return $cont;
		} 
		else{
		$ip = getIP();
		$address = getCity($ip);
		$try =$address['region'];  //省份
		$cont = $address['city']; //市区
		}

最后

$this->assign('try',$try);
$this->assign('cont',$cont);

在模板输出变量就好了!