如何使用node.js获取我的外部IP地址?

时间:2013-11-28 18:56:01

标签: node.js

我正在使用node.js,我需要获取我的ISP提供的外部IP地址。 有没有办法在不使用http://myexternalip.com/raw等服务的情况下实现这一目标?

14 个答案:

答案 0 :(得分:11)

使用externalip

https://github.com/alsotang/externalip

externalip(function (err, ip) {
  console.log(ip); // => 8.8.8.8
});

答案 1 :(得分:9)

可以像在Python中那样做以获取外部IP,连接到某个网站并从套接字连接中获取您的详细信息:

const net = require('net');
const client = net.connect({port: 80, host:"google.com"}, () => {
  console.log('MyIP='+client.localAddress);
  console.log('MyPORT='+client.localPort);
});

*遗憾的是找不到原始的Python示例作为参考..

更新2019年: 使用https://whatismyipaddress.com/api

中的内置http库和公共API
const http = require('http');

var options = {
  host: 'ipv4bot.whatismyipaddress.com',
  port: 80,
  path: '/'
};

http.get(options, function(res) {
  console.log("status: " + res.statusCode);

  res.on("data", function(chunk) {
    console.log("BODY: " + chunk);
  });
}).on('error', function(e) {
  console.log("error: " + e.message);
});

在Amazon AWS服务器上使用Node.js v0.10.48进行测试

答案 2 :(得分:7)

来自here

npm install --save public-ip

然后

publicIp.v4().then(ip => {
  console.log("your public ip address", ip);
});

如果你想要本地机器ip,你可以使用this

var ip = require("ip");
var a = ip.address();
console.log("private ip address", a);

答案 3 :(得分:4)

修改:这是在2013年写回来的......网站已经不见了。我现在要离开示例请求代码,除非有人抱怨但是接受了接受的答案。


http://fugal.net/ip.cgi与那个相似。

或者你可以

require('http').request({
    hostname: 'fugal.net',
    path: '/ip.cgi',
    agent: false
    }, function(res) {
    if(res.statusCode != 200) {
        throw new Error('non-OK status: ' + res.statusCode);
    }
    res.setEncoding('utf-8');
    var ipAddress = '';
    res.on('data', function(chunk) { ipAddress += chunk; });
    res.on('end', function() {
        // ipAddress contains the external IP address
    });
    }).on('error', function(err) {
    throw err;
}).end();

参考:http://www.nodejs.org/api/http.html#http_http_request_options_callback

答案 4 :(得分:2)

这应该可以很好地工作,没有任何外部依赖(ipify.org除外):

var https = require('https');

var callback = function(err, ip){
    if(err){
        return console.log(err);
    }
    console.log('Our public IP is', ip);
    // do something here with the IP address
};

https.get({
    host: 'api.ipify.org',
}, function(response) {
    var ip = '';
    response.on('data', function(d) {
        ip += d;
    });
    response.on('end', function() {
        if(ip){
            callback(null, ip);
        } else {
            callback('could not get public ip address :(');
        }
    });
});

您也可以使用https://httpbin.org

获取https://httpbin.org/ip

答案 5 :(得分:2)

您可以使用request-ip软件包:

const requestIp = require('request-ip');

// inside middleware handler
const ipMiddleware = function(req, res, next) {
    const clientIp = requestIp.getClientIp(req); 
    next();
};

答案 6 :(得分:2)

根据经验,最简单的答案是,在大多数情况下,如果不使用外部服务就无法获得外部IP,因为通常情况下,您将位于NAT后面或被防火墙屏蔽。我说的是在大多数情况下,因为在某些情况下您可以从路由器上获得它,但是由于情况太特殊,无法提供一般性的答案。

您想要的只是在NodeJS中选择自己喜欢的http客户端,然后找到一个维护的服务器,该服务器仅使用主体中的IP地址进行响应。您还可以使用一个程序包,但是您应该查看它是否仍在使用维护的远程服务器。

虽然已经有很多示例,但是这里有一个首先尝试使用IPv6,然后又使用IPv4的示例。它利用了axios,因为我对此感到满意。另外,除非可选参数debug设置为true,否则结果将是一个值或未定义。

const axios = require('axios');

// replace these URLs with whatever is good for you
const remoteIPv4Url = 'http://ipv4bot.whatismyipaddress.com/';
const remoteIPv6Url = 'http://ipv6bot.whatismyipaddress.com/';

