使用JavaScript获取IP地址的方法

7,438 阅读4分钟

在这篇文章中,我们已经解释了使用JavaScript获得IP地址的方法。

目录

  1. 使用外部API获取IP地址
  2. 设置你自己的IP地址服务
  3. 为什么没有客户端的方法

使用外部API获取IP地址

当你向一个网站发出请求时,该请求包括你的IP地址。只要你访问一个网站,或使用API,如fetch或XMLHttpRequest,就会发出这样的请求。有一些服务是在读取这个IP地址后,将其发回给你。因此,这些网站允许你找到你的IP地址。你向这些服务之一发送一个HTTP请求,然后从响应中读取你的IP地址。ipify.org、ipinfo.io是一些这样的服务。更全面的列表可以在Stack Overflow上找到,如果你在OpenGenus上阅读这篇文章时,上面列出的服务不能工作。

让我们使用fetch API向上述服务之一发出请求,并将IP地址记录到控制台。

fetch('https://api.ipify.org/').then(
  r => r.text()
).then(console.log);

// -> 144.22.31.81
// (The output will vary for everyone)

Ipify以文本的形式返回响应。收到响应后,我们从响应的内容中提取文本,然后将其记录到控制台。

设置你自己的IP地址服务

与其依赖第三方服务如ipify来读取你的IP并将其送回给你,你可以创建自己的。创建你自己的IP地址服务并不难,只需几行代码就可以完成。我们将使用node.js建立一个服务器。把下面写的代码输入一个文件:

const http = require('http')
http.createServer((req, res)=>{
   res.writeHead(200, {'Content-Type' : 'text/plain'});
   res.end(req.socket.remoteAddress);
}).listen(3000);

现在,通过在同一文件夹中打开终端并发出命令node <filename> ,来运行该代码。这将在localhost:3000上启动一个服务器,我们可以向其发出请求。

在上面的代码中,我们已经导入了http模块,并使用它的createServer 方法来创建一个监听3000端口的服务器。在createServer 中,我们传递了一个方法,该方法对每个传入的请求都会执行。这个方法只是写一个200状态的响应,其中包括纯文本的远程IP地址。现在让我们向localhost:3000 ,类似于你向ipify.org 的请求。以通常的方式在客户端运行这个javascript。

  fetch('http://localhost:3000').then(
 r => r.text()
).then(console.log);

你可能会在控制台看到地址::1 ,这是IPv6环回地址,或者127.0.0.1 - IPv4环回地址。这意味着机器正在向自己发出请求。如果这项服务是在不同的服务器上,那么就会返回该服务器可见的IP地址。这个IP地址根据你的连接细节而变化,你是否使用VPN或代理等。

为什么没有客户端的方法?

你可能想知道为什么没有直接的方法来获取客户端本身的IP。一个简单的getIP() 方法会使这个过程变得非常简单,甚至微不足道。一个原因是,IP地址只有在计算机连接在网络中时才有意义。当你在你的计算机上运行一个本地服务器时,你会简单地得到回环地址::1127.0.0.1 。当你连接到互联网,并询问一台计算机你的IP是什么时,你才能够知道你的IP地址(或者至少是其他计算机能够看到的IP)。
尽管如此,你可能会抱怨,当你连接到互联网时,你有一个分配给你的IP地址,也许可以有一个变量显示这个分配的IP地址的值。但Javascript中也没有提供这样的变量。公共和私人IP地址之间的区别可能是这个原因。一些计算机同时拥有公共和私人地址,而私人地址的目的只是为了私人。想象一下,你正在使用一个代理。你的电脑有一个私人IP地址,没有人知道,它有一个其他人都能看到的公共IP地址--代理的地址。如果有一种方法,如getIP() ,将在客户端执行,代理不能再隐藏计算机的地址--因为getIP() 功能直接在计算机本身上执行,揭示了它的私人IP。你能想到其他没有客户端方法来获取计算机IP的原因吗?或者你能想出一些安全的方法,使之在计算机上成为可能吗?

总结

找到一台计算机的IP地址的标准方法是向一台服务器发出请求。这个服务器可能是你自己的,也可能是其他人的服务器,如第三方服务。不管怎么说,所有查找你的IP的方法都需要你进行远程请求,在写这篇文章的时候,还没有一个客户端的方法可用。