2013-11-25 4 views
49

मुझे पता है कि इस प्रश्न की प्रारंभिक प्रतिक्रिया "नहीं" है और "यह नहीं किया जा सकता" और "आपको इसकी आवश्यकता नहीं है, आप कुछ गलत कर रहे हैं"। मैं जो करने की कोशिश कर रहा हूं वह उपयोगकर्ताओं को लैन आईपी पता प्राप्त करता है, और इसे वेब पेज पर प्रदर्शित करता है। क्यूं कर? क्योंकि है कि क्या पेज पर मैं काम कर रहा हूँ, सब के बारे में है के बारे में आप जितना संभव हो उतना जानकारी दिखा है, आगंतुक: http://www.whatsmyip.org/more-info-about-you/क्या आप जावास्क्रिप्ट के माध्यम से एक उपयोगकर्ता स्थानीय लैन आईपी पता प्राप्त कर सकते हैं?

इसलिए मैं वास्तव में आईपी के साथ कुछ भी करने से नहीं कर रहा हूँ, यह करने के लिए दिखा के अलावा अन्य जानकारी के प्रयोजनों के लिए उपयोगकर्ता। मैं एक छोटा जावा एप्लेट का उपयोग कर ऐसा करता था। यह बहुत अच्छी तरह से काम किया। लेकिन इन दिनों, ब्राउज़र आपको सबसे अधिक मामूली जावा एप्लेट चलाने के लिए कई बार सहमत और भरोसा करता है, कि मैं बिल्कुल एक नहीं चलाऊंगा।

तो थोड़ी देर के लिए मैंने अभी इस सुविधा से छुटकारा पा लिया, लेकिन यदि संभव हो तो मैं इसे वापस चाहूंगा। यह कुछ ऐसा था जो मैं कंप्यूटर परामर्शदाता के रूप में करता हूं, वास्तव में समय-समय पर उपयोग करता हूं। इस वेबसाइट पर जाने के लिए तेज़ी से यह देखने के लिए तेज़ी से चल रहा है कि नेटवर्क प्राथमिकताएं, नेटवर्किंग, और फिर जो भी इंटरफ़ेस सक्रिय है, उससे नेटवर्क की आईपी रेंज चल रही है।

तो मैं सोच रहा हूं, अगर यह अकेले जावास्क्रिप्ट में ऐसा करने का कोई तरीका है? हो सकता है कि आप जिस नई ऑब्जेक्ट तक पहुंच सकें, वैसे ही जावास्क्रिप्ट ब्राउज़र से पूछ सकता है कि पृथ्वी पर भौगोलिक स्थान कहां है। शायद क्लाइंट नेटवर्किंग जानकारी के लिए कुछ समान है? यदि नहीं, तो शायद यह पूरी तरह से करने के लिए कुछ और तरीका है? एकमात्र तरीकों के बारे में मैं सोच सकता हूं कि जावा एप्लेट, या एक फ्लैश ऑब्जेक्ट है। मैं उन में से किसी एक को नहीं करना चाहूंगा।

+1

आपको उत्तर पता है। तब क्यों पूछ रहे हो? जावा एप्लेट या फ्लैश ऑब्जेक्ट्स को उपयोगकर्ताओं द्वारा अनुमति नहीं दी जा सकती है (केवल उन लोगों द्वारा हो सकता है जो इंटरनेट में नए हैं) - इसलिए यह सामान्य मामले में समाधान नहीं है। ActiveX और आस-पास की सामग्री केवल आईई में काम कर रही है - और, इस प्रकार, अन्य ब्राउज़रों के उपयोगकर्ता प्रभावित नहीं होंगे (और, यहां तक ​​कि, आईई में भी एक सुरक्षा नीति है जो वेब साइट को ग़लत चीजें करने से रोकती है) –

+0

मेरा आईपी पता है उस पृष्ठ पर 'HTTP_X_FORWARDED_FOR' के माध्यम से कब्जा कर लिया गया, बस कहें'। – tomdemuyt

+15

फिर क्यों पूछें? क्योंकि शायद, शायद, मैं सबकुछ नहीं जानता। – l008com

उत्तर

64

जैसा कि यह पता चला है, एचटीएमएल 5 का हालिया वेबआरटीसी एक्सटेंशन जावास्क्रिप्ट को स्थानीय क्लाइंट आईपी पते से पूछताछ करने की अनुमति देता है। अवधारणा का सबूत यहां उपलब्ध है: http://net.ipcalf.com

यह सुविधा स्पष्ट रूप से by design है, और यह एक बग नहीं है। हालांकि, इसकी विवादास्पद प्रकृति को देखते हुए, मैं इस व्यवहार पर भरोसा करने के बारे में सतर्क रहूंगा। फिर भी, मुझे लगता है कि यह पूरी तरह से और उचित रूप से आपके इच्छित उद्देश्य को संबोधित करता है (उपयोगकर्ता को यह बताता है कि उनका ब्राउज़र क्या लीक कर रहा है)।

+0

यह सहायक था। एक बार फिर धन्यवाद! –

+2

यह क्रोम और फ़ायरफ़ॉक्स पर काम कर रहा है, और आईई, एज या सफारी पर नहीं – ali

43

afourney के उत्तर के अतिरिक्त यह कोड वेबआरटीसी (क्रोम और फ़ायरफ़ॉक्स) का समर्थन करने वाले ब्राउज़र में काम करता है। मैंने सुना है कि एक ऐसी सुविधा को लागू करने के लिए एक आंदोलन चल रहा है जो साइटों को आईपी (जैसे उपयोगकर्ता के भू-स्थान या उपयोगकर्ता-मीडिया के मामले में) का अनुरोध करता है, हालांकि इसे अभी तक उन ब्राउज़रों में लागू नहीं किया गया है।

यहाँ source code का एक संशोधित संस्करण है, कम लाइनों, किसी भी अचेत अनुरोध करने की नहीं के बाद से आपको केवल स्थानीय आईपी चाहते नहीं सार्वजनिक आईपी:

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; 
} 
}; 

हम रिमोट के लिए एक डमी सहकर्मी कनेक्शन पैदा कर रहे हमसे संपर्क करने के लिए सहकर्मी। हम आम तौर पर एक दूसरे के साथ बर्फ उम्मीदवारों का आदान-प्रदान करते हैं और बर्फ उम्मीदवारों को पढ़ते हैं जिन्हें हम उपयोगकर्ता के आईपी को बता सकते हैं।

आप पर एक डेमो पा सकते हैं ->Demo

+0

यह एज में काम नहीं करता है। क्या आप समझा सकते हैं क्यों? – dampee

+0

इस मिडो के लिए धन्यवाद! बहुत सराहना की। –

+0

@dampee - मुझे विश्वास है कि एज इस समय डेटा चैनलों का समर्थन नहीं करता है। – MichaelB76

1

आप क्या सीमाओं ब्राउज़रों की संभावना है और इस कम करने के लिए जोड़ देगा के बारे में अधिक जानकारी प्राप्त कर सकते क्या IETF क्यों इस 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

कृपया अपने कोड को उचित रूप से प्रारूपित करने के लिए संपादक विकल्पों का उपयोग करें। – 31piy

+0

यह बहुत अच्छा होगा अगर आप न केवल कुछ कोड छोड़ देंगे, बल्कि यह भी बताएंगे कि उसके और आपके कोड में क्या हो रहा है। यह प्रश्न लेखक और अन्य उपयोगकर्ताओं की मदद करता है। यह अच्छा है अगर यह काम करता है, लेकिन यह जानकर कि मेरी राय में और भी महत्वपूर्ण क्यों है। – davejal

0

मैंने मिडो की पोस्ट साफ़ कर दी और फिर उन्हें मिले कार्यों को साफ़ कर दिया। यह या तो false या array वापस करेगा।का परीक्षण करते समय याद रखें कि आपको वेब डेवलपर कंसोल में सरणी को ध्वस्त करने की आवश्यकता है अन्यथा यह अवांछित डिफ़ॉल्ट व्यवहार आपको यह सोचने के लिए धोखा दे सकता है कि यह खाली array खाली कर रहा है।

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; 
} 
संबंधित मुद्दे