// Try getting an external IPv4 address.
async function getExternalIPv4(debug = false) {
  try {
    const response = await axios.get(remoteIPv4Url);
    if (response && response.data) {
      return response.data;
    }
  } catch (error) {
    if (debug) {
      console.log(error);
    }
  }
  return undefined;
}

// Try getting an external IPv6 address.
async function getExternalIPv6(debug = false) {
  try {
    const response = await axios.get(remoteIPv6Url);
    if (response && response.data) {
      return response.data;
    }
  } catch (error) {
    if (debug) {
      console.log(error);
    }
  }
  return undefined;
}

async function getExternalIP(debug = false) {
  let address;
  // Try IPv6 and then IPv4
  address = await getExternalIPv6(debug);
  if (!address) {
    address = await getExternalIPv4(debug);
  }
  return address;
}

module.exports { getExternalIP, getExternalIPv4, getExternalIPv6 }

随时提出改进建议。

答案 7 :(得分:1)

另一个小节点模块是ext-ip。不同之处在于,您可以使用不同的响应选项,与您的编码风格相匹配。它已经准备好开箱即用......

无极

let extIP = require('ext-ip')();

extIP.get().then(ip => {
    console.log(ip);
})
.catch(err => {
    console.error(err);
});

活动

let extIP = require('ext-ip')();

extIP.on("ip", ip => {
    console.log(ip);
});

extIP.on("err", err => {
    console.error(err);
});

extIP();

回调

let extIP = require('ext-ip')();

extIP((err, ip) => {
    if( err ){
        throw err;
    }

    console.log(ip);
});

答案 8 :(得分:0)

我无耻的插件:canihazip披露:我是模块的作者,但不是主页的作者。

它可以作为一个模块,暴露一个可以选择传递回调函数的单个函数,它将返回一个promise。

它也可以全局安装并用作CLI。

答案 9 :(得分:0)

只需使用superagent

var superagent = require('superagent');
var getip = function () {
  superagent
    .get('http://ip.cn/')
    .set('User-Agent', 'curl/7.37.1')
    .end(function (err, res) {
      if (err) {
        console.log(err);
      }
      var ip = res.text.match(/\d+\.\d+\.\d+\.\d+/)[0];
      console.log(ip)
      // Here is the result
    });
};

答案 10 :(得分:0)

您可以非常轻松地使用api解决方案来检索外部IP! 几天前,我为此做了一个IP跟踪器网站! 这是您可以用来获取IP的代码片段!

async function getIp(cb) {
    let output = null;
    let promise = new Promise(resolve => {
        let http = new XMLHttpRequest();
        http.onreadystatechange = function() {
            if (this.readyState == 4 && this.status == 200) {
                output = this.responseText;
                resolve("done");
            }
        }
        http.open("GET", "https://iptrackerz.herokuapp.com/ip", true);
        http.send();
   });
  await promise;
  if (cb != undefined) {
      cb(JSON.parse(output)["ip"]);
  } else {
      return JSON.parse(output)["ip"];
  }
}

好,现在您有了函数getIp()! 我编码的方式允许您执行2种不同的调用方式! 他们在这里。

  1. 异步

    异步函数printIP(){     让ip =等待getIp();     document.write(“您的IP为” + ip); }; printIP();

  2. 回调

    getIp(ip => {     document.write(“您的IP为” + ip); });

答案 11 :(得分:0)

我一直在寻找不依赖他人库/资源的解决方案, 并发现这是可以接受的替代方法:

只需GET请求到外部服务器(由我控制), 在这里阅读req.headers ['x-forwarded-for']并将其发还给我的客户。

答案 12 :(得分:0)

node.js具有很多内置模块,您可以在不包含任何外部依赖项的情况下使用它们。您可以制作此文件。
WhatsMyIpAddress.js

const http = require('http');

function WhatsMyIpAddress(callback) {
    const options = {
        host: 'ipv4bot.whatismyipaddress.com',
        port: 80,
        path: '/'
    };
    http.get(options, res => {
        res.setEncoding('utf8');
        res.on("data", chunk => callback(chunk, null));
    }).on('error', err => callback(null, err.message));
}

module.exports = WhatsMyIpAddress;

然后像这样在main.js中调用它。

main.js

const WhatsMyIpAddress = require('./src/WhatsMyIpAddress');
WhatsMyIpAddress((data,err) => {
   console.log('results:', data, err);
});

答案 13 :(得分:-1)

您可以使用nurl库命令ippublic来获取此信息。 (披露:我做了nurl)

> npm install nurl-cli -g
> ippublic;
// 50.240.33.6