从IP地址获取位置

192 php ip geolocation geoip

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

Ben*_*ing 238

您可以下载免费的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
}
Run Code Online (Sandbox Code Playgroud)

这是一个PHP示例:

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

您也可以在客户端使用它.这是一个简单的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");
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<h3>Client side IP geolocation using <a href="http://ipinfo.io">ipinfo.io</a></h3>

<hr/>
<div id="ip"></div>
<div id="address"></div>
<hr/>Full response: <pre id="details"></pre>
Run Code Online (Sandbox Code Playgroud)

  • 似乎不是一项非常可靠的服务。我的城市名叫“ null”。它不像一个小城市之类的东西,但仍然找不到它。如果在美国境内无法正常运行,我怀疑它还会在美国以外多久返回一次null。 (2认同)
  • 结果不准确..地区,城市邮政 (2认同)
  • 警告:截至2019年1月,有人报告说该ipinfo网址在病毒总数上为_unsafe_,这是由于木马造成的。选票在2015年至2018年之间 (2认同)

Jam*_*ber 57

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

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

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

{
      "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": ""

}
Run Code Online (Sandbox Code Playgroud)

  • 大多下来,很少给任何地区或城市 (2认同)
  • Tony在Azure的服务似乎快速可靠:[freegeoip2](https://freegeoip2.azurewebsites.net/Home/) (2认同)
  • 不幸的是,根据此消息,此服务将于 2018 年 7 月 1 日断开连接:“此 API 端点已弃用,并将于 2018 年 7 月 1 日停止工作。有关更多信息,请访问:https://github.com/apilayer/freegeoip#readme \ (2认同)

nul*_*ull 15

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

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

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

小智 15

使用Google APIS:

<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script>
contry_code = google.loader.ClientLocation.address.country_code
city = google.loader.ClientLocation.address.city
region = google.loader.ClientLocation.address.region
</script>
Run Code Online (Sandbox Code Playgroud)

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

Jai*_*mes 14

我使用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);
Run Code Online (Sandbox Code Playgroud)

获取JSON响应

echo file_get_contents('https://ipapi.co/1.2.3.4/json/', false, $context);
Run Code Online (Sandbox Code Playgroud)

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

echo file_get_contents('https://ipapi.co/1.2.3.4/country/', false, $context);
Run Code Online (Sandbox Code Playgroud)


Kur*_*den 14

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

不需要jQuery!

<!DOCTYPE html>
<html>
<head>
<title>Geo City Locator by geolocation-db.com</title>
</head>
<body>
    <div>Country: <span id="country"></span></div>
    <div>State: <span id="state"></span></div>
    <div>City: <span id="city"></span></div>
    <div>Postal: <span id="postal"></span></div>
    <div>Latitude: <span id="latitude"></span></div>
    <div>Longitude: <span id="longitude"></span></div>
    <div>IP address: <span id="ipv4"></span></div>                             
</body>
<script>

    var country = document.getElementById('country');
    var state = document.getElementById('state');
    var city = document.getElementById('city');
    var postal = document.getElementById('postal');
    var latitude = document.getElementById('latitude');
    var longitude = document.getElementById('longitude');
    var ip = document.getElementById('ipv4');

    function callback(data)
    {
        country.innerHTML = data.country_name;
        state.innerHTML = data.state;
        city.innerHTML = data.city;
        postal.innerHTML = data.postal;
        latitude.innerHTML = data.latitude;
        longitude.innerHTML = data.longitude;
        ip.innerHTML = data.IPv4;
    }

    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = 'https://geoilocation-db.com/json/geoip.php?jsonp=callback';
    var h = document.getElementsByTagName('script')[0];
    h.parentNode.insertBefore(script, h);

</script> 
</html>
Run Code Online (Sandbox Code Playgroud)


jin*_*zai 9

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

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

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

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

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

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


Isa*_*ler 8

查看来自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...
Run Code Online (Sandbox Code Playgroud)

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


Jam*_*ape 7

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


lpf*_*eau 7

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

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

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


Ian*_*ter 6

PHP有一个扩展.

来自PHP.net:

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

例如:

$record = geoip_record_by_name($ip);
echo $record['city'];
Run Code Online (Sandbox Code Playgroud)

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

Isa*_*kew 6

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jon*_*han 6

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
Run Code Online (Sandbox Code Playgroud)

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

$.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");
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="country"></div>
<div id="region"></div>
<div id="city"></div>
<pre id="response"></pre>
Run Code Online (Sandbox Code Playgroud)

免责声明;

我建立了这项服务.

有关多种语言的示例,请参阅文档

也看到这个最好的IP地理位置API的详细分析.


小智 5

万一有人偶然发现这个帖子,这是另一个解决方案.在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'] . "<br>";

    // Example: Get the users time
    echo "Time: " . $data['data']['datetime']['date_time_txt'] . "<br>";

}
Run Code Online (Sandbox Code Playgroud)

使用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);

    }

});
Run Code Online (Sandbox Code Playgroud)


Vin*_*mar 5

如果您需要从 IP 地址获取位置,您可以使用可靠的地理 IP 服务,您可以在此处获取更多详细信息。它支持 IPv6。

作为奖励,它允许检查 IP 地址是 Tor 节点、公共代理还是垃圾邮件发送者。

您可以使用 javascript 或 php,如下所示。

Javascript代码:

$(document).ready(function () {
        $('#btnGetIpDetail').click(function () {
            if ($('#txtIP').val() == '') {
                alert('IP address is reqired');
                return false;
            }
            $.getJSON("http://ip-api.io/json/" + $('#txtIP').val(),
                 function (result) {
                     alert('City Name: ' + result.city)
                     console.log(result);
                 });
        });
    });
Run Code Online (Sandbox Code Playgroud)

代码:

$result = json_decode(file_get_contents('http://ip-api.io/json/64.30.228.118'));
var_dump($result);
Run Code Online (Sandbox Code Playgroud)

输出:

{
"ip": "64.30.228.118",
"country_code": "US",
"country_name": "United States",
"region_code": "FL",
"region_name": "Florida",
"city": "Fort Lauderdale",
"zip_code": "33309",
"time_zone": "America/New_York",
"latitude": 26.1882,
"longitude": -80.1711,
"metro_code": 528,
"suspicious_factors": {
"is_proxy": false,
"is_tor_node": false,
"is_spam": false,
"is_suspicious": false
}
Run Code Online (Sandbox Code Playgroud)


tta*_*rik 5

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

<?php
$res = file_get_contents('https://www.iplocate.io/api/lookup/8.8.8.8');
$res = json_decode($res);

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

var_dump($res);
Run Code Online (Sandbox Code Playgroud)

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

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