22

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

Chrome Apps API 提供chrome.socket似乎可以做到这一点,但是,它不适用于 extensions。通过API 阅读扩展我没有发现任何似乎使我能够找到本地 ip 的东西。

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

有人有什么想法吗?

4

4 回答 4

42

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

例子:

// 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>

于 2015-04-08T12:13:21.533 回答
2

经过一番搜索,我发现之前已经回答了类似的问题。此 API 无法从扩展程序访问,但可用于 chrome 应用程序:

使用chrome.system.network.getNetworkInterfaces.

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

这是我的示例代码:

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

清单权限:

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

于 2015-04-08T11:34:34.443 回答
0
> chrome.system.network.getNetworkInterfaces(function(interfaces){
>       console.log(interfaces);    }); 

清单权限:

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

也适用于我,它回复:

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

0:{地址:“xxxx”,名称:“en0”,前缀长度:64}

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

2:{地址:“xxxx”,名称:“awdl0”,前缀长度:64}

3:{地址:“xxxx”,名称:“utun0”,前缀长度:64}

长度:4

于 2017-09-29T07:16:05.893 回答
-2

有关详细信息,请参见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: []
  },
  []
);
于 2014-01-21T01:46:38.507 回答