আপনি কি জাভাস্ক্রিপ্টের মাধ্যমে কোনও স্থানীয় ল্যান আইপি ঠিকানা পেতে পারেন?


102

আমি জানি এই প্রশ্নের প্রাথমিক প্রতিক্রিয়া হ'ল "না" এবং "এটি করা যায় না" এবং "আপনার এটির দরকার নেই, আপনি কিছু ভুল করছেন"। আমি যা করার চেষ্টা করছি তা হল ব্যবহারকারীদের ল্যান আইপি ঠিকানাটি পাওয়া এবং এটি ওয়েব পৃষ্ঠায় প্রদর্শন করা। কেন? কারণ যে পৃষ্ঠায় আমি কাজ করছি সে সম্পর্কে আপনার সম্পর্কে যতটা সম্ভব তথ্য প্রদর্শিত হচ্ছে: http://www.whatsmyip.org/more-info-about-you/

সুতরাং আমি আইপি দিয়ে আসলে কিছুই করছি না, তথ্যগত উদ্দেশ্যে ব্যবহারকারীর কাছে এটি প্রদর্শন করা ব্যতীত। আমি একটি ছোট জাভা অ্যাপলেট ব্যবহার করে এটি করতাম। এটি বেশ ভাল কাজ করেছে। তবে এই দিনগুলিতে, ব্রাউজার আপনাকে একাধিক গৌণ জাভা অ্যাপলেট চালানোর জন্য আপনাকে অনেকবার একমত ও বিশ্বাস করতে বাধ্য করে, আমি বরং এটি চালাতে চাই না।

তাই কিছুক্ষণের জন্য আমি এই বৈশিষ্ট্যটি থেকে মুক্তি পেয়েছি তবে সম্ভব হলে আমি এটি আবার চাই। এটি এমন একটি বিষয় যা আমি কম্পিউটার পরামর্শদাতা হিসাবে সময়ে সময়ে সময়ে ব্যবহার করব। সিস্টেমের পছন্দসমূহ, নেটওয়ার্কিং এবং তারপরে যে কোনও ইন্টারফেস সক্রিয় রয়েছে তার চেয়ে কোনও নেটওয়ার্ক কোন আইপি রেঞ্জ চলছে তা দেখার জন্য এই ওয়েবসাইটে যেতে তত দ্রুত।

সুতরাং আমি ভাবছি, আশা করছি, এটি যদি জাভাস্ক্রিপ্টে একা করার কোনও উপায় থাকে? জাভাস্ক্রিপ্ট যেভাবে ব্রাউজারটিকে জিজ্ঞাসা করতে পারে পৃথিবীর ভৌগলিক অবস্থান কোথায়, তার অনুরূপ হতে পারে কিছু নতুন অবজেক্ট আপনি অ্যাক্সেস করতে পারবেন। ক্লায়েন্ট নেটওয়ার্কিং তথ্যের জন্য অনুরূপ কিছু থাকতে পারে? যদি না হয়, সম্ভবত এটি করার জন্য অন্য কোনও উপায় আছে? আমি কেবল জাভা অ্যাপলেট বা কোনও ফ্ল্যাশ অবজেক্ট হিসাবে ভাবতে পারি। আমি বরং এর একটিও করতাম না।


1
আপনি উত্তর জানেন। তাহলে কেন জিজ্ঞাসা করছেন? জাভা অ্যাপলেট বা ফ্ল্যাশ অবজেক্ট ব্যবহারকারীদের দ্বারা অনুমোদিত হওয়ার সম্ভাবনা নেই (কেবলমাত্র যারা ইন্টারনেটে নতুন হয়েছেন তারা হতে পারেন) - সুতরাং এটি সাধারণ ক্ষেত্রে সমাধান নয় not অ্যাক্টিভএক্স এবং কাছের জিনিসগুলি কেবল আইই তে কাজ করছে - এবং, এইভাবে, অন্যান্য ব্রাউজারগুলির ব্যবহারকারীরা প্রভাবিত হবে না (এবং আরও, এমনকি আই-তে একটি সুরক্ষা নীতিও রয়েছে যা ওয়েব সাইটকে বাজে কাজগুলি করা থেকে বিরত করে)
আলমা ডু

