IP地址的位置检测技术
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IP地址的位置检测技术相关的知识,希望对你有一定的参考价值。
IP地址的位置检测技术有哪些?
我知道要看看
$_SERVER['HTTP_ACCEPT_LANGUAGE']
(不准确,但主要用于检测位置,例如,如果IP范围的用户将法语设置为浏览器,那么这意味着此范围)属于法国
和
gethostbyaddr($_SERVER['REMOTE_ADDR'])
(看国家代码顶级域名)
然后可能是谁gethostbyaddr($_SERVER['REMOTE_ADDR'])
有时:
$HTTP_USER_AGENT
(Firefox的用户代理字符串有语言代码,不准确但主要用于检测位置)
我也知道如何获得时区,但它在新浏览器中不起作用。此外还有css issue可以检测到访客的历史记录,它可以用来查看他/她访问过的谷歌和维基百科页面(google.co.uk,google.com.tr)
但是城市呢?
如果没有将IP地址映射到城市/国家/提供商的数据库,则无法执行此操作。您可以使用ip2location等商业产品。 AFAIK虽然没有免费的替代方案,因为维护这样的IP数据库是相当多的工作。 免费替代:GeoIP2
更新:如果您投入足够的时间,有几件事可以让您创建这样的数据库:
- 使用regional and local registries提供的数据库查找IP的所有者。
- 许多ISP使用允许您定位用户的命名模式。有时,如果您进行反向DNS查找,您甚至可以以纯文本格式阅读城市名称。有时它更神秘。例如我目前有p5dcf6c4a.dip.t-dialin.net,我不知道命名方案是..
- 使用traceroute。如果您无法识别用户的位置,您仍然可以找到其上行链路的位置
如果您正在寻找一些复制 - 粘贴解决方案,我发现此代码:
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;
}
希望这有助于某人。
有数据库(其中一些是免费的)可用于将IP转换为城市:
例如:http://www.maxmind.com/app/geolitecity
您可以使用数据库或API(托管数据库)将IP地址映射到其位置(城市,国家/地区,邮政编码),时区等。
这是使用API的示例
curl https://ipapi.co/city/
> Mountain View
curl https://ipapi.co/country/
> US
curl https://ipapi.co/timezone/
> America/Los_Angeles
我建议您使用自托管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`";
你可以使用这个功能
function ip_info(){
return $data = json_decode(file_get_contents('http://ip-api.com/json/'),true);
}
调用该函数
$info = ip_info();
var_dump($info);
编译这些数据库的一种方法是来自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服务器版本2.0
.com和.net域中的域名现在可以在许多不同的竞争注册商中注册。
<SNIP>
>注册人:stackoverflow.com llc 410 Clayton Ave El Cerrito,加利福尼亚州94530美国
<SNIP>
显然这不是非常准确,因此据称使用了更复杂的技术。
如果地理定位功能对您的项目不是一个大的要求,您可以使用如下这样简单的东西:
$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。
大多数现有数据库使用来自国际注册局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
以上是关于IP地址的位置检测技术的主要内容,如果未能解决你的问题,请参考以下文章