获取Chrome扩展程序中设备的本地IP

时间:2013-09-02 11:37:37

标签: google-chrome networking google-chrome-extension

我正在开发一个Chrome扩展程序,它应该发现然后与本地网络中的其他设备进行通信。要发现它们,需要找出自己的IP地址,找出网络的IP范围,以检查其他设备。我被困在如何找到本地机器的IP地址(我不是在谈论本地主机,我也不是在谈论暴露在互联网上的地址,而是在本地网络上的地址)。 基本上,我希望得到的是ifconfig内终端中的background.js输出。

Chrome Apps API提供chrome.socket,似乎可以执行此操作however, it is not available for extensions。通过the API for extensions阅读我没有找到任何似乎使我能够找到本地IP的东西。

我是否遗漏了某些东西,或者由于某些原因这是不可能的?有没有其他方法来发现网络上的其他设备,这也可以做得很好(因为它们将在相同的IP范围内)但是有一些传言从2012年12月开始可能有一个发现API用于扩展似乎没有任何东西存在。

有人有什么想法吗?

4 个答案:

答案 0 :(得分:32)

您可以通过WebRTC API获取本地IP地址列表(更准确地说:本地网络接口的IP地址)。任何Web应用程序(不仅仅是Chrome扩展程序)都可以使用此API。

示例:

// Example (using the function below).
getLocalIPs(function(ips) { // <!-- ips is an array of local IP addresses.
    document.body.textContent = 'Local IP addresses:\n ' + ips.join('\n ');
});

function getLocalIPs(callback) {
    var ips = [];

    var RTCPeerConnection = window.RTCPeerConnection ||
        window.webkitRTCPeerConnection || window.mozRTCPeerConnection;

    var pc = new RTCPeerConnection({
        // Don't specify any stun/turn servers, otherwise you will
        // also find your public IP addresses.
        iceServers: []
    });
    // Add a media line, this is needed to activate candidate gathering.
    pc.createDataChannel('');
    
    // onicecandidate is triggered whenever a candidate has been found.
    pc.onicecandidate = function(e) {
        if (!e.candidate) { // Candidate gathering completed.
            pc.close();
            callback(ips);
            return;
        }
        var ip = /^candidate:.+ (\S+) \d+ typ/.exec(e.candidate.candidate)[1];
        if (ips.indexOf(ip) == -1) // avoid duplicate entries (tcp/udp)
            ips.push(ip);
    };
    pc.createOffer(function(sdp) {
        pc.setLocalDescription(sdp);
    }, function onerror() {});
}
<body style="white-space:pre"> IP addresses will be printed here... </body>

答案 1 :(得分:1)

请参阅http://developer.chrome.com/extensions/webRequest.html了解详细信息, 我的代码示例:

// get IP using webRequest
var currentIPList = {};
chrome.webRequest.onCompleted.addListener(
  function(info) {
    currentIPList[info.url] = info.ip;
    currentIPList[info.tabId] = currentIPList[info.tabId] || [];
    currentIPList[info.tabId].push(info);
    return;
  },
  {
    urls: [],
    types: []
  },
  []
);

答案 2 :(得分:0)

经过一番搜索,我发现了类似的问题was answered before。 此API无法通过扩展程序访问,但可用于Chrome应用程序:

  

使用chrome.system.network.getNetworkInterfaces

     

这将返回所有接口的数组及其IP地址。

     

这是我的示例代码:

     

chrome.system.network.getNetworkInterfaces(function(interfaces){ console.log(interfaces); });

     

清单的权限:

     

"permissions": [ "system.network" ], ...

答案 3 :(得分:-1)

> chrome.system.network.getNetworkInterfaces(function(interfaces){
>       console.log(interfaces);    }); 
  

manifest-permissions:

     

“权限”:   [“system.network”],...

也适合我,它回复:

(4) [{…}, {…}, {…}, {…}]

0 : {address:“xxxx”,name:“en0”,prefixLength:64}

1 : {地址:“192.168.86.100”,姓名:“en0”,前缀长度:24}

2 : {地址:“xxxx”,名称:“awdl0”,prefixLength:64}

3 : {address:“xxxx”,name:“utun0”,prefixLength:64}

长度 : 4