使用Javascript实现IP到位置的转换

55
<script type="application/javascript">
    function getip(json){
      alert(json.ip); // alerts the ip address
    }
</script>

<script type="application/javascript" src="http://jsonip.appspot.com/?callback=getip"></script>

我可以通过这段代码获取用户的IP地址...

我想要找到这个IP的位置。 我该怎么做?


2
“location”是什么意思?指的是纬度/经度吗? - Matt Ball
4
请注意,您获得的经纬度可能不是非常准确的。我的家庭IP地址显示在离我实际位置约30英里的地方;它显示我的ISP所在的位置。根据您的使用情况,这可能足够好,但您应该了解其局限性。 - Stephen P
问题不是关于编程本身,而是如何从“IP”获取“位置”。 - serge
12个回答

60
您可以将收到的IP提交给在线地理位置服务,例如http://www.geoplugin.net/json.gp?ip=<your ip here>&jsoncallback=<suitable javascript function in your source>,然后包括返回的源代码并运行您在jsoncallback中指定的函数以获取地理位置信息。
另外,您可能想研究HTML5的地理位置功能——您可以在此处此处查看其演示。这样做的优点是您无需向外部服务器发送请求,但它可能无法在不支持HTML5的浏览器上运行。

2
我该如何在我的JavaScript中调用这个API而不会遇到CORS问题? - mishap
你可以参考我的回答 https://dev59.com/VnRC5IYBdhLWcg3wKtv2 获取所有免费IP查找服务的列表。 - thdoan
2
现在(2021年),为了能够使用https而不是http,此服务需要付费订阅。在https托管的网站内部使用API中的http将被浏览器阻止。 - Anubhab Maji

32

这里提供一个运行在MaxMind数据库上的免费开源社区运行的地理位置IP服务: https://ipstack.com/

示例

https://api.ipstack.com/160.39.144.19

限制

每月10,000个查询


4
尽管freegeoip.net使用MaxMind数据库,但该服务与该公司完全没有关系。它是由社区支持并由本人维护的开源免费软件,未经MaxMind的同意。 - fiorix
@fiorix 谢谢 - 我不知道。已更新答案。 - Alex Czarto
4
它已经被迁移到 https://ipstack.com 并且现在提供付费服务。然而,免费许可证的10,000个查询限制应该足够了。请注意,它不再是每小时计算,而是每月计算。 - jjj
2
免费计划不支持API调用使用HTTPS。 - hardik chugh

20

使用将IP地址映射到位置的API很容易。运行片段以获取输入框中IP的城市和国家。

$('.send').on('click', function(){

  $.getJSON('https://ipapi.co/'+$('.ip').val()+'/json', function(data){
      $('.city').text(data.city);
      $('.country').text(data.country);
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<input class="ip" value="8.8.8.8">
<button class="send">Go</button>
<br><br>
<span class="city"></span>, 
<span class="country"></span>


现在(2021年),此代码片段在SO内运行时会抛出CORS错误,他们的技术支持表示当API返回错误响应时存在CORS问题。在我的研究中,它会抛出404错误。我不知道为什么会抛出该错误。在某些端口上在本地主机上运行时,同样会出现CORS错误,他们报告说他们有一些端口问题。即使在CloudFront上托管后,仍然是相同的CORS错误,无法找出其他原因。 - Anubhab Maji

8
更好的方式是跳过“中间人”(IP)。
jQuery.get("http://ipinfo.io", function(response) {
    console.log(response.city);
}, "jsonp");

这将为您提供IP城市国家等信息。

6

如果您无法完成上述代码,这里有一个使用jquery的简单方法:

$.getJSON("http://www.geoplugin.net/json.gp?jsoncallback=?",
    function (data) {
        for (var i in data) {
            document.write('data["i"] = ' + i + '<br/>');
        }
    }
);

新的URL是http://www.geoplugin.net/json.gp,IP地址不是必需的,但它比freegeoip提供的经纬度信息要少精确。 - Nico
1
此服务没有 SSL,因此被 Chrome 等阻止。 - Apps-n-Add-Ons
1
@CFPSupport 是的,现在HTTP请求被阻止了,所以我们可能需要使用HTTPS支持,但这将会产生费用。请访问https://www.geoplugin.com/premium#ssl_access_per_year。 - talsibony

3
你可以使用 ipgeolocation,这是一个免费的IP API,提供国家、城市、州、省、纬度、经度等信息。
 let apiKey = "your_api_key_here"; 

  async function getLocation (ip) {
  let url = `https://api.ipgeolocation.io/ipgeo?apiKey=${apiKey}&ip=${ip}`;

  await fetch(url).then((response) =>
    response.json().then((json) => {
      const output = `
          ---------------------
          Country: ${json.country_name}
          State: ${json.state_prov}
          City: ${json.city}
          District: ${json.district}
          Lat / Long: (${json.latitude}, ${json.longitude})
          ---------------------
          `;
      console.log(output);
    })
  );
};

 getLocation('154.28.188.208') // prints the location 

enter image description here


3
一种相对便宜的选择是使用ipdata.co API,每天免费提供1500个请求。请注意,本回答使用的是一个非常有限的“测试”API密钥,仅用于测试几个调用。注册获取您自己的免费API密钥,以便进行开发,并每天获得多达1500个请求。

$.get("https://api.ipdata.co?api-key=test", function (response) {
    $("#ip").html("IP: " + response.ip);
    $("#city").html(response.city + ", " + response.region);
    $("#response").html(JSON.stringify(response, null, 4));
}, "jsonp");
<h1><a href="https://ipdata.co">ipdata.co</a> - IP geolocation API</h1>

<div id="ip"></div>
<div id="city"></div>
<pre id="response"></pre>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

请访问https://jsfiddle.net/ipdata/6wtf0q4g/922/查看代码示例。


2
    $.getJSON('//freegeoip.net/json/?callback=?', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

这已经被关闭了! - Hossein Badrnezhad

2

你应该删除重复的评论。 - Matt Ball
1
@10basetom Geoip服务经常会出现故障,因为它们的运营成本高昂且往往会吸引大量免费流量。以下是一些替代方案,截至2015/01:http://ip-api.com/json http://freegeoip.net/json/8.8.8.8 - Nick Sweeting

2

以下任意一个链接都可以解决这个问题:

http://ipinfodb.com/ip_location_api_json.php

http://www.adam-mcfarland.net/2009/11/19/simple-ip-geolocation-using-javascript-and-the-google-ajax-search-api/

这些链接提供了通过Javascript获取用户位置的教程。但是,它们是通过API连接到外部数据服务来实现的。如果您有一个极高流量的网站,您可能希望自己托管数据(或者使用高级API服务)。要自己托管所有内容,您需要托管一个包含IP地理位置信息的数据库,并使用ajax将用户位置输入Javascript。如果您想采取这种方法,可以在下面获取免费的IP信息数据库:

http://www.ipinfodb.com/ip_database.php

请注意,此方法需要定期更新数据库以确保跟踪IP地址到位置的准确性。


adam-mcfarland.net 上的 Google API 版本非常适合我所需! - Josh Mountain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接