IP地址的位置检测技术

时间:2010-04-04 13:41:24

标签: http geolocation

IP地址的位置检测技术有哪些?
我知道要看看 $_SERVER['HTTP_ACCEPT_LANGUAGE'](不准确,但对于检测位置非常有用,例如,如果IP范围的用户将法语设置为浏览器,则意味着此范围)属于法国

gethostbyaddr($_SERVER['REMOTE_ADDR'])(查看国家/地区代码顶级域名)
然后可能是whois gethostbyaddr($_SERVER['REMOTE_ADDR'])
有时:
$HTTP_USER_AGENT(Firefox的用户代理字符串包含语言代码,不准确,但主要用于检测位置)

此外,我知道如何获取时区,但它在新浏览器中不起作用。 此外,css issue可以检测访问者的历史记录,可以用来查看他/她访问过的google和维基百科页面(google.co.uk,google.com.tr)

但是城市呢?

9 个答案:

答案 0 :(得分:9)

如果没有将IP地址映射到城市/国家/提供商的数据库,则无法执行此操作。您可以使用诸如ip2location之类的商业产品。但是,AFAIK没有免费的替代方案,因为维护这样一个IP数据库是相当多的工作。免费替代方案:GeoIP2

<强>更新 如果您投入足够的时间,有几件事情可以让您创建这样的数据库:

  1. 使用regional and local registries提供的数据库查找IP的所有者。
  2. 许多ISP使用允许您定位用户的命名架构。有时你可以 如果进行反向DNS查找,甚至以纯文本格式读取城市名称。有时它是 更神秘。例如,我目前有p5dcf6c4a.dip.t-dialin.net,我没有 认为命名方案是......
  3. 使用traceroute。如果您无法识别用户的位置,您仍然可以找到答案 其上行链路的位置

答案 1 :(得分:5)

如果您正在寻找一些复制粘贴解决方案,我找到了以下代码:

    function countryCityFromIP($ipAddr)
{
//function to find country and city from IP address
//Developed by Roshan Bhattarai http://roshanbh.com.np

//verify the IP address for the
ip2long($ipAddr)== -1 || ip2long($ipAddr) === false ? trigger_error("Invalid IP", E_USER_ERROR) : "";
$ipDetail=array(); //initialize a blank array

//get the XML result from hostip.info
$xml = file_get_contents("http://api.hostip.info/?ip=".$ipAddr);

//get the city name inside the node <gml:name> and </gml:name>
preg_match("@<Hostip>(\s)*<gml:name>(.*?)</gml:name>@si",$xml,$match);

//assing the city name to the array
$ipDetail['city']=$match[2]; 

//get the country name inside the node <countryName> and </countryName>
preg_match("@<countryName>(.*?)</countryName>@si",$xml,$matches);

//assign the country name to the $ipDetail array
$ipDetail['country']=$matches[1];

//get the country name inside the node <countryName> and </countryName>
preg_match("@<countryAbbrev>(.*?)</countryAbbrev>@si",$xml,$cc_match);
$ipDetail['country_code']=$cc_match[1]; //assing the country code to array

//return the array containing city, country and country code
return $ipDetail;

}

希望这有助于某人。

答案 2 :(得分:3)

有数据库(其中一些是免费的)可用于将IP转换为城市:

例如:http://www.maxmind.com/app/geolitecity

答案 3 :(得分:3)

您可以使用数据库或API(托管数据库)将IP地址映射到其位置(城市,国家/地区,邮政编码),时区等。

以下是使用API​​的示例

curl https://ipapi.co/city/ 
> Mountain View

curl https://ipapi.co/country/
> US

curl https://ipapi.co/timezone/
> America/Los_Angeles 

更多信息:Location from IP address

答案 4 :(得分:1)

我建议您使用自托管IP记录,而不是使用第三方API。这篇文章解释了你更多

http://www.techsirius.com/2014/05/simple-geo-tracking-system.html

基本上他们使用maxmind的国家城市IP数据库记录[http://dev.maxmind.com/geoip/geoip2/geolite2/],几乎没有修改。之后是一个示例查询

$ip =  $_SERVER['REMOTE_ADDR'];
$long = sprintf('%u', ip2long($ip));
$sql = "SELECT * FROM `geo_ips` WHERE '$long' BETWEEN `ip_start` AND `ip_end`";

答案 5 :(得分:1)

你可以使用这个功能

 function ip_info(){
            return $data = json_decode(file_get_contents('http://ip-api.com/json/'),true);
        }

调用函数

$info = ip_info();
var_dump($info);

答案 6 :(得分:0)

编译这些数据库的一种方法是使用whois信息。例如,要确定69.59.196.211的位置:

  

fmark @ home:〜$ host 69.59.196.211   211.196.59.69.in-addr.arpa域名指针stackoverflow.com。   fmark @ home:〜$ whois stackoverflow.com

     

Whois Server版本2.0

     

.com和.net中的域名   域名现在可以注册   许多不同的竞争注册商。

 <SNIP>
     

<强>&GT;注册人:stackoverflow.com llc
  410 Clayton Ave El Cerrito,   加利福尼亚州94530美国

 <SNIP>

显然这并不是非常准确,因此据称使用了更复杂的技术。

答案 7 :(得分:0)

如果地理位置功能对您的项目不是一个大的要求,您可以使用这样简单的东西:

$geotxt='';
$dt=json_decode(@file_get_contents('https://freegeoip.net/json/'.$_SERVER['REMOTE_ADDR']));
if ($dt!=null) $geotxt=$dt->country_name.', '.$dt->region_name.', '.$dt->city;
echo $geotxt;

您必须考虑到freegeoip的每小时限制为10k。

答案 8 :(得分:0)

大多数现有数据库使用来自国际注册局ARIN,AFRINIC,ANIC等的数据汇总以及用户提交的位置。更复杂的技术包括拓扑和约束地理定位。

我运行自己的API ipdata.co,提供多个数据点,包括国家/地区,城市,地区,纬度/经度等。

  

这个答案使用的“测试”API密钥非常有限,仅用于测试几个调用。 Signup用于您自己的免费API密钥,每天最多可获得1500个请求以进行开发。

php > $data = json_decode(file_get_contents('https://api.ipdata.co/69.59.196.211?api-key=test'),true);
php > echo $data['country_name'];
//United States
php > echo $data['city'];
//Albany