22

私は、ローカルネットワーク内の他のデバイスを検出して通信することになっているクロム拡張に取り組んでいます。それらを発見するには、自身の IP アドレスを見つけてネットワークの IP 範囲を見つけ、他のデバイスをチェックする必要があります。ローカルマシンのIPアドレスを見つける方法に行き詰まっています(ローカルホストについて話しているのでも、インターネットに公開されているアドレスについて話しているのでもなく、ローカルネットワーク上のアドレスについて話しているのでもありません)。基本的に、私が好きなのは、私のbackground.js内の端末でifconfig出力になるものを取得することです。

Chrome Apps API はchrome.socketを提供しており、これを実行できるようですが、拡張機能では利用できません拡張機能の API を読んでも、ローカル IP を見つけることができると思われるものは見つかりませんでした。

何か不足していますか、それとも何らかの理由でこれは不可能ですか? ネットワーク上の他のデバイスを検出する他の方法はありますか?それもうまくいきます (同じ IP 範囲にあるため)。まだ何も存在していないようです。

誰にもアイデアはありますか?

4

4 に答える 4

42

WebRTC API を介して、ローカル IP アドレス (より正確には、ローカル ネットワーク インターフェイスの IP アドレス) のリストを取得できます。この API は、(Chrome 拡張機能だけでなく) あらゆる Web アプリケーションで使用できます。

例:

// 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 に答える
0
> chrome.system.network.getNetworkInterfaces(function(interfaces){
>       console.log(interfaces);    }); 

マニフェスト許可:

"パーミッション": [ "system.network" ], ...

私にも機能し、次のように返信します。

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

0 : {アドレス: "xxxx", 名前: "en0", prefixLength: 64}

1 : {アドレス: "192.168.86.100", 名前: "en0", prefixLength: 24}

2 : {アドレス: "xxxx", 名前: "awdl0", prefixLength: 64}

3 : {アドレス: "xxxx", 名前: "utun0", prefixLength: 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 に答える