发现之前有一个脚本没有写完,简单扩充了一下。 获取IP使用的是经典的逻辑,地理定位使用的是SINA的通用接口。
使用方法详见源码:
<?php
/*
* GET LOCATION BY SINA IP INTERFACE
*
* @SOULTEARY 2013.04.14
*/
class IP
{
private $args = array();
function __construct()
{
$this->args = self::init_args(func_get_args());
$ip = self::GetIP();
$ret = preg_match_all('/(\d+\.){3}\d+/i', $ip, $result);
if (!$ret) {
return false;
} else {
$result = $result[0];
}
if (isset($this->args['ONLYIP']) && $this->args['ONLYIP'] == true) {
if (isset($this->args['FORMAT']) && $this->args['FORMAT'] == 'JSON') {
$result = json_encode($result);
} else {
$result = implode(',', $result);
}
if (isset($this->args['ECHO']) && $this->args['ECHO'] == true) {
echo $result;
return true;
} else {
return $result;
}
} else {
$apiURL = 'http://int.dpool.sina.com.cn/iplookup/iplookup.php?ip=' . $result[0];
if (isset($this->args['FORMAT']) && $this->args['FORMAT'] == 'JSON') {
$apiURL .= '&format=json';
$return = $this->ipCURL($apiURL);
} else {
$return = $this->ipCURL($apiURL);
$return = iconv("GBK//IGNORE", "UTF-8", $return);
}
if (isset($this->args['ECHO']) && $this->args['ECHO'] == true) {
echo $return;
return true;
} else {
return $return;
}
}
}
public function init_args($args)
{
$result = array();
for ($i = 0, $n = count($args); $i < $n; $i++) {
$result = self::associative_push($args[$i], $result);
}
return $result;
}
public function associative_push($arr, $tmp)
{
if (is_array($tmp)) {
foreach ($tmp as $key => $value) {
$arr[$key] = $value;
}
return $arr;
}
return false;
}
public function GetIP()
{
if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] && strcasecmp($_SERVER['HTTP_X_FORWARDED_FOR'], 'unknown')) {
return $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
return $_SERVER['REMOTE_ADDR'];
}
}
private function ipCURL($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
ob_start();
curl_exec($ch);
curl_close($ch);
$result = ob_get_contents();
ob_end_clean();
return $result;
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf8">
<title>demo</title>
<script type="text/javascript">
var ip = "<?php new IP(array('ONLYIP'=>true, 'ECHO'=>true));?>";
var data = <?php new IP(array('FORMAT'=>'JSON','ECHO'=>true));?>;
var result = '';
for (oo in data) {
result += oo + ':' + data[oo] + "\n";
}
alert(result + ip);
</script>
</head>
<body>
<h1>CODE:</h1>
<h2>GETIP</h2>
<p>'ONLYIP'=>true, 'ECHO'=>true</p>
<p><?php new IP(array('ONLYIP' => true, 'ECHO' => true));?></p>
<P>'ONLYIP'=>true, 'FORMAT'=>'JSON', 'ECHO'=>true</P>
<p><?php new IP(array('ONLYIP' => true, 'FORMAT' => 'JSON', 'ECHO' => true));?></p>
<h2>GET Location</h2>
<p>'ECHO'=>true</p>
<p><?php new IP(array('ECHO' => true));?></p>
<p>'FORMAT'=>'JSON','ECHO'=>true</p>
<p><?php new IP(array('FORMAT' => 'JSON', 'ECHO' => true));?></p>
</body>
</html>