当前位置:  开发笔记 > 编程语言 > 正文

从IP地址获取位置

如何解决《从IP地址获取位置》经验,为你挑选了15个好方法。

我想从他们的IP地址检索访问者的城市,州和国家等信息,以便我可以根据他们的位置自定义我的网页.有没有一种好的,可靠的方法在PHP中执行此操作?我使用JavaScript进行客户端脚本编写,使用PHP进行服务器端脚本编写,使用MySQL进行数据库访问.



1> Ben Dowling..:

您可以下载免费的GeoIP数据库并在本地查找IP地址,也可以使用第三方服务并执行远程查找.这是一个更简单的选项,因为它不需要设置,但它确实引入了额外的延迟.

您可以使用的第三方服务是我的,http://ipinfo.io.它们提供主机名,地理位置,网络所有者和其他信息,例如:

$ curl ipinfo.io/8.8.8.8
{
  "ip": "8.8.8.8",
  "hostname": "google-public-dns-a.google.com",
  "loc": "37.385999999999996,-122.0838",
  "org": "AS15169 Google Inc.",
  "city": "Mountain View",
  "region": "CA",
  "country": "US",
  "phone": 650
}

这是一个PHP示例:

$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("http://ipinfo.io/{$ip}/json"));
echo $details->city; // -> "Mountain View"

您也可以在客户端使用它.这是一个简单的jQuery示例:

$.get("https://ipinfo.io/json", function (response) {
    $("#ip").html("IP: " + response.ip);
    $("#address").html("Location: " + response.city + ", " + response.region);
    $("#details").html(JSON.stringify(response, null, 4));
}, "jsonp");

Client side IP geolocation using ipinfo.io



Full response:


2> Jamie Hutber..:

以为我发布的内容似乎没有人给出关于这个特定API的信息,但它正好归还了我所追求的,你可以让它以多种格式返回,json, xml and csv.

 $location = file_get_contents('http://freegeoip.net/json/'.$_SERVER['REMOTE_ADDR']);
 print_r($location);

这将为您提供您可能想要的所有东西:

{
      "ip": "77.99.179.98",
      "country_code": "GB",
      "country_name": "United Kingdom",
      "region_code": "H9",
      "region_name": "London, City of",
      "city": "London",
      "zipcode": "",
      "latitude": 51.5142,
      "longitude": -0.0931,
      "metro_code": "",
      "areacode": ""

}