আমার আইপি ঠিকানাটি HTTP_X_FORWARDED_FORওই পৃষ্ঠায় ধরা পড়েছে, শুধু বলুন `
tomdemuyt

50
তাহলে কেন জিজ্ঞাসা করবেন? কারণ হতে পারে, ঠিক হয়তো, আমি সব জানি না।
l008com

1
এই না না এটা: whatismyproxy.com
likebike

1
পছন্দ করুন তারা কীভাবে এটি করছে তা খতিয়ে দেখছেন।
ডোমিনিক সেরিসানো

উত্তর:


117

দেখা যাচ্ছে যে এইচটিএমএল 5 এর সাম্প্রতিক ওয়েবআরটিসি এক্সটেনশান জাভাস্ক্রিপ্টকে স্থানীয় ক্লায়েন্টের আইপি ঠিকানাটি জিজ্ঞাসা করার অনুমতি দেয়। ধারণার একটি প্রমাণ এখানে উপলব্ধ: http://net.ipcalf.com

এই বৈশিষ্ট্যটি দৃশ্যত নকশার দ্বারা তৈরি এবং এটি কোনও বাগ নয়। তবে এর বিতর্কিত প্রকৃতির কারণে, আমি এই আচরণের উপর নির্ভর করা সম্পর্কে সতর্ক থাকব be তবুও, আমি মনে করি এটি নিখুঁতভাবে এবং যথাযথভাবে আপনার উদ্দেশ্যযুক্ত উদ্দেশ্যে সম্বোধন করে (তাদের ব্রাউজারটি কী ফাঁস করছে তা ব্যবহারকারীকে প্রকাশ করে)।


1
এটি সহায়ক ছিল। আবার ধন্যবাদ!
আনসুরজ খড়ঙ্গ

7
এটি কেবল ক্রোম এবং ফায়ারফক্সে কাজ করছে, এবং আইই, এজ বা সাফারিতে নয়
আলি

আমি আমার WAN আইপি এবং এই ওয়েবসাইট হোয়াটস্মিআইপি ডটকমটি আমার স্থানীয় আইপিও দিয়েছিলাম এবং আমার ধারণা এটির জেএসের সাথে কিছু ছিল।
শায়ান

@ আইলি আপনি সঠিক, আমি উপরে উল্লিখিত ওয়েবসাইটটি এজতে আমার স্থানীয় আইপি বলতে সক্ষম নয়।
শায়ান

6
গুগল ক্রোম স্থানীয় আইপি ডিফল্টভাবে লুকিয়ে রাখছে। এটি e87e041d-15e1-4662-adad-7a6601fca9fb.local এর মতো কিছু দেখায় । এই আচরণ পরিবর্তনশীল সেটিং দ্বারা পরিবর্তন হতে পারে # সক্ষম-WebRTC-লুকান-স্থানীয়-আইপিএস-mDNS সঙ্গে করতে অক্ষম Chrome এ: // পতাকা
injaon

81

হালনাগাদ

এই সমাধানটি আর কাজ করবে না কারণ ব্রাউজারগুলি ওয়েলব্র্যাটিক ফাঁস ফিক্স করছে: এর আরও তথ্যের জন্য এই অন্যান্য প্রশ্নটি পড়ুন: আরটিসিআইসিস্যান্ডিডিট আর আইপি ফিরবে না


আফোর্নির উত্তর ছাড়াও এই কোডটি ওয়েবআরটিসি (ক্রোম এবং ফায়ারফক্স) সমর্থনকারী ব্রাউজারগুলিতে কাজ করে। আমি শুনেছি এমন একটি বৈশিষ্ট্য বাস্তবায়নের জন্য একটি আন্দোলন চলছে যা সাইটগুলি আইপি-র অনুরোধ করে তোলে (যেমন ব্যবহারকারীর ভূ-অবস্থান বা ব্যবহারকারী-মিডিয়া ক্ষেত্রে) যদিও এখনও সেগুলি ব্রাউজারগুলির কোনওটিতে প্রয়োগ করা হয়নি।

এখানে সোর্স কোডের একটি পরিবর্তিত সংস্করণ দেওয়া আছে , লাইনগুলি হ্রাস করা হয়েছে, কোনও স্তম্ভিত অনুরোধ করা হচ্ছে না কারণ আপনি কেবল স্থানীয় আইপি চান পাবলিক আইপি:

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

আমরা আমাদের সাথে যোগাযোগ করার জন্য রিমোট পিয়ারের জন্য একটি ডামি পিয়ার সংযোগ তৈরি করছি। আমরা সাধারণত একে অপরের সাথে বরফ প্রার্থীদের আদান প্রদান করি এবং বরফ প্রার্থীদের পড়া আমরা ব্যবহারকারীকে আইপি বলতে পারি।

> - আপনি একটি ডেমো জানতে পারেন ডেমো


এই মিডোর জন্য ধন্যবাদ! অনেক প্রশংসিত.
সুজয় ফাদকে

1
@ ড্যাম্পি - আমি বিশ্বাস করি এজ মুহুর্তে ডেটা চ্যানেলগুলিকে সমর্থন করে না।
মাইকেলবি 76

বগাস ডেটা চ্যানেল কী? গুগলে কোনও রেফারেন্স খুঁজে পাচ্ছেন না
অ্যামেজিং টার্টল

2
নোট করুন ক্রিয়েটঅফার এপিআই সাফল্যের পরিবর্তে প্রতিশ্রুতি ভিত্তিতে পরিণত হয়েছে কলব্যাক এবং ব্যর্থ কলব্যাক প্যারাম হিসাবে, সুতরাং এটি আরও নতুন সংস্করণে কাজ করতে পারে না, দেখুন: ডেভেলপার.মোজিলা.অর্গ
ডিকেলথ

10

WebRTC API এর ক্লায়েন্টের স্থানীয় আইপি পুনরুদ্ধার করতে ব্যবহার করা যাবে।

তবে ব্রাউজারটি এটি সমর্থন করে না, বা ক্লায়েন্ট সুরক্ষার কারণে এটি অক্ষম করতে পারে। যে কোনও ক্ষেত্রে, দীর্ঘমেয়াদে এই "হ্যাক" এর উপর নির্ভর করা উচিত নয় কারণ এটি ভবিষ্যতে প্যাচ হওয়ার সম্ভাবনা রয়েছে (দেখুন কুলেন ফ্লাফি জেনিংস এর উত্তর)।

নীচের ইসমাস্ক্রিপ্ট 6 কোডটি কীভাবে এটি করতে হয় তা দেখায়।

/* ES6 */
const findLocalIp = (logInfo = true) => new Promise( (resolve, reject) => {
    window.RTCPeerConnection = window.RTCPeerConnection 
                            || window.mozRTCPeerConnection 
                            || window.webkitRTCPeerConnection;

    if ( typeof window.RTCPeerConnection == 'undefined' )
        return reject('WebRTC not supported by browser');

    let pc = new RTCPeerConnection();
    let ips = [];

    pc.createDataChannel("");
    pc.createOffer()
     .then(offer => pc.setLocalDescription(offer))
     .catch(err => reject(err));
    pc.onicecandidate = event => {
        if ( !event || !event.candidate ) {
            // All ICE candidates have been sent.
            if ( ips.length == 0 )
                return reject('WebRTC disabled or restricted by browser');

            return resolve(ips);
        }

        let parts = event.candidate.candidate.split(' ');
        let [base,componentId,protocol,priority,ip,port,,type,...attr] = parts;
        let component = ['rtp', 'rtpc'];

        if ( ! ips.some(e => e == ip) )
            ips.push(ip);

        if ( ! logInfo )
            return;

        console.log(" candidate: " + base.split(':')[1]);
        console.log(" component: " + component[componentId - 1]);
        console.log("  protocol: " + protocol);
        console.log("  priority: " + priority);
        console.log("        ip: " + ip);
        console.log("      port: " + port);
        console.log("      type: " + type);

        if ( attr.length ) {
            console.log("attributes: ");
            for(let i = 0; i < attr.length; i += 2)
                console.log("> " + attr[i] + ": " + attr[i+1]);
        }

        console.log();
    };
} );

আমি লিখছি return resolve(..)বা return reject(..)শর্টকাট হিসাবে লক্ষ্য করুন । এই দুটি ফাংশনই কিছু ফিরিয়ে দেয় না।

তারপরে আপনার এই কিছু থাকতে পারে:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Local IP</title>
</head>
<body>
    <h1>My local IP is</h1>
    <p id="ip">Loading..</p>
    <script src="ip.js"></script>
    <script>
    let p = document.getElementById('ip');
    findLocalIp().then(
        ips => {
            let s = '';
            ips.forEach( ip => s += ip + '<br>' );
            p.innerHTML = s;
        },
        err => p.innerHTML = err
    );
    </script>
</body>
</html>

9

আমি মিডোর পোস্ট পরিষ্কার করেছি এবং তারপরে তারা খুঁজে পাওয়া ফাংশনটি পরিষ্কার করে দিয়েছি। এটি হয় ফিরে আসবে falseবা একটি array। পরীক্ষার সময় মনে রাখবেন যে আপনাকে ওয়েব বিকাশকারী কনসোলে অ্যারেটি ভেঙে ফেলতে হবে অন্যথায় এটি অরক্ষিত ডিফল্ট আচরণ আপনাকে ভেবে ভ্রান্ত করতে পারে যে এটি খালি ফিরে আসছে array

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

 if (window.RTCPeerConnection)
 {
  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;
}

অতিরিক্তভাবে দয়া করে লোকেরা মনে রাখবেন যে এটি সিএসএসের মতো পুরানো-নতুন কিছু নয় border-radiusযদিও সেই বিটগুলির মধ্যে একটি যা আইই 11 এবং তার চেয়ে বেশি পুরানো সমর্থন করে নাসর্বদা অবজেক্ট শনাক্তকরণ ব্যবহার করুন, যুক্তিসঙ্গতভাবে পুরানো ব্রাউজারগুলিতে পরীক্ষা করুন (যেমন ফায়ারফক্স 4, আই 9, অপেরা 12.1) এবং নিশ্চিত করুন যে আপনার নতুন স্ক্রিপ্টগুলি আপনার নতুন বিটের কোডটি ভঙ্গ করছে না। অতিরিক্তভাবে সর্বদা মান মেনে চলার কোডটি প্রথমে সনাক্ত করুন সুতরাং কোনও সিএসএস প্রিফিক্স যদি প্রথমে মানহীন প্রিফিক্সড কোডটি সনাক্ত করে এবং তারপরে দীর্ঘমেয়াদী সমর্থন হিসাবে ফিরে আসে তবে তার অস্তিত্বের বাকি অংশগুলির জন্য শেষ পর্যন্ত মানক করা হবে।


আপনি পুনরায় বিবরণ করছেন ip- লাইন 3 এবং লাইন 8
ব্যবহারকারী 2757813

ইন্টারনেট এক্সপ্লোরার 15 (বা "এজ 15") না হওয়া পর্যন্ত অানু ওয়েবআরটিসি চালু করা হয়নি। এই কারণেই উপরের চতুর্থ লাইনে যদি অবজেক্টগুলির কোনও উপস্থিত না থাকে তবে ফাংশনটি মিথ্যাতে ফিরে আসবে না। আইইতে যদি এটি অর্জনের অন্য কোনও উপায় থাকে তবে আমি এখনই এটি সম্পর্কে সচেতন নই।
জন

@ জন - আমরা কীভাবে পিএইচপি ভেরিয়েবলের রিটার্ন মানটি পাস করব? একটি লুকানো পোস্টের মাধ্যমে?
মার্কোজেইন

@ মার্কোজেইন আপনি হয় ব্যবহার করতে পারেন <input name="example1" type="hidden" value="whatever" />বা এ জাতীয় পরিস্থিতিতে একটি এজেএক্স পোস্ট ব্যবহার করতে পারেন । আমি ajax()এখানে আমার ফাংশনটি অধ্যয়নের জন্য অত্যন্ত পরামর্শ দিচ্ছি : jabcreations.com
জন

সবেমাত্র পাওয়া গেছে যে কোনও ব্রাউজার (যেমন ক্রোম) এখন আইপি সরবরাহ করে block একই কোড এখন কোনও এমডিএনএস হোস্টনেমে সমাধান করে, যদি কোনও ভিডিও / অডিও অনুমতি না চাওয়া হয়। দেখুন groups.google.com/forum/#!topic/discuss-webrtc/6stQXi72BEU
ক্রিস্টোফ Bimminger

6

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;
  }
  onNewIP
  //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);
  };
}
getUserIP(console.log)


আপনার কোডটি যথাযথভাবে ফর্ম্যাট করতে সম্পাদক বিকল্পগুলি ব্যবহার করুন।
31 পিআই

3
এটি দুর্দান্ত হবে যদি আপনি কেবল কিছু কোড না ফেলে, তবে তার এবং আপনার কোডটিতে কী চলছে তার একটি ব্যাখ্যাও দিয়ে থাকেন। এটি প্রশ্ন লেখক এবং অন্যান্য ব্যবহারকারীদের সহায়তা করে। এটি যদি কাজ করে তবে ভাল, তবে কেন আমার মতে আরও বেশি গুরুত্বপূর্ণ তা জেনে।
দাভেজাল

কোন আইই সুসংগত সমাধান?
আনু

1
মন্তব্যটি এই নিবন্ধটির একটি অনুলিপি করা হয়েছে: ourcodeworld.com/articles/read/257/…
দার্কিফটি

সবেমাত্র পাওয়া গেছে যে কোনও ব্রাউজার (যেমন ক্রোম) এখন আইপি সরবরাহ করে block একই কোড এখন কোনও এমডিএনএস হোস্টনেমে সমাধান করে, যদি কোনও ভিডিও / অডিও অনুমতি না চাওয়া হয়। দেখুন groups.google.com/forum/#!topic/discuss-webrtc/6stQXi72BEU
ক্রিস্টোফ Bimminger

5

ক্রোম 76+

জাভাস্ক্রিপ্টের মাধ্যমে আমার স্থানীয় আইপি সফলভাবে আবিষ্কার করতে আমি লিনব্লোর উত্তর (2018-অক্টোবর-19) ব্যবহার করেছি। তবে, সাম্প্রতিক ক্রোম আপডেটগুলি (? 76?) এই পদ্ধতিটিকে চূড়ান্ত করেছে যাতে এটি এখন একটি অস্পষ্ট আইপি প্রদান করে, যেমন:1f4712db-ea17-4bcf-a596-105139dfd8bf.local

আপনার ব্রাউজারে যদি আপনার সম্পূর্ণ নিয়ন্ত্রণ থাকে তবে আপনি নিজের অ্যাড্রেস বারে টাইপ করে এটি ক্রোম ফ্ল্যাগগুলিতে বন্ধ করে এই আচরণটি পূর্বাবস্থায় ফিরিয়ে আনতে পারেন:

chrome://flags

এবং পতাকাটি নিষ্ক্রিয় করুন Anonymize local IPs exposed by WebRTC

আমার ক্ষেত্রে, আমার বর্তমান অবস্থানটি নির্ধারণ করতে এবং আমার অবস্থানের উপর ভিত্তি করে বিভিন্ন জিনিস করার জন্য আমার একটি টম্পারমনকি স্ক্রিপ্টের জন্য আইপি প্রয়োজন। আমার নিজের ব্রাউজার সেটিংসে কোনও নিয়ন্ত্রণ নেই (কোনও কর্পোরেট নীতি ইত্যাদি) etc সুতরাং আমার জন্য, chrome://flagsসেটিংস পরিবর্তন করা কৌশলটি করে।

সূত্র:

https://groups.google.com/forum/#!topic/discuss-webrtc/6stQXi72BEU

https://codelabs.developers.google.com/codelabs/webrtc-web/index.html


পতাকাটি চলে যেতে পারে। বর্তমানে এটি দেখে মনে হচ্ছে এক্সটেনশনগুলি এখনও আইপি পেয়ে থাকে তাই আপনি এটি পটভূমির স্ক্রিপ্ট থেকে পাওয়ার চেষ্টা করতে পারেন। যদিও দীর্ঘমেয়াদী সমস্ত বেট বন্ধ রয়েছে।
ফিলিপ হ্যাঙ্কে

1
Groups.google.com/forum/#!topic/discuss-webrtc/6stQXi72BEU অনুসারে, আইপিটি যদি আপনার সমাধানটি অডিও / ভিডিও অনুমতির জন্য আবেদন করে তবে তা প্রয়োগ করা উচিত।
ক্রিস্টোফ বিমিনেগার

4

ব্রাউজারগুলি এটি সীমাবদ্ধ করতে সম্ভবত কী সীমাবদ্ধতা যুক্ত করবে এবং আইইটিএফ এটি সম্পর্কে কী করছে এবং আইপি হ্যান্ডলিংয়ের আইইটিএফ স্পেক- এ কেন এটি প্রয়োজন তা সম্পর্কে আপনি আরও তথ্য পেতে পারেন


0

একটি RTCPeerConnectionব্যবহার করা যেতে পারে। ক্রোমের মতো ব্রাউজারগুলিতে যেখানে getUserMediaঅনুমতি লাগে , আমরা কেবল উপলব্ধ ইনপুট ডিভাইসগুলি সনাক্ত করতে পারি এবং তাদের জন্য অনুরোধ করতে পারি।

const internalIp = async () => {
    if (!RTCPeerConnection) {
        throw new Error("Not supported.")
    }

    const peerConnection = new RTCPeerConnection({ iceServers: [] })

    peerConnection.createDataChannel('')
    peerConnection.createOffer(peerConnection.setLocalDescription.bind(peerConnection), () => { })

    peerConnection.addEventListener("icecandidateerror", (event) => {
        throw new Error(event.errorText)
    })

    return new Promise(async resolve => {
        peerConnection.addEventListener("icecandidate", async ({candidate}) => {
            peerConnection.close()

            if (candidate && candidate.candidate) {
                const result = candidate.candidate.split(" ")[4]
                if (result.endsWith(".local")) {
                    const inputDevices = await navigator.mediaDevices.enumerateDevices()
                    const inputDeviceTypes = inputDevices.map(({ kind }) => kind)

                    const constraints = {}

                    if (inputDeviceTypes.includes("audioinput")) {
                        constraints.audio = true
                    } else if (inputDeviceTypes.includes("videoinput")) {
                        constraints.video = true
                    } else {
                        throw new Error("An audio or video input device is required!")
                    }

                    const mediaStream = await navigator.mediaDevices.getUserMedia(constraints)
                    mediaStream.getTracks().forEach(track => track.stop())
                    resolve(internalIp())
                }
                resolve(result)
            }
        })
    })
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.