如何使用 JavaScript 获取客户端的 IP 地址? [关闭]

2024-01-15

我需要使用 JavaScript 以某种方式检索客户端的 IP 地址;没有服务器端代码,甚至没有 SSI。

但是,我并不反对使用免费的第三方脚本/服务。


我会使用一个可以返回 JSON 的 Web 服务(与 jQuery 一起使事情变得更简单)。以下是全部active我可以找到免费的 IP 查找服务以及它们返回的信息。如果您知道其他人,请添加评论,我将更新此答案。


Abstract https://www.abstractapi.com/ip-geolocation-api

let apiKey = '1be9a6884abd4c3ea143b59ca317c6b2';
$.getJSON('https://ipgeolocation.abstractapi.com/v1/?api_key=' + apiKey, function(data) {
  console.log(JSON.stringify(data, null, 2));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>

限制:

  • 每月 10,000 个请求
  • 需要注册才能获取 API 密钥

大数据云 https://www.bigdatacloud.com/ip-geolocation-apis

// Base
let apiKey = 'd9e53816d07345139c58d0ea733e3870';
$.getJSON('https://api.bigdatacloud.net/data/ip-geolocation?key=' + apiKey, function(data) {
  console.log(JSON.stringify(data, null, 2));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
// Base + Confidence Area
let apiKey = 'd9e53816d07345139c58d0ea733e3870';
$.getJSON('https://api.bigdatacloud.net/data/ip-geolocation-with-confidence?key=' + apiKey, function(data) {
  console.log(JSON.stringify(data, null, 2));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
// Base + Confidence Area + Hazard Report
let apiKey = 'd9e53816d07345139c58d0ea733e3870';
$.getJSON('https://api.bigdatacloud.net/data/ip-geolocation-full?key=' + apiKey, function(data) {
  console.log(JSON.stringify(data, null, 2));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>

限制:

  • 每月 10,000 个请求
  • 需要注册才能获取 API 密钥

云耀 https://www.cloudflare.com/

$.get('https://www.cloudflare.com/cdn-cgi/trace', function(data) {
  // Convert key-value pairs to JSON
  // https://stackoverflow.com/a/39284735/452587
  data = data.trim().split('\n').reduce(function(obj, pair) {
    pair = pair.split('=');
    return obj[pair[0]] = pair[1], obj;
  }, {});
  console.log(data);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>

限制:

  • 返回纯文本
  • 仅返回 IPv6 地址(如果有)

DB-IP https://db-ip.com/

Try it: https://api.db-ip.com/v2/free/self https://api.db-ip.com/v2/free/self

$.getJSON('https://api.db-ip.com/v2/free/self', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

Returns:

{
  "ipAddress": "116.12.250.1",
  "continentCode": "AS",
  "continentName": "Asia",
  "countryCode": "SG",
  "countryName": "Singapore",
  "city": "Singapore (Queenstown Estate)"
}

限制:

  • 每天 1,000 个请求
  • 要求非空Origin请求头

Geobytes https://geobytes.com/

Try it: http://gd.geobytes.com/GetCityDetails http://gd.geobytes.com/GetCityDetails

$.getJSON('http://gd.geobytes.com/GetCityDetails?callback=?', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

Returns:

{
  "geobytesforwarderfor": "",
  "geobytesremoteip": "116.12.250.1",
  "geobytesipaddress": "116.12.250.1",
  "geobytescertainty": "99",
  "geobytesinternet": "SA",
  "geobytescountry": "Saudi Arabia",
  "geobytesregionlocationcode": "SASH",
  "geobytesregion": "Ash Sharqiyah",
  "geobytescode": "SH",
  "geobyteslocationcode": "SASHJUBA",
  "geobytescity": "Jubail",
  "geobytescityid": "13793",
  "geobytesfqcn": "Jubail, SH, Saudi Arabia",
  "geobyteslatitude": "27.004999",
  "geobyteslongitude": "49.660999",
  "geobytescapital": "Riyadh ",
  "geobytestimezone": "+03:00",
  "geobytesnationalitysingular": "Saudi Arabian ",
  "geobytespopulation": "22757092",
  "geobytesnationalityplural": "Saudis",
  "geobytesmapreference": "Middle East ",
  "geobytescurrency": "Saudi Riyal",
  "geobytescurrencycode": "SAR",
  "geobytestitle": "Saudi Arabia"
}

限制:

  • 每小时 16,384 个请求
  • 免费计划没有 SSL (https)
  • 可以返回错误的位置

GeoIPLookup.io https://geoiplookup.io/api

$.getJSON('https://json.geoiplookup.io/?callback=?', function(data) {
  console.log(JSON.stringify(data, null, 2));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>

限制:

  • 每小时 10,000 个请求
  • 免费计划仅用于非商业用途
  • 仅返回 IPv6 地址(如果有)

地理插件 https://www.geoplugin.com/

Try it: http://www.geoplugin.net/json.gp http://www.geoplugin.net/json.gp

$.getJSON('http://www.geoplugin.net/json.gp', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

Returns:

{
  "geoplugin_request": "116.12.250.1",
  "geoplugin_status": 200,
  "geoplugin_credit": "Some of the returned data includes GeoLite data created by MaxMind, available from <a href=\\'http://www.maxmind.com\\'>http://www.maxmind.com</a>.",
  "geoplugin_city": "Singapore",
  "geoplugin_region": "Singapore (general)",
  "geoplugin_areaCode": "0",
  "geoplugin_dmaCode": "0",
  "geoplugin_countryCode": "SG",
  "geoplugin_countryName": "Singapore",
  "geoplugin_continentCode": "AS",
  "geoplugin_latitude": "1.2931",
  "geoplugin_longitude": "103.855797",
  "geoplugin_regionCode": "00",
  "geoplugin_regionName": "Singapore (general)",
  "geoplugin_currencyCode": "SGD",
  "geoplugin_currencySymbol": "&#36;",
  "geoplugin_currencySymbol_UTF8": "$",
  "geoplugin_currencyConverter": 1.4239
}

限制:

  • 每分钟 120 个请求
  • 免费计划没有 SSL (https)

黑客目标 https://hackertarget.com/geoip-ip-location-lookup/

$.get('https://api.hackertarget.com/geoip/?q=116.12.250.1', function(data) {
  // Convert key-value pairs to JSON
  // https://stackoverflow.com/a/39284735/452587
  data = data.trim().split('\n').reduce(function(obj, pair) {
    pair = pair.split(': ');
    return obj[pair[0]] = pair[1], obj;
  }, {});
  console.log(data);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>

限制:

  • 每天 100 个请求
  • 需要IP地址参数
  • 返回纯文本

ipapi https://ipapi.co/

Try it: https://ipapi.co/json/ https://ipapi.co/json/

$.getJSON('https://ipapi.co/json/', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

Returns:

{
  "ip": "116.12.250.1",
  "city": "Singapore",
  "region": "Central Singapore Community Development Council",
  "country": "SG",
  "country_name": "Singapore",
  "postal": null,
  "latitude": 1.2855,
  "longitude": 103.8565,
  "timezone": "Asia/Singapore"
}

限制:

  • 每天 1,000 个请求
  • 需要 SSL (https)
  • 要求非空Origin请求头
  • 仅返回 IPv6 地址(如果有)

IP-API https://ip-api.com/

Try it: http://ip-api.com/json http://ip-api.com/json

$.getJSON('http://ip-api.com/json', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

Returns:

{
  "as": "AS3758 SingNet",
  "city": "Singapore",
  "country": "Singapore",
  "countryCode": "SG",
  "isp": "SingNet Pte Ltd",
  "lat": 1.2931,
  "lon": 103.8558,
  "org": "Singapore Telecommunications",
  "query": "116.12.250.1",
  "region": "01",
  "regionName": "Central Singapore Community Development Council",
  "status": "success",
  "timezone": "Asia/Singapore",
  "zip": ""
}

限制:

  • 每分钟 150 个请求
  • 免费计划没有 SSL (https)

ipdata https://ipdata.co/

let apiKey = 'be0f755b93290b4c100445d77533d291763a417c75524e95e07819ad';
$.getJSON('https://api.ipdata.co?api-key=' + apiKey, function(data) {
  console.log(JSON.stringify(data, null, 2));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>

限制:

  • 每天 1,500 个请求
  • 需要注册才能获取 API 密钥
  • 需要 SSL (https)

IP Find https://ipfind.co/

let apiKey = '50e887ce-e3bb-4f00-a9b9-667597db5539';
$.getJSON('https://ipfind.co/me?auth=' + apiKey, function(data) {
  console.log(JSON.stringify(data, null, 2));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>

限制:

  • 每天 300 个请求
  • 需要注册才能获取 API 密钥

IP地理定位 https://ipgeolocation.io/

let apiKey = 'f8e0b361e8f4405c94613ab534959fdf';
$.getJSON('https://api.ipgeolocation.io/ipgeo?apiKey=' + apiKey, function(data) {
  console.log(JSON.stringify(data, null, 2));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>

限制:

  • 每月 50,000 个请求
  • 需要注册才能获取 API 密钥
  • 仅返回 IPv6 地址(如果有)

ipify https://www.ipify.org/

$.getJSON('https://api.ipify.org?format=jsonp&callback=?', function(data) {
  console.log(JSON.stringify(data, null, 2));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>

限制:

  • None

IPInfoDB https://ipinfodb.com/

let apiKey = '25864308b6a77fd90f8bf04b3021a48c1f2fb302a676dd3809054bc1b07f5b42';
$.getJSON('https://api.ipinfodb.com/v3/ip-city/?format=json&key=' + apiKey, function(data) {
  console.log(JSON.stringify(data, null, 2));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>

限制:

  • 每秒两个请求
  • 需要注册才能获取 API 密钥

ipinfo.io https://ipinfo.io/

$.getJSON('https://ipinfo.io/json', function(data) {
  console.log(JSON.stringify(data, null, 2));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>

限制:

  • 每月 50,000 个请求

知识产权登记处 https://ipregistry.co/

$.getJSON('https://api.ipregistry.co/?key=tryout', function(data) {
  console.log(JSON.stringify(data, null, 2));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>

限制:

  • 免费计划包括 100,000 个请求
  • 需要注册才能获取 API 密钥
  • 仅返回 IPv6 地址(如果有)

ipstack https://ipstack.com/(以前称为 freegeoip.net)

Try it: http://api.ipstack.com/?访问密钥= http://api.ipstack.com/116.12.250.1?access_key=7d558868069cc34f545d822af056be3c

$.getJSON('http://api.ipstack.com/<ip_address>?access_key=<your_api_key>', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

Returns:

{
  "ip": "116.12.250.1",
  "type": "ipv4",
  "continent_code": "AS",
  "continent_name": "Asia",
  "country_code": "SG",
  "country_name": "Singapore",
  "region_code": "01",
  "region_name": "Central Singapore Community Development Council",
  "city": "Singapore",
  "zip": null,
  "latitude": 1.2931,
  "longitude": 103.8558,
  "location": {
    "geoname_id": 1880252,
    "capital": "Singapore",
    "languages": [
      {
        "code": "en",
        "name": "English",
        "native": "English"
      },
      {
        "code": "ms",
        "name": "Malay",
        "native": "Bahasa Melayu"
      },
      {
        "code": "ta",
        "name": "Tamil",
        "native": "தமிழ்"
      },
      {
        "code": "zh",
        "name": "Chinese",
        "native": "中文"
      }
    ],
    "country_flag": "http://assets.ipstack.com/flags/sg.svg",
    "country_flag_emoji": "????????",
    "country_flag_emoji_unicode": "U+1F1F8 U+1F1EC",
    "calling_code": "65",
    "is_eu": false
  }
}

限制:

  • 每月 10,000 个请求
  • 需要IP地址参数
  • 需要注册才能获取 API 密钥
  • 免费计划没有 SSL (https)

jsonip.com https://getjsonip.com/

$.getJSON('https://jsonip.com/', function(data) {
  console.log(JSON.stringify(data, null, 2));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>

限制:

  • 仅返回 IPv6 地址(如果有)

JSON测试 https://www.jsontest.com/

Try it: http://ip.jsontest.com/ http://ip.jsontest.com/

$.getJSON('http://ip.jsontest.com/', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

Returns:

{
  "ip": "116.12.250.1"
}

限制:

  • 无 SSL (https)
  • 仅返回 IPv6 地址(如果有)

史努比.io https://www.snoopi.io/

let apiKey = 'ed5ebbeba257b8f262a6a9bbc0ec678e';
$.getJSON('https://api.snoopi.io/116.12.250.1?apikey=' + apiKey, function(data) {
  console.log(JSON.stringify(data, null, 2));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>

限制:

  • 每月 10,000 个请求
  • 每 2 秒 1 个请求
  • 需要IP地址参数
  • 需要注册才能获取 API 密钥

普通 JavaScript

使用现代浏览器,您可以使用本机获取API https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API而不是依赖 jQuery$.getJSON()。这是一个例子:

let apiKey = '1be9a6884abd4c3ea143b59ca317c6b2';
// Make the request
fetch('https://ipgeolocation.abstractapi.com/v1/?api_key=' + apiKey)
  // Extract JSON body content from HTTP response
  .then(response => response.json())
  // Do something with the JSON data
  .then(data => {
    console.log(JSON.stringify(data, null, 2))
  });

NOTES

  • 由于这些都是免费服务,谁知道它们何时/是否会下线(图表 A:Telize https://www.telize.com/).
  • 如果您需要更多功能和稳定性,这些服务中的大多数还提供付费套餐。
  • 正如 @skobaljic 在下面的评论中指出的那样,请求配额主要是学术性的,因为调用发生在客户端,并且大多数最终用户永远不会超过他们的配额。
  • 某些服务没有可运行的代码片段,因为它们不允许免费计划中的 SSL 连接或需要非空Origin请求标头(StackOverflow 片段被迫使用 https 并具有Origin: null在请求标头中)。

UPDATES

  • 2016 年 2 月 1 日:已删除Telize https://www.telize.com/(不再提供免费计划)
  • 2016 年 4 月 18 日:已删除自由地理网 http://freegeoip.net/(中止服务)
  • 2016 年 4 月 26 日:添加DB-IP https://db-ip.com/
  • 2016 年 4 月 26 日:添加黑客目标 https://hackertarget.com/geoip-ip-location-lookup/
  • 2016 年 7 月 6 日:恢复自由地理网 http://freegeoip.net/
  • 2016 年 7 月 6 日:已删除ip-json.rhcloud.com http://ip-json.rhcloud.com/(死链接)
  • 2016 年 12 月 21 日:已删除黑客目标 https://hackertarget.com/geoip-ip-location-lookup/(中止服务)
  • 2017 年 2 月 10 日:添加Nekudo http://geoip.nekudo.com/
  • 2017 年 4 月 20 日:添加ipapi https://ipapi.co/(感谢艾哈迈德·阿瓦伊斯)
  • 2017 年 4 月 24 日:恢复黑客目标 https://hackertarget.com/geoip-ip-location-lookup/
  • 2017 年 4 月 24 日:已删除史努比.io https://www.snoopi.io/(中止服务)
  • 2017 年 7 月 16 日:添加了限制“免费计划无 SSL (https)”
  • 2017 年 7 月 16 日:添加IP Find https://ipfind.co/(感谢乔丹C)
  • 2017 年 9 月 25 日:添加愚蠢的网络工具 http://www.stupidwebtools.com/(感谢心)
  • 2018 年 3 月 16 日:添加ipdata https://ipdata.co/(谢谢乔纳森)
  • 2018 年 4 月 14 日:将 freegeoip.net 重命名为ipstack https://ipstack.com/(感谢 MA-马丁)
  • 2018 年 4 月 16 日:添加GeoIPLookup.io https://geoiplookup.io/(感谢罗布·瓦)
  • 2018 年 6 月 11 日:添加IP地理定位 https://ipgeolocation.io/(感谢埃贾兹·艾哈迈德)
  • 2019 年 7 月 31 日:添加知识产权登记处 https://ipregistry.co/(感谢劳伦特)
  • 2019 年 8 月 16 日:添加智能IP.io https://smartip.io/(谢谢凯文尼)
  • 2019 年 8 月 22 日:已删除愚蠢的网络工具 http://www.stupidwebtools.com/(中止服务)
  • 2019 年 12 月 10 日:添加云耀 https://www.cloudflare.com/
  • 2020 年 1 月 9 日:已删除智能IP.io https://smartip.io/(中止服务)
  • 2020 年 11 月 6 日:添加Abstract https://www.abstractapi.com/
  • 2020 年 11 月 13 日:添加AstroIP.co https://astroip.co/
  • 2021 年 4 月 13 日:用代码片段替换代码示例(接近 30k 字符限制)
  • 2021 年 4 月 13 日:添加了将键值对转换为 JSON 以进行纯文本响应的代码
  • 2021 年 4 月 13 日:添加限制“要求非空Origin请求头”
  • 2021 年 4 月 13 日:添加大数据云 https://www.bigdatacloud.com/ip-geolocation-apis
  • 2021 年 4 月 13 日:恢复史努比.io https://www.snoopi.io/
  • 2021 年 4 月 13 日:已删除AstroIP.co https://astroip.co/(中止服务)
  • 2021 年 4 月 13 日:已删除Nekudo http://geoip.nekudo.com/(现在是 ipapi 的一部分)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 JavaScript 获取客户端的 IP 地址? [关闭] 的相关文章

随机推荐