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)
但是城市呢?
答案 0 :(得分:9)
如果没有将IP地址映射到城市/国家/提供商的数据库,则无法执行此操作。您可以使用诸如ip2location之类的商业产品。但是,AFAIK没有免费的替代方案,因为维护这样一个IP数据库是相当多的工作。免费替代方案:GeoIP2
<强>更新强> 如果您投入足够的时间,有几件事情可以让您创建这样的数据库:
答案 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转换为城市:
答案 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
答案 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