WebRTCを使用してローカルクライアントIPを取得するにはどうすればよいですか。
クライアントのREMOTE_ADDR
は必要ありませんが、彼のローカルネットワークIPは必要です。これはsharedrop.com
のようなWebサイトで以前に見たことがあり、WebRTCを使用して同じネットワーク内のコンピューターを認識します。
PHP私はクライアントにリモートIPを取得するためにこれを行います:
<?php
echo $_SERVER["REMOTE_ADDR"]; // which would return 72.72.72.175
?>
私はstackoverflowを調べましたが、すべての質問はリモートアドレスを使用して回答されます。
リモートアドレスの代わりにJavaScriptを使用してローカルIP(たとえば192.168.1.24)を取得するにはどうすればよいですか。
ここからコードを取得しました-> ソース
デモは-> デモ にあります。
パブリックIPではなくローカルIPのみが必要なため、ソースコードを変更し、行を減らし、スタンリクエストを作成しませんでした。以下のコードは最新のFirefoxとChromeで機能します。
window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; //compatibility for firefox and chrome
var pc = new RTCPeerConnection({iceServers:[]}), noop = function(){};
pc.createDataChannel(""); //create a bogus data channel
pc.createOffer(pc.setLocalDescription.bind(pc), noop); // create offer and set local description
pc.onicecandidate = function(ice){ //listen for candidate events
if(!ice || !ice.candidate || !ice.candidate.candidate) return;
var myIP = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/.exec(ice.candidate.candidate)[1];
console.log('my IP: ', myIP);
pc.onicecandidate = noop;
};
ここで起こっていることは、ダミーのピア接続を作成していることです。リモートピアから連絡を受けるために、通常、氷の候補を相互に交換します。そして、氷の候補を読むと、ユーザーのIPを知ることができます。
このバージョンは、最新のブラウザで使用できます(Promises
およびasync / await
)
// minified onliner, 219b
const ip = await new Promise((s,f,c=new RTCPeerConnection(),k='candidate')=>(c.createDataChannel(''),c.createOffer(o=>c.setLocalDescription(o),f),c.onicecandidate=i=>i&&i[k]&&i[k][k]&&c.close(s(i[k][k].split(' ')[4]))))
// cleaned, 363b
const ip = await new Promise((resolve, reject) => {
const conn = new RTCPeerConnection()
conn.createDataChannel('')
conn.createOffer(offer => conn.setLocalDescription(offer), reject)
conn.onicecandidate = ice => {
if (ice && ice.candidate && ice.candidate.candidate) {
resolve(i.candidate.candidate.split(' ')[4])
conn.close()
}
}
})