2013-11-25 41 views
49

Tôi biết phản ứng ban đầu của câu hỏi này là "không" và "nó không thể được thực hiện" và "bạn không nên cần nó, bạn đang làm điều gì sai". Những gì tôi đang cố gắng làm là lấy địa chỉ IP LAN của người dùng và hiển thị nó trên trang web. Tại sao? Bởi vì đó là những gì trang tôi đang làm việc là tất cả về, hiển thị càng nhiều thông tin càng tốt về bạn, người truy cập: http://www.whatsmyip.org/more-info-about-you/Bạn có thể lấy địa chỉ IP LAN cục bộ của người dùng qua JavaScript không?

Vì vậy, tôi không thực sự LÀM bất cứ điều gì với IP, khác hơn là hiển thị nó cho người dùng cho mục đích thông tin. Tôi đã từng làm điều này bằng cách sử dụng một applet Java nhỏ. Nó hoạt động khá tốt. Nhưng những ngày này, trình duyệt làm cho bạn nhấn đồng ý và tin tưởng rất nhiều lần, để chạy ngay cả những applet java nhỏ nhất, mà tôi không muốn chạy một ở tất cả.

Vì vậy, trong một thời gian tôi vừa loại bỏ tính năng này, nhưng tôi muốn nó trở lại nếu có thể. Đó là điều mà tôi, với tư cách là một nhà tư vấn máy tính, sẽ thực sự sử dụng theo thời gian. Truy cập trang web này nhanh hơn để xem mạng IP nào đang chạy trên mạng, hơn là vào System Preferences, Networking, và sau đó giao diện bất kỳ hoạt động.

Vì vậy, tôi tự hỏi, hy vọng, nếu có một số cách để làm điều đó trong javascript một mình? Có thể một số đối tượng mới bạn có thể truy cập, tương tự như cách javascript có thể hỏi trình duyệt vị trí địa lý trên trái đất là gì. Có lẽ theres một cái gì đó tương tự cho thông tin mạng khách hàng? Nếu không, có lẽ theres một số cách khác hoàn toàn để làm điều đó? Cách duy nhất tôi có thể nghĩ là một applet java, hoặc một đối tượng flash. Tôi không muốn làm một trong số đó.

+1

Bạn biết câu trả lời. Tại sao yêu cầu sau đó? Các ứng dụng Java hoặc các đối tượng flash không được phép bởi người dùng (có thể chỉ bởi những người mới sử dụng Internet) - vì vậy nó không phải là một giải pháp trong trường hợp thông thường. ActiveX và các công cụ lân cận chỉ hoạt động trong IE - và do đó, người dùng các trình duyệt khác sẽ không bị ảnh hưởng (và hơn thế nữa, ngay cả trong IE có chính sách bảo mật ngăn trang web làm những việc khó chịu) –

+0

Địa chỉ IP của tôi bị bắt thông qua 'HTTP_X_FORWARDED_FOR' trên trang đó, chỉ cần sayin'. – tomdemuyt

+15

Tại sao lại hỏi? Bởi vì có lẽ, chỉ có thể, tôi không biết mọi thứ. – l008com

Trả lời

64

Khi nó quay ra, phần mở rộng WebRTC gần đây của HTML5 cho phép javascript truy vấn địa chỉ IP của máy khách cục bộ. Bằng chứng về khái niệm có sẵn tại đây: http://net.ipcalf.com

Tính năng này rõ ràng là by design và không phải là lỗi. Tuy nhiên, với tính chất gây tranh cãi của nó, tôi sẽ thận trọng về việc dựa vào hành vi này. Tuy nhiên, tôi nghĩ rằng nó hoàn toàn và phù hợp với mục đích của bạn (tiết lộ cho người dùng những gì trình duyệt của họ bị rò rỉ).

+0

Điều này hữu ích. Cảm ơn một lần nữa! –

+2

Nó chỉ hoạt động trên chrome và firefox, VÀ NOT trên IE, Edge hoặc safari – ali

43

Ngoài câu trả lời của afourney, mã này hoạt động trong các trình duyệt hỗ trợ WebRTC (Chrome và Firefox). Tôi nghe nói có một chuyển động đang diễn ra để thực hiện một tính năng làm cho các trang web yêu cầu IP (như trong trường hợp vị trí địa lý của người dùng hoặc phương tiện truyền thông người dùng) mặc dù nó chưa được triển khai trong cả hai trình duyệt đó.