大多下来,很少给任何地区或城市
Tony在Azure的服务似乎快速可靠:[freegeoip2](https://freegeoip2.azurewebsites.net/Home/)

3> null..:

您需要使用外部服务...例如http://www.hostip.info/如果您搜索"geo-ip",您可以获得更多结果.

Host-IP API是基于HTTP的,因此您可以根据需要在PHP或JavaScript中使用它.


我一直在使用hostip.info一年,我没有留下深刻的印象.它通常返回未知的9/10检查
请记住,任何服务只会与可用的公共信息/数据一样好.由于隐私原因,此信息只能"非常好".如果它让你的国家正确,至少关闭州/省,我会认为是胜利.如果您正在使用此查找DOS攻击的信息,请记住IP甚至可能无效(未分配给任何人或在有效的公共IP范围之外).

4> 小智..:

使用Google APIS:




`Loader中的地理定位功能本身尚未退役.我们几年前就停止了记录,并推荐了基于HTML的解决方案,因为它们的准确性有所提高,但目前尚未从Loader中删除功能本身.http://code.google.com/p/google -ajax的API /问题/细节?ID = 586

5> Jaimes..:

我使用ipapi.co中的API编写了一个机器人,以下是如何获取IP地址的位置(例如1.2.3.4)php:

设置标题:

$opts = array('http'=>array('method'=>"GET", 'header'=>"User-Agent: mybot.v0.7.1"));
$context = stream_context_create($opts);

获取JSON响应

echo file_get_contents('https://ipapi.co/1.2.3.4/json/', false, $context);

得到一个特定的领域(国家,时区等)

echo file_get_contents('https://ipapi.co/1.2.3.4/country/', false, $context);



6> Kurt Van den..:

一个纯Javascript示例,使用https://geoip-db.com的服务它们提供了JSON和JSONP回调解决方案.

JSON:https://geoip-db.com/json

JSONP回调:https://geoip-db.com/jsonp

不需要jQuery!




Geo City Locator by geolocation-db.com


    
Country:
State:
City:
Postal:
Latitude:
Longitude:
IP address:



7> jinzai..:

这个问题受到保护,我理解.但是,我没有在这里看到答案,我看到的是很多人通过提出同样的问题来展示他们想出的结果.

目前有五个区域互联网注册管理机构具有不同程度的功能,可作为知识产权所有权的第一联络点.这个过程是不断变化的,这就是为什么这里的各种服务有时会起作用而在其他时候不起作用的原因.

但是(显然)是一个古老的TCP协议 - 它最初工作的方式是通过连接到端口43,这使得它通过租用连接,通过防火墙等进行路由成为问题.

此时 - 大多数Who是通过RESTful HTTP和ARIN完成的,RIPE和APNIC具有可用的RESTful服务.LACNIC返回503,AfriNIC显然没有这样的API.(但都有在线服务.)

这将得到你 - 知识产权注册所有者的地址,但是 - 不是你客户的位置 - 你必须从他们那里得到它,而且 - 你必须要求它.此外,在验证您认为是创建者的IP时,代理是您最不担心的.

人们并不欣赏他们被追踪的想法,所以 - 我的想法是 - 直接从他们的客户那里得到它并得到他们的许可,并期望很多人对这个概念犹豫不决.



8> Isaac Waller..:

查看来自hostip.info的API - 它提供了大量信息.
PHP中的示例:

$data = file_get_contents("http://api.hostip.info/country.php?ip=12.215.42.19");
//$data contains: "US"

$data = file_get_contents("http://api.hostip.info/?ip=12.215.42.19");
//$data contains: XML with country, lat, long, city, etc...

如果您信任hostip.info,它似乎是一个非常有用的API.



9> James Cape..:

假设你想自己做而不依赖其他提供者,IP2Nation提供了一个映射的MySQL数据库,这些映射在区域注册管理机构改变时会更新.



10> lpfavreau..:

我将在这里做出相同的答案,因为该服务也适用于PHP:

我喜欢Maxmind的免费GeoLite City,适用于大多数应用程序,如果它不够精确,你可以从中升级到付费版本.有一个PHP API包括在内,以及其他语言.如果您将Lighttpd作为Web服务器运行,您甚至可以使用模块为每个访问者获取SERVER变量中的信息(如果这是您需要的).

我应该补充的是,还有一个免费的 Geolite Country(如果你不需要确定IP来自哪个城市会更快)和Geolite ASN(如果你想知道谁拥有IP),最后所有这些都是可以在您自己的服务器上下载,每月更新一次,并且使用提供的API快速查找,因为它们表示"每秒数千次查找".



11> Ian Hunter..:

PHP有一个扩展.

来自PHP.net:

GeoIP扩展允许您查找IP地址的位置.可以在GeoIP的帮助下获得城市,州,国家,经度,纬度等所有信息,例如ISP和连接类型.

例如:

$record = geoip_record_by_name($ip);
echo $record['city'];


这只是MaxMind数据库的php模块,它是付费软件.(免费的"精简"版本非常不准确.)不是说这是一件坏事,但它实际上只对商业用途有用.

12> Isaac Askew..:

Ben Dowling的回应中的服务发生了变化,现在变得更加简单了.要查找位置,只需执行以下操作:

// no need to pass ip any longer; ipinfo grabs the ip of the person requesting
$details = json_decode(file_get_contents("http://ipinfo.io/"));
echo $details->city; // city

坐标返回单个字符串,如'31,-80',所以从那里你只需:

$coordinates = explode(",", $details->loc); // -> '31,-89' becomes'31','-80'
echo $coordinates[0]; // latitude
echo $coordinates[1]; // longitude


你是对的http://ipinfo.io默认会返回来电者IP的详细信息.如果你运行的PHP网站虽然是你服务器的IP,而不是用户的IP.这就是你需要传入$ _SERVER ['REMOTE_ADDR']的原因.如果您只是想要坐标,那么将更快地附加/定位到URL以获得该字段.

13> Jonathan..:

Ipdata.co是一种快速,高度可用的IP Geolocation API,具有可靠的性能.

它具有极高的可扩展性,全球有10个端点,每个端点每秒可处理> 10,000个请求!

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

在PHP中

php > $ip = '8.8.8.8';
php > $details = json_decode(file_get_contents("https://api.ipdata.co/{$ip}?api-key=test"));
php > echo $details->region;
California
php > echo $details->city;
Mountain View
php > echo $details->country_name;
United States
php > echo $details->latitude;
37.751

这是一个客户端示例,显示您如何获得国家,地区和城市;

$.get("https://api.ipdata.co?api-key=test", function (response) {
	$("#response").html(JSON.stringify(response, null, 4));
  $("#country").html('Country: ' + response.country_name);
  $("#region").html('Region ' + response.region);
  $("#city").html('City' + response.city);  
}, "jsonp");



14> 小智..:

万一有人偶然发现这个帖子,这是另一个解决方案.在timezoneapi.io,您可以请求IP地址并获得多个对象作为回报(我已经创建了服务).它的创建是因为我需要知道我的用户所在的时区,世界的哪个时间以及目前的时间.

在PHP中 - 返回位置,时区和日期/时间:

// Get IP address
$ip_address = getenv('HTTP_CLIENT_IP') ?: getenv('HTTP_X_FORWARDED_FOR') ?: getenv('HTTP_X_FORWARDED') ?: getenv('HTTP_FORWARDED_FOR') ?: getenv('HTTP_FORWARDED') ?: getenv('REMOTE_ADDR');

// Get JSON object
$jsondata = file_get_contents("http://timezoneapi.io/api/ip/?" . $ip_address);

// Decode
$data = json_decode($jsondata, true);

// Request OK?
if($data['meta']['code'] == '200'){

    // Example: Get the city parameter
    echo "City: " . $data['data']['city'] . "
"; // Example: Get the users time echo "Time: " . $data['data']['datetime']['date_time_txt'] . "
"; }

使用jQuery:

// Get JSON object
$.getJSON('https://timezoneapi.io/api/ip', function(data){

    // Request OK?
    if(data.meta.code == '200'){

        // Log
        console.log(data);

        // Example: Get the city parameter
        var city = data.data.city;
        alert(city);

        // Example: Get the users time
        var time = data.data.datetime.date_time_txt;
        alert(time);

    }

});



15> ttarik..:

我在IPLocate.io上运行该服务,你可以通过一个简单的电话免费挂钩:

country; // United States
echo $res->continent; // North America
echo $res->latitude; // 37.751
echo $res->longitude; // -97.822

var_dump($res);

$res对象将包含像你的地理位置字段country,city等等.

查看文档以获取更多信息.

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有