我正在使用node.js,我需要获取我的ISP提供的外部IP地址。 有没有办法在不使用http://myexternalip.com/raw等服务的情况下实现这一目标?
答案 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库和公共APIconst 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)
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
答案 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)
答案 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种不同的调用方式! 他们在这里。
异步
异步函数printIP(){ 让ip =等待getIp(); document.write(“您的IP为” + ip); }; printIP();
回调
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