Đây là một phiên bản sửa đổi của source code, giảm các dòng, không phải thực hiện bất kỳ yêu cầu gây choáng vì bạn chỉ muốn IP địa phương không phải là IP công cộng:

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) 
{ 
if (ice && ice.candidate && ice.candidate.candidate) 
{ 
    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; 
} 
}; 

Chúng tôi đang tạo ra một kết nối ngang hàng giả cho điều khiển từ xa ngang hàng với chúng tôi. Chúng tôi thường trao đổi các ứng cử viên băng với nhau và đọc các ứng cử viên băng chúng tôi có thể nói cho ip của người dùng.

Bạn có thể tìm thấy một bản demo tại ->Demo

+0

Nó không hoạt động trong Edge. Bạn có thể giải thích tại sao? – dampee

+0

Cảm ơn vì Mido này! Nhiều đánh giá cao. –

+0

@dampee - Tôi tin rằng Edge không hỗ trợ kênh dữ liệu vào lúc này. – MichaelB76

1

Bạn có thể tìm thêm thông tin về những gì hạn chế các trình duyệt có khả năng sẽ bổ sung để giảm thiểu này và những gì IETF đang làm về nó cũng như tại sao điều này là cần thiết tại IETF SPEC on IP handling

3
function getUserIP(onNewIP) { // onNewIp - your listener function for new IPs 
    //compatibility for firefox and chrome 
    var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; 
    var pc = new myPeerConnection({ 
     iceServers: [] 
    }), 
    noop = function() {}, 
    localIPs = {}, 
    ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g, 
    key; 

    function iterateIP(ip) { 
     if (!localIPs[ip]) onNewIP(ip); 
     localIPs[ip] = true; 
    } 

    //create a bogus data channel 
    pc.createDataChannel(""); 

    // create offer and set local description 
    pc.createOffer().then(function(sdp) { 
     sdp.sdp.split('\n').forEach(function(line) { 
      if (line.indexOf('candidate') < 0) return; 
      line.match(ipRegex).forEach(iterateIP); 
     }); 

     pc.setLocalDescription(sdp, noop, noop); 
    }).catch(function(reason) { 
     // An error occurred, so handle the failure to connect 
    }); 

    //listen for candidate events 
    pc.onicecandidate = function(ice) { 
     if (!ice || !ice.candidate || !ice.candidate.candidate || !ice.candidate.candidate.match(ipRegex)) return; 
     ice.candidate.candidate.match(ipRegex).forEach(iterateIP); 
    }; 
} 
+0

Vui lòng sử dụng các tùy chọn trình chỉnh sửa để định dạng mã của bạn một cách thích hợp. – 31piy

+0

Sẽ thật tuyệt vời nếu bạn không chỉ thả một số mã, mà còn đưa ra lời giải thích về những gì đang diễn ra trong mã của anh ta và của bạn. Nó giúp tác giả câu hỏi và những người dùng khác. Sẽ tốt nếu nó hoạt động, nhưng biết lý do tại sao thậm chí còn quan trọng hơn trong quan điểm của tôi. – davejal

0

Tôi đã xóa bài đăng của mido và sau đó làm sạch chức năng mà họ tìm thấy. Điều này sẽ trả lại false hoặc array.Khi thử nghiệm hãy nhớ mà bạn cần thu gọn mảng trong bảng điều khiển dành cho nhà phát triển web nếu không hành vi mặc định không trực quan có thể lừa bạn nghĩ rằng nó đang trả về một array trống.

function ip_local() 
{ 
var ip = false; 
window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection || false; 

if (window.RTCPeerConnection) 
{ 
    var ip = []; 
    var pc = new RTCPeerConnection({iceServers:[]}), noop = function(){}; 
    pc.createDataChannel(''); 
    pc.createOffer(pc.setLocalDescription.bind(pc), noop); 

    pc.onicecandidate = function(event) 
    { 
    if (event && event.candidate && event.candidate.candidate) 
    { 
    var s = event.candidate.candidate.split('\n'); 
    ip.push(s[0].split(' ')[4]); 
    } 
    } 
} 

return ip; 
} 
Các vấn đề liên quan