Ich erstelle eine Webanwendung, und damit sie ausgeführt werden kann, muss Ihr Gerät registriert sein. Der Registrierungsprozess umfasst die Eingabe der IPv4-Adresse des Geräts, das Sie verwenden möchten, in ein Feld, das die Datenbank aktualisiert.
Beim Zugriff auf die Anwendung wird eine window.webkitRTCPeerConnection
oder window.mozRTCPeerConnection
Prüfung durchgeführt, um die IP-Adresse zu erhalten. Dies funktioniert auf den neuesten Versionen von Chrome und Firefox, aber nicht IE. Also musste ich ActiveX verwenden, wenn die IP nicht von der RTCPeerConnection-Prüfung erhalten wurde.
Mein Problem ist, dass ich möchte, dass Safari die Anwendung ausführen kann, aber ich kann anscheinend nichts finden, wie man die IPv4-Adresse für Geräte, auf denen Safari läuft, bekommt.
Um zu verdeutlichen, ist diese Webanwendung nicht öffentlich zugänglich und wir haben die vollständige Kontrolle darüber, was auf Geräten installiert ist, auf denen die Anwendung ausgeführt wird. (Das ist meine Rechtfertigung für die Verwendung von ActiveX).
Irgendwelche Vorschläge und/oder Hinweise darauf, wie ich so etwas tun könnte, würden geschätzt.IPv4-Adresse mit JavaScript auf Safari abrufen
Antwort
Diese API kann Ihre IP-Adresse erhalten.
Fortgeschrittenere Lösung: http://dev.maxmind.com/geoip/geoip2/javascript/
Dieses unterstützt auch Safari, nach dieser: http://dev.maxmind.com/geoip/geoip2/javascript/#Browser_Support
Der letzte ist meiner Meinung nach die beste. Ich benutze das in einem meiner Projekte.
EDIT: Auf Safari gibt es noch keine Unterstützung für WebRTC-Verbindungen. Daher ist es nicht möglich, die lokale IP-Adresse auf Safari zu erhalten.
Bitte versuchen Sie es auf diese Weise.
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<h4>
Demo for:
<a href="https://github.com/diafygi/webrtc-ips">
https://github.com/diafygi/webrtc-ips
</a>
</h4>
<p>
This demo secretly makes requests to STUN servers that can log your
request. These requests do not show up in developer consoles and
cannot be blocked by browser plugins (AdBlock, Ghostery, etc.).
</p>
<h4>Your local IP addresses:</h4>
<ul></ul>
<h4>Your public IP addresses:</h4>
<ul></ul>
<h4>Your IPv6 addresses:</h4>
<ul></ul>
<iframe id="iframe" sandbox="allow-same-origin" style="display: none"></iframe>
<script>
//get the IP addresses associated with an account
function getIPs(callback){
var ip_dups = {};
//compatibility for firefox and chrome
var RTCPeerConnection = window.RTCPeerConnection
|| window.mozRTCPeerConnection
|| window.webkitRTCPeerConnection;
var useWebKit = !!window.webkitRTCPeerConnection;
//bypass naive webrtc blocking using an iframe
if(!RTCPeerConnection){
//NOTE: you need to have an iframe in the page right above the script tag
//
//<iframe id="iframe" sandbox="allow-same-origin" style="display: none"></iframe>
//<script>...getIPs called in here...
//
var win = iframe.contentWindow;
RTCPeerConnection = win.RTCPeerConnection
|| win.mozRTCPeerConnection
|| win.webkitRTCPeerConnection;
useWebKit = !!win.webkitRTCPeerConnection;
}
//minimal requirements for data connection
var mediaConstraints = {
optional: [{RtpDataChannels: true}]
};
var servers = {iceServers: [{urls: "stun:stun.services.mozilla.com"}]};
//construct a new RTCPeerConnection
var pc = new RTCPeerConnection(servers, mediaConstraints);
function handleCandidate(candidate){
//match just the IP address
var ip_regex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/
var ip_addr = ip_regex.exec(candidate)[1];
//remove duplicates
if(ip_dups[ip_addr] === undefined)
callback(ip_addr);
ip_dups[ip_addr] = true;
}
//listen for candidate events
pc.onicecandidate = function(ice){
//skip non-candidate events
if(ice.candidate)
handleCandidate(ice.candidate.candidate);
};
//create a bogus data channel
pc.createDataChannel("");
//create an offer sdp
pc.createOffer(function(result){
//trigger the stun server request
pc.setLocalDescription(result, function(){}, function(){});
}, function(){});
//wait for a while to let everything done
setTimeout(function(){
//read candidate info from local description
var lines = pc.localDescription.sdp.split('\n');
lines.forEach(function(line){
if(line.indexOf('a=candidate:') === 0)
handleCandidate(line);
});
}, 1000);
}
//insert IP addresses into the page
getIPs(function(ip){
var li = document.createElement("li");
li.textContent = ip;
//local IPs
if (ip.match(/^(192\.168\.|169\.254\.|10\.|172\.(1[6-9]|2\d|3[01]))/))
document.getElementsByTagName("ul")[0].appendChild(li);
//IPv6 addresses
else if (ip.match(/^[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7}$/))
document.getElementsByTagName("ul")[2].appendChild(li);
//assume the rest are public IPs
else
document.getElementsByTagName("ul")[1].appendChild(li);
});
</script>
</body>
</html>
Das hat leider nicht auf Safari funktioniert. Ich habe bereits versucht, RTCPeerConnection zu verwenden, aber es funktioniert nicht wie es in Chrome und Firefox auf Safari funktioniert. – Nathangrad
Dies scheint wirklich gut, aber es wird die öffentliche IP-Adresse und nicht als das, was für die ich suche die lokale Adresse des Gerätes ist (192.168.x.x). – Nathangrad
Antwort aktualisiert. – Red
Ich habe bereits RTCPeerConnection versucht, die in Chrome und Firefox funktioniert. Aber leider funktioniert es in Safari nicht, daher kann ich diese Methode nicht verwenden. – Nathangrad