如何使用JavaScript获取客户端的IP地址? [已关闭]

19 浏览
0 Comments

如何使用JavaScript获取客户端的IP地址? [已关闭]

我需要用JavaScript来获取客户端的IP地址,但不能使用服务器端代码,甚至没有SSI(服务器端包含)。\n不过,我不排斥使用免费的第三方脚本/服务。

0
0 Comments

如何使用JavaScript获取客户端的IP地址? [已关闭]

通过使用JSONP在服务器端进行中转

在Google中寻找,发现在SO上找到了这个问题的答案:可以使用客户端JavaScript执行DNS查找(主机名到IP地址)?

<script type="application/javascript">
    function getip(json){
      alert(json.ip); // 弹出IP地址
    }
</script>
<script type="application/javascript" src="http://www.telize.com/jsonip?callback=getip"></script>

注意:telize.com API已经在2015年11月15日永久关闭。

虽然我很欣赏这个代码片段,但是我认为加载JavaScript文本内容并通过函数进行评估存在严重的安全风险。如果响应内容发生变化,那么所有100多人都会调用这个可能包含不安全内容的函数。我只会在返回的是JSON字符串时使用这个方法。

错误 配额超限 此应用程序暂时超过了其服务配额。请稍后重试。

这不是一个好的答案,因为它涉及到服务器端请求。问题明确说明了“纯粹的JavaScript”。

Micah,没有可能仅通过JavaScript获取IP地址。我建议你阅读一下NAT以及它的工作原理。你需要一个服务器来将你的互联网IP地址回传给你。

该服务现已关闭。

是的,该服务的创建者关闭了它,因为它被垃圾邮件/恶意软件滥用。请参阅他的帖子:cambus.net/adventures-in-running-a-free-public-api

stupidwebtools.com/api/my_ip.txtstupidwebtools.com/api/my_ip.jsonstupidwebtools.com/api/my_ip.xml

此基于互联网的脚本现在永久失效。删除无效的代码后,这个答案变成了“你可以Google来找到一些东西”的答案。所以它不再是Stack Overflow的答案定义中的答案了。很抱歉,但我建议你将其删除以便给工作的答案提供可见性。

0
0 Comments

如何使用JavaScript获取客户端的IP地址?[已关闭]

最近的一个Github存储库webrtc-ip显示,您现在可以使用WebRTC泄露用户的公共IP地址。不幸的是,由于逐渐转向mDNS(至少对于WebRTC),此泄漏不适用于私有IP。然而,下面的代码段是一个可行的演示:

getIPs().then(res => document.write(res.join('\n')))


此存储库的编译源代码可以在此处找到。

(之前的)最终更新:此解决方案将不再起作用,因为浏览器正在修复webrtc泄漏。有关更多信息,请阅读此问题:RTCIceCandidate不再返回IP。

更新:我一直想制作代码的精简/混淆版本,这是一个ES6 Promise代码示例:

var findIP = new Promise(r=>{
    var w=window,a=new (w.RTCPeerConnection||w.mozRTCPeerConnection||w.webkitRTCPeerConnection)({iceServers:[]}),
    b=()=>{};
    a.createDataChannel("");
    a.createOffer(c=>a.setLocalDescription(c,b,b),b);
    a.onicecandidate=c=>{
        try{
            c.candidate.candidate.match(/([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g).forEach(r);
        }catch(e){}
    };
});
/*Usage example*/
findIP.then(ip => document.write('your ip: ', ip)).catch(e => console.error(e));

感谢WebRTC,使用受WebRTC支持的浏览器非常容易获取本地IP(至少目前如此)。我修改了源代码,减少了行数,不进行任何STUN请求,因为您只想要本地IP而不是公共IP,下面的代码在最新的Firefox和Chrome中运行正常,请运行片段进行检查:

function findIP(onNewIP) {
    var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
    var pc = new myPeerConnection({ iceServers: [] }),
        noop = function() {},
        localIPs = {},
        ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g,
        key;
    function ipIterate(ip) {
        if (!localIPs[ip]) onNewIP(ip);
        localIPs[ip] = true;
    }
    pc.createDataChannel("");
    pc.createOffer(function(sdp) {
        sdp.sdp.split('\n').forEach(function(line) {
            if (line.indexOf('candidate') < 0) return;
            line.match(ipRegex).forEach(ipIterate);
        });
        pc.setLocalDescription(sdp, noop, noop);
    }, noop);
    pc.onicecandidate = function(ice) {
        if (!ice || !ice.candidate || !ice.candidate.candidate || !ice.candidate.candidate.match(ipRegex)) return;
        ice.candidate.candidate.match(ipRegex).forEach(ipIterate);
    };
}
var ul = document.createElement('ul');
ul.textContent = 'Your IPs are: ';
document.body.appendChild(ul);
function addIP(ip) {
    console.log('got ip: ', ip);
    var li = document.createElement('li');
    li.textContent = ip;
    ul.appendChild(li);
}
findIP(addIP);

在这里发生的情况是,我们创建了一个虚拟对等连接,并且为了远程对等方与我们联系,我们通常会互换ice候选项。通过读取ice候选项(从本地会话描述和onIceCandidateEvent中),我们可以获取用户的IP。

我从这里获取了代码。

在Firefox 26中出现了“错误:RTCPeerConnection构造函数传递了无效的RTCConfiguration - 格式错误的URI:undefined”。

更新代码以在Firefox 26中正常工作,已在Windows机器上检查,请您确认一下。

我可以获取到我的内部网络IP地址,太棒了!

在三星移动设备的com.android.chrome上无法正常工作-返回的是MAC地址。

警告:这不显示您的公共IP,只显示本地网络IP。例如,您不能使用它来检测用户所在的国家,如果他们在LAN上。

您也可以使用STUN服务器获取公共IP(并在创建对等方时进行配置),但这将需要您维护/使用STUN服务器,并引入服务器代码。

这被称为WebRTC泄漏。所有主要浏览器应该解决此问题,但事实并非如此。有关更多信息,请参阅此处:privacytools.io/webrtc.html。可能与Tor浏览器泄漏您的真实IP地址有关。

这显示了我的私有地址,而不是公共地址。

0
0 Comments

如何使用JavaScript获取客户端的IP地址?

要获取客户端的IP地址,可以使用以下方法之一:

1. 使用Web服务和jQuery进行JSON返回。下面是一些免费的IP查找服务和它们返回的信息:

- Abstract:

let apiKey = '1be9a6884abd4c3ea143b59ca317c6b2';
$.getJSON('https://ipgeolocation.abstractapi.com/v1/?api_key=' + apiKey, function(data) {
  console.log(JSON.stringify(data, null, 2));
});

- BigDataCloud:

let apiKey = 'd9e53816d07345139c58d0ea733e3870';
$.getJSON('https://api.bigdatacloud.net/data/ip-geolocation?key=' + apiKey, function(data) {
  console.log(JSON.stringify(data, null, 2));
});

- Cloudflare:

$.get('https://www.cloudflare.com/cdn-cgi/trace', function(data) {
  data = data.trim().split('\n').reduce(function(obj, pair) {
    pair = pair.split('=');
    return obj[pair[0]] = pair[1], obj;
  }, {});
  console.log(data);
});

- DB-IP:

$.getJSON('https://api.db-ip.com/v2/free/self', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

- Geobytes:

$.getJSON('http://gd.geobytes.com/GetCityDetails?callback=?', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

- GeoIPLookup.io:

$.getJSON('https://json.geoiplookup.io/?callback=?', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

- geoPlugin:

$.getJSON('http://www.geoplugin.net/json.gp', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

- Hacker Target:

$.get('https://api.hackertarget.com/geoip/?q=116.12.250.1', function(data) {
  data = data.trim().split('\n').reduce(function(obj, pair) {
    pair = pair.split(': ');
    return obj[pair[0]] = pair[1], obj;
  }, {});
  console.log(data);
});

- ipapi:

$.getJSON('https://ipapi.co/json/', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

- IP-API:

$.getJSON('http://ip-api.com/json', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

- ipdata:

let apiKey = 'be0f755b93290b4c100445d77533d291763a417c75524e95e07819ad';
$.getJSON('https://api.ipdata.co?api-key=' + apiKey, function(data) {
  console.log(JSON.stringify(data, null, 2));
});

- IP Find:

let apiKey = '50e887ce-e3bb-4f00-a9b9-667597db5539';
$.getJSON('https://ipfind.co/me?auth=' + apiKey, function(data) {
  console.log(JSON.stringify(data, null, 2));
});

- ipgeolocation:

let apiKey = 'f8e0b361e8f4405c94613ab534959fdf';
$.getJSON('https://api.ipgeolocation.io/ipgeo?apiKey=' + apiKey, function(data) {
  console.log(JSON.stringify(data, null, 2));
});

- ipify:

$.getJSON('https://api.ipify.org?format=jsonp&callback=?', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

- IPInfoDB:

let apiKey = '25864308b6a77fd90f8bf04b3021a48c1f2fb302a676dd3809054bc1b07f5b42';
$.getJSON('https://api.ipinfodb.com/v3/ip-city/?format=json&key=' + apiKey, function(data) {
  console.log(JSON.stringify(data, null, 2));
});

- ipinfo.io:

$.getJSON('https://ipinfo.io/json', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

- ipregistry:

$.getJSON('https://api.ipregistry.co/?key=tryout', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

- ipstack:

$.getJSON('http://api.ipstack.com/116.12.250.1?access_key=7d558868069cc34f545d822af056be3c', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

- jsonip.com:

$.getJSON('https://jsonip.com/', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

- JSON Test:

$.getJSON('http://ip.jsontest.com/', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

- Snoopi.io:

let apiKey = 'ed5ebbeba257b8f262a6a9bbc0ec678e';
$.getJSON('https://api.snoopi.io/116.12.250.1?apikey=' + apiKey, function(data) {
  console.log(JSON.stringify(data, null, 2));
});

2. 使用现代浏览器中的Fetch API。以下是一个使用Fetch API获取IP地址的示例:

let apiKey = '1be9a6884abd4c3ea143b59ca317c6b2';
fetch('https://ipgeolocation.abstractapi.com/v1/?api_key=' + apiKey)
  .then(response => response.json())
  .then(data => {
    console.log(JSON.stringify(data, null, 2))
  });

请注意,由于这些都是免费服务,不确定何时/是否会在将来停止使用。大多数服务还提供付费服务以获得更多功能和稳定性。

这些方法中的大多数都需要进行注册以获得API密钥。此外,一些服务可能对请求频率有限制。

0