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

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

  1. 使用regional and local registries提供的数据库查找IP的所有者。
  2. 许多ISP使用允许您定位用户的命名模式。有时,如果您进行反向DNS查找,您甚至可以以纯文本格式阅读城市名称。有时它更神秘。例如我目前有p5dcf6c4a.dip.t-dialin.net,我不知道命名方案是..
  3. 使用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 

更多这里:Location from IP address

另一答案

我建议您使用自托管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地址的位置检测技术的主要内容,如果未能解决你的问题,请参考以下文章

通过 IP 地址确定用户位置的最新技术是啥? [关闭]

怎样根据ip察地理位置??

如何通过IP地址得到用户所在的城市名?怎样写代码?

借助设备 IP 地址获取国家代码

python访问你自己的公网ip地址的代码

python查询公网IP地址、IP地理位置