是否可以使用 NodeJS 根据 IP 地址查找设备地理位置?

Is it possible to find device geo location based on ip address using NodeJS?

提问人:Kirasiris 提问时间:1/14/2022 更新时间:10/21/2022 访问量:3792

问:

我正在尝试实现一个功能,例如 Instagram 提供的功能;我说的是它的“登录活动”页面。这就是我要说的:enter image description here

每次用户登录时,正在使用的设备当前都存储在页面中。我该怎么做?

我拥有的当前代码使用两个库,一个用于从正在使用的设备中查找 ip.address(),另一个用于帮助我获取有关给定 IP 地址的位置数据。可悲的是,我无法让它工作。代码如下所示:

const ipLocation = require('ip-to-location')
const ip = require('ip')

const loc = await ipLocation.fetch(ip.address())
console.dir('Location', loc)
await User.findOneAndUpdate(
  { email: req.body.email },
  {
    $push: {
      loginActivity: {
        type: 'Point',
        coordinates: [loc.longitude, loc.latitude],
        // formattedAddress: loc[0].formattedAddress,
        // street: loc[0].streetName,
        city: loc.city.city,
        state: loc.region_name,
        zipcode: loc.zip_code,
        country: loc.country_code,
      },
    },
  }
)

有没有备用库可以使用?或者有人能为我指出正确的方向,使这成为可能吗?

javascript 节点 .js mongoDB 地理位置 ip-geolocation

评论


答:

4赞 user16821381 1/14/2022 #1

好吧,如果你能得到一个用户的IP地址,你可以试试 ipgeolocation.io

这是一个免费的 api,可以为您提供 ip 地址的纬度和经度值(如果需要,还可以提供更多)。

更多信息请见文档

评论

0赞 Kirasiris 1/15/2022
嘿,很抱歉再次回到这个问题。你以前用过吗?您知道如何返回值并将它们存储在变量中吗?我试过了,但它不起作用:链接到片段
0赞 1/17/2022
好吧,我从未尝试过节点js模块。取而代之的是,我首先创建了我的服务器,然后我的服务器使用我的 API 密钥和目标 IP 地址向 ipgeolocation.io 发送了一个获取请求,然后通过我的应用程序传递它。您可以遵循相同的方法。文档:ipgeolocation.io/documentation/ip-geolocation-api.html
0赞 GBra 4.669 10/9/2023
这不是一个免费的 API。免费注册帐户的限制是:每月 30K 请求和 1K 每日限制。
1赞 Vlam 1/15/2022 #2

您可以尝试 IP2Location 节点 .js。

https://github.com/ip2location/ip2location-nodejs

它可以调用数据库文件(免费付费)或调用 Web 服务

对于数据库,代码将类似于以下内容:

const {IP2Location} = require("ip2location-nodejs");

let ip2location = new IP2Location();

ip2location.open("./DB25.BIN");

testip = ['8.8.8.8', '2404:6800:4001:c01::67'];

for (var x = 0; x < testip.length; x++) {
    result = ip2location.getAll(testip[x]);
    for (var key in result) {
        console.log(key + ": " + result[key]);
    }
    console.log("--------------------------------------------------------------");
}

ip2location.close();

对于 Web 服务,可以使用以下示例:

const {IP2LocationWebService} = require("ip2location-nodejs");

let ws = new IP2LocationWebService();

let ip = "8.8.8.8";
let apiKey = "YOUR_API_KEY";
let apiPackage = "WS25";
let useSSL = true;

// addon and lang to get more data and translation (leave both blank if you don't need them)
let addon = "continent,country,region,city,geotargeting,country_groupings,time_zone_info";
let lang = "fr";

ws.open(apiKey, apiPackage, useSSL);

ws.lookup(ip, addon, lang, (err, data) => {
    if (!err) {
        console.log(data);
        
        ws.getCredit((err, data) => {
            if (!err) {
                console.log(data);
            }
        });
    }
});