• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

使用ipdata进行地理定位

使用ipdata进行地理定位  第1张

当大多数人想到地理位置时,他们会记得熟悉的弹出通知,即“网站想知道您的位置”。但是您是否知道,您可以仅通过 IP 地址获取访问者的地理位置信息,而无需任何额外权限?

对于 Web 开发人员来说,地理位置是信息和功能的宝库,可以增强访问者的体验并为开发人员提供有意义的信息。虽然html5 Geolocation api确实可以为开发人员提供访问者设备的实际 GPS 坐标,但开发人员通常需要更广泛的位置数据集。他们可以使用访问者的 IP 地址获取该信息。

IP 地址本身就是:互联网上设备的地址。然而,万维网已经有 20 多年的历史了,在这么长的时间里,已经收集、关联和组合了与数百万个 IP 地址相关的大量数据。虽然有许多第三方服务提供 IP 地理定位数据,但没有一个像 ipdata 一样准确或可靠。在我们了解如何使用 ipdata 的服务之前,让我们先看看为什么您可能要使用地理位置数据。

地理定位的用途

您想要收集访问者的地理位置数据并将其用于您的应用程序有很多正当理由。

一方面,您可以根据访问者的 IP 地址提供区域内容。您的网站是否在全球范围内提供产品但在本地提供服务?借助 IP 地理定位数据,您可以提供基于产品的正常内容,并针对本地访问者提供有关您服务的特殊内容。

使用地理位置数据还可以帮助您识别属于欧盟通用数据保护条例的访问者,以便您可以正确遵守这些访问者的 GDPR。

为什么是ipdata?

使用 ipdata,您可以访问准确的 IP 地址智能 API,让您可以查找任何 IP 地址的大致位置。但最重要的是,ipdata 还为公司查找提供聚合的开源威胁情报数据和 IP,以及货币、时区和语言等国际化数据。许多组织和公司(仅举几例)信任 ipdata 及其提供的地理位置数据。

虽然您可以使用任何 HTTP 客户端连接并使用他们的rest API,但ipdata为 C#、java、 phpjavascriptpython提供了开源库,使处理 API 和响应数据变得轻而易举。第三方库可用于 Ruby、swift和 Go。

注意:本文在节点应用程序中使用 ipdata 的 JavaScript 库,但相同的想法和概念可以应用于其他语言。请参阅官方 ipdata 库文档

使用 ipdata 的 API

我们首先需要的是一个 node 应用程序;请务必从Node.js 网站安装最新的 Node LTS 版本。为您的应用程序项目创建一个新目录tutsplus-ipdata然后打开操作系统的终端应用程序,导航到新创建的目录,然后键入以下内容来初始化项目:

npm init -y

我们现在需要选择我们的应用程序框架。是的,从技术上讲,我们不需要,但是 Express 和 Hapi 等框架极大地提高了我们在构建基于节点的 Web 应用程序时的工作效率。我们将使用 Hapi,因此我们需要使用以下命令安装它以及 ipdata 包:

npm install @hapi/hapi ipdata --save

在实际应用程序中,您自然希望安装用于处理静态文件、视图、错误等的包。Hapi 和 ipdata 是我们在本教程中需要的唯一包,因为我们的服务器将非常简单:它只会以文本响应。

编写服务器

如果您是 Hapi 新手,那么创建和初始化服务器的过程很简单。首先,创建一个名为index.js并使用以下代码创建服务器的新文件:

const Hapi = require('@hapi/hapi');const server = Hapi.server({
     port: 3000,
     host: 'localhost' });

这段代码的第一行导入了Hapi对象,我们通过调用它的server()方法来创建我们的服务器。server()方法接受一个允许我们配置服务器的对象。在上面的代码中,我们将服务器配置为在 localhost 上运行并监听 3000 端口。

route()接下来,我们使用服务器的方法设置我们的单一路由:

server.route({

    method: 'GET',

    path: '/',

    handler: (request, h) => {

        return 'Hello, Tuts+';

    }

});

此路由处理对我们应用程序的主目录或根目录的 GET 请求。当服务器接收到与此路由匹配的请求时,处理函数将执行并返回一个简单的字符串。

最后,我们使用以下代码启动服务器:

await server.start();

console.log('Server running on %s', server.info.uri);

因为服务器的start()方法是异步的,所以我们可以选择我们想要如何使用它。此代码使用await关键字,这意味着我们必须在标记为的函数中执行此代码async所以我们将服务器的创建、配置和执行包装在一个异步函数中,如下所示:

const Hapi = require('@hapi/hapi');
const init = async () => {
    const server = Hapi.server({

        port: 3000,

        host: 'localhost'

    });
    // register plugins here
    server.route({

        method: 'GET',

        path: '/',

        handler: (request, h) => {

            return 'Hello, Tuts+';

        }

    });
    await server.start();

    console.log('Server running on %s', server.info.uri);
};
init();

这段代码创建了一个简单的服务器,当您在浏览器中查看http://localhost:3000时,除了输出“ Hello, Tuts+ ”之外什么都不做。通过在终端中运行自己测试它。node index.js

我们可以通过编写和注册一个只允许来自某些***的请求的插件(白名单)来为这个简单的测试服务器添加一些有用的功能。

将 ipdata 用于白名单

ipdata 的 API 返回的地理位置数据包含大量信息,我们可以使用这些信息来创建白名单(或黑名单,如果您想采用相反的方法)。仅举几例:您可以检索与 IP 地址关联的城市、地区/州、***、大陆、ISP 和托管服务提供商。出于我们的目的,我们会将来自某些***/地区的请求列入白名单。

创建一个名为 的新文件whitelist.js,然后键入以下前两行:

const IPData = require('ipdata').default;

const client = new IPData('your API key')

此代码的第一行导入IPData构造函数,用于创建 ipdata API 客户端。第二行创建客户端,传入与您的帐户关联的 API 密钥。如果您没有帐户,可以从 ipdata 注册一个免费帐户您将通过电子邮件收到您的 API 密钥。您可以使用字符串 " test" 进行测试,但请注意它是速率限制的。

现在使用以下代码定义插件:

exports.plugin = {

    name: 'whitelist',

    register: async function(server, options) {

        // register server things here

    }

};

此代码演示了基本 Hapi 插件的样板。它导出插件对象并定义插件的名称属性和register()方法。

与 Express 不同,Hapi 不使用,甚至没有中间件的概念。相反,您连接到生命周期事件来处理传入的请求,并且您使用服务器的ext()方法来执行此操作,如以下代码所示:

server.ext('onRequest', async (request, h) => {

    // process request data here

});

这段代码进入插件的register()方法中,它为生命周期事件设置了一个事件处理程序onRequest提供的异步函数ext()将处理事件并允许您处理请求。

我们将通过定义我们的***白名单来开始处理,这是一个字符串值数组,其中包含我们白名单***的***代码。然后,我们将检索请求者的 IP 地址并使用它来查询 ipdata API,如下所示:

server.ext('onRequest', async (request, h) => {

    const whitelist = ['US', 'CA', 'UK'];

    const ip = '104.17.233.79'; //request.info.remoteAddress;

    const locData = await client.lookup(ip);



    // check the whitelist here

});

请注意,如果此应用程序在您的计算机上运行则请求 IP 地址是您计算机的环回 IP 地址,并且没有与该 IP 地址关联的地理位置数据。相反,上面的代码使用 Envato Tuts+ 网站的 IP 地址。

ipdata 客户端使用简单——它的lookup()方法接受许多参数,最值得注意的是所需的 IP,并使用提供的信息查询 ipdata 的 API。

来自的响应lookup()是一个包含各种属性的对象,具体取决于查询的结果。例如,响应对象始终包含一个名为的属性,该属性status指示提供的 IP 地址是否存在于 ipdata 的数据库中。它是一个 HTTP 状态代码,因此在执行任何其他操作之前检查它的值是个好主意。

我们关心的属性是country_code,我们可以用它来检查我们的白名单。以下代码同时使用statuscountry_code属性:

server.ext('onRequest', async (request, h) => {

    const whitelist = ['US', 'CA', 'UK'];

    const ip = '104.17.233.79'; //request.info.remoteAddress;

    const locData = await client.lookup(ip);



    if (locData.status === 200 && whitelist.includes(locData.country_code)) {

        return h.continue;

    }



    return h.response('You are not allowed.').code(403).takeover();

});

如果查询状态是 200 并且***代码存在于白名单中,那么我们告诉我们的服务器继续使用下一个插件或路由处理程序处理请求——本质上允许请求者访问他们请求的资源。否则,我们takeover会以 403 状态响应。

如前所述,查询结果对象包含多种属性,但我们只需要一个:country_code因此,我们可以通过告诉lookup()方法我们只需要一组属性来提高网络效率,如下所示:

const locData = await client.lookup(ip, null, ['country_code']);

此代码现在传递一个仅包含我们需要的属性的数组(该status属性始终包含在内,因此我们不需要在数组中指定它)。通过此更改,完成的插件如下所示:

const IPData = require('ipdata').default;
const client = new IPData('your API key');
exports.plugin = {
    name: 'whitelist',

    register: async function(server, options) {
        server.ext('onRequest', async (request, h) => {
            const whitelist = ['US', 'CA', 'UK'];
            const ip = '104.17.233.79'; //request.info.remoteAddress;
            const locData = await client.lookup(ip, null, ['country_code']);
            if (locData.status === 200 && whitelist.includes(locData.country_code)) {
                return h.continue;
            }
            return h.response('You are not allowed.').code(403).takeover();
        });
    }
};

注册插件

现在我们需要注册我们的白名单插件。在定义我们的路线之前index.js,添加以下行:

await server.register(require('./whitelist));

完整的服务器代码如下:

const Hapi = require('@hapi/hapi');

const init = async () => {
    const server = Hapi.server({

        port: 3000,

        host: 'localhost'

    });
    await server.register(require('./whitelist'));
    server.route({
        method: 'GET',
        path: '/',
        handler: (request, h) => {
            return 'Hello, Tuts+';
        }
    });
    await server.start();
    console.log('Server running on %s', server.info.uri);
};
init();

如果您还没有,请使用Control-C终止在终端中运行的服务器,然后node index.js再次运行。如果您使用 Envato Tuts+ 网站的 IP,您应该会在浏览器中看到文本“ Hello, Tuts+ ”。如果您使用了未在白名单中列出的***/地区的 IP 地址,或者您使用了本地计算机的 IP 地址,那么您将看到文本“您不被允许”。

结论

对于 Web 开发人员,ipdata 提供了无价的服务。它不仅可以让您了解访问者是谁,还可以让您整合特定区域的内容,为访问者创造有意义的体验。它是免费上手且易于使用的,所以今天就试试 ipdata吧!


文章目录
  • 地理定位的用途
  • 为什么是ipdata?
  • 使用 ipdata 的 API
    • 编写服务器
    • 将 ipdata 用于白名单
    • 注册插件
  • 结论