Hoe krijg ik het IP-adres van de klant met JavaScript?

Ik moet op de een of andere manier het IP-adres van de klant ophalen met JavaScript; geen server-side code, zelfs geen SSI.

Ik ben echter niet tegen het gebruik van een gratis script/service van derden.


Antwoord 1, autoriteit 100%

Ik zou een webservice gebruiken die JSON kan retourneren (samen met jQuery om dingen eenvoudiger te maken). Hieronder staan alle actievegratis IP-zoekservices die ik kon vinden en de informatie die ze teruggeven. Als je anderen kent, voeg dan een opmerking toe en ik zal dit antwoord bijwerken.


Abstract

let apiKey = '1be9a6884abd4c3ea143b59ca317c6b2';
$.getJSON('https://ipgeolocation.abstractapi.com/v1/?api_key=' + apiKey, function(data) {
  console.log(JSON.stringify(data, null, 2));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>

Antwoord 2, autoriteit 30%

UPDATE 2021:

Zoals onlangs blijkt uit een nieuwe Github-repository, webrtc-ip, kun je nu een het openbareIP-adres van de gebruiker met behulp van WebRTC. Helaas werkt dit lek niet voor privé-IP’s, vanwege de geleidelijke verschuiving naar mDNS (tenminste voor WebRTC), volledig uitgelegd hier. Hier is echter een werkende demo:

getIPs().then(res => document.write(res.join('\n')))
<script src="https://cdn.jsdelivr.net/gh/joeymalvinni/webrtc-ip/dist/bundle.dev.js"></script>

Antwoord 3, autoriteit 18%

Dat kan, door het via de server door te sturen met JSONP

En terwijl ik googelde om er een te vinden, vond ik het hier op SO Kan ik een DNS-lookup (hostnaam naar IP-adres) uitvoeren met Javascript aan de clientzijde?

<script type="application/javascript">
    function getip(json){
      alert(json.ip); // alerts the ip address
    }
</script>
<script type="application/javascript" src="https://www.telize.com/jsonip?callback=getip"></script>

Opmerking:De telize.com API heeft permanent stopgezet vanaf 15 november 2015.


Antwoord 4, autoriteit 9%

Dat kan niet. Je zou het aan een server moeten vragen.


Antwoord 5, autoriteit 8%

Zoek niet verder

Bekijk http://www.ipify.org/

Volgens hen:

  • Je kunt het onbeperktgebruiken (zelfs als je miljoenen verzoeken per minuut doet).
  • ipify is volledig open source (bekijk de GitHub-repository).

Hier is een werkend JS-voorbeeld (in plaats van je af te vragen waarom dit antwoord zo weinig stemmen heeft, probeer het zelf om het in actie te zien):

<script>
function getIP(json) {
  alert("My public IP address is: " + json.ip);
}
</script>
<script src="https://api.ipify.org?format=jsonp&callback=getIP"></script>

Te lui om te kopiëren/plakken? Ik vind het leuk. Hier is een 💻-demo

Te lui om te klikken? :O

Opmerking : Schakel Adblock Plus / Ublock & AMP uit; CO Voordat u de demo uitvoert. Anders zal het gewoon niet werken.

Ik heb niets om te doen met het iPify-team. Ik denk gewoon dat het belachelijk koel is dat iemand zo’n service voor het algemeen goed zou bieden.


6, Autoriteit 8%

U kunt een AJAX-oproep doen naar hostip.info of een vergelijkbare service …

function myIP() {
    if (window.XMLHttpRequest) xmlhttp = new XMLHttpRequest();
    else xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    xmlhttp.open("GET","http://api.hostip.info/get_html.php",false);
    xmlhttp.send();
    hostipInfo = xmlhttp.responseText.split("\n");
    for (i=0; hostipInfo.length >= i; i++) {
        ipAddress = hostipInfo[i].split(":");
        if ( ipAddress[0] == "IP" ) return ipAddress[1];
    }
    return false;
}

Als bonus wordt geolocalisatiegegevens in dezelfde oproep geretourneerd.


7, Autoriteit 8%

Probeer deze

$.get("http://ipinfo.io", function(response) {
    alert(response.ip);
}, "jsonp");

of

$(document).ready(function () {
    $.getJSON("http://jsonip.com/?callback=?", function (data) {
        console.log(data);
        alert(data.ip);
    });
});

Fiddle


8, Autoriteit 3%

U kunt mijn service http://ipinfo.io voor dit geven, die u de client IP, hostnaam geeft , Geolocatie-informatie en netwerkeigenaar. Hier is een eenvoudig voorbeeld dat het IP logt:

$.get("http://ipinfo.io", function(response) {
    console.log(response.ip);
}, "jsonp");

Hier is een meer gedetailleerd JSFiddle-voorbeeld dat ook de volledige responseinformatie afdrukt, zodat u alle beschikbare details kunt zien: http://jsfiddle.net/zk5fn/2/


9, Autoriteit 2%

Voeg deze code toe in uw pagina: <script type="text/javascript" src="https://l2.io/ip.js"></script>

DOC hier


10, Autoriteit 2%

Ik zou zeggen dat Chad en Malta geweldig antwoord heeft. De hen zijn echter gecompliceerd. Dus ik stel deze code voor die ik heb gevonden van advertenties per land plug-in

<script>
<script language="javascript" src="https://j.maxmind.com/app/geoip.js"></script>
<script language="javascript">
mmjsCountryCode = geoip_country_code();
mmjsCountryName = geoip_country_name();
</script>

No Ajax. Gewoon duidelijke javascripts. : D

Als u naar http://j.maxmind.com/App/gehoip.js U zult zien dat het

bevat

function geoip_country_code() { return 'ID'; }
function geoip_country_name() { return 'Indonesia'; }
function geoip_city()         { return 'Jakarta'; }
function geoip_region()       { return '04'; }
function geoip_region_name()  { return 'Jakarta Raya'; }
function geoip_latitude()     { return '-6.1744'; }
function geoip_longitude()    { return '106.8294'; }
function geoip_postal_code()  { return ''; }
function geoip_area_code()    { return ''; }
function geoip_metro_code()   { return ''; }

Het beantwoordt de vraag nog niet echt omdat

http://j.maxmind.com/app/geoip.jsniet het IP-adres niet bevatten (hoewel ik wed dat het het IP-adres gebruikt om het land te achterhalen).

Maar het is zo gemakkelijk om een PHP-script te maken dat zoiets laat zien als

function visitorsIP()   { return '123.123.123.123'; }

Maak dat. Zet op http://uwdomein.com/uwip.php.

Doe dan

<script language="javascript" src="https://yourdomain.com/yourip.php"></script>

De vraag vermeldt specifiek om GEEN script van derden te gebruiken. Er is geen andere weg. Javascript kan uw IP niet kennen. Maar andere servers die toegankelijk zijn via javascript, kunnen net zo goed werken zonder problemen.


Antwoord 11, autoriteit 2%

Er zijn twee interpretaties van deze vraag. De meeste mensen interpreteerden “Client IP” als het openbare IP-adres dat de webserver buiten het LAN en op internet ziet. Dit is echter in de meeste gevallen niet het IP-adres van de clientcomputer

Ik had het echte IP-adres nodig van de computer waarop de browser draait waarop mijn JavaScript-software wordt gehost (dit is bijna altijd een lokaal IP-adres op een LAN dat zich achter iets die NAT-laag bevindt).

Mido heeft hierboven een FANTASTISCH antwoord gepost, dat het enige antwoord lijkt te zijn dat echt het IP-adres van de klant heeft verstrekt.

Bedankt daarvoor, Mido!

De gepresenteerde functie wordt echter asynchroon uitgevoerd. Ik moet het IP-adres in mijn code daadwerkelijk GEBRUIKEN en met een asynchrone oplossing kan ik proberen het IP-adres te gebruiken voordat het wordt opgehaald/geleerd/opgeslagen. Ik moest kunnen wachten op de resultaten voordat ik ze kon gebruiken.

Hier is een “Waitable”-versie van de functie van Mido. Ik hoop dat het iemand anders helpt:

function findIP(onNewIP) { //  onNewIp - your listener function for new IPs
    var promise = new Promise(function (resolve, reject) {
        try {
            var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; //compatibility for firefox and chrome
            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 ipIterate(ip) {
                if (!localIPs[ip]) onNewIP(ip);
                localIPs[ip] = true;
            }
            pc.createDataChannel(""); //create a bogus data channel
            pc.createOffer(function (sdp) {
                sdp.sdp.split('\n').forEach(function (line) {
                    if (line.indexOf('candidate') < 0) return;
                    line.match(ipRegex).forEach(ipIterate);
                });
                pc.setLocalDescription(sdp, noop, noop);
            }, noop); // create offer and set local description
            pc.onicecandidate = function (ice) { //listen for candidate events
                if (ice && ice.candidate && ice.candidate.candidate && ice.candidate.candidate.match(ipRegex)) {
                    ice.candidate.candidate.match(ipRegex).forEach(ipIterate);
                }
                resolve("FindIPsDone");
                return;
            };
        }
        catch (ex) {
            reject(Error(ex));
        }
    });// New Promise(...{ ... });
    return promise;
};
//This is the callback that gets run for each IP address found
function foundNewIP(ip) {
    if (typeof window.ipAddress === 'undefined')
    {
        window.ipAddress = ip;
    }
    else
    {
        window.ipAddress += " - " + ip;
    }
}
//This is How to use the Waitable findIP function, and react to the
//results arriving
var ipWaitObject = findIP(foundNewIP);        // Puts found IP(s) in window.ipAddress
ipWaitObject.then(
    function (result) {
        alert ("IP(s) Found.  Result: '" + result + "'. You can use them now: " + window.ipAddress)
    },
    function (err) {
        alert ("IP(s) NOT Found.  FAILED!  " + err)
    }
);
   
<h1>Demo "Waitable" Client IP Retrieval using WebRTC </h1>

Antwoord 12

Nou, ik dwaal af van de vraag, maar ik had vandaag een soortgelijke behoefte en hoewel ik de ID van de client niet kon vinden met Javascript, deed ik het volgende.

Aan de serverkant: –

<div style="display:none;visibility:hidden" id="uip"><%= Request.UserHostAddress %></div>

Javascript gebruiken

var ip = $get("uip").innerHTML;

Ik gebruik ASP.NET AJAX, maar u kunt GetelementByID gebruiken in plaats van $ GET ().

Wat gebeurt er is, ik heb een verborgen div-element op de pagina met het IP van de gebruiker van de server. Dan in JavaScript laad ik die waarde gewoon.

Dit kan nuttig zijn voor sommige mensen met een vergelijkbare vereiste zoals de jouwe (zoals ik terwijl ik dit niet had gevonden).

Cheers!


13

Er is een eenvoudiger en vrije aanpak die uw bezoeker niet zal vragen voor elke toestemming.

Het bestaat in het indienen van een zeer eenvoudige AJAX-postverzoek aan http://freeGeoip.net/json . Nadat u uw locatiegegevens hebt ontvangen, reageert u in JSON bij het bijwerken van de pagina of het omleiden naar een nieuwe.

Hier is hoe u uw verzoek indienen voor locatie-informatie:

jQuery.ajax( { 
  url: '//freegeoip.net/json/', 
  type: 'POST', 
  dataType: 'jsonp',
  success: function(location) {
     console.log(location)
  }
} );

14

Niet mogelijk in het algemeen, tenzij u een soort externe service gebruikt.


15

met het gebruik van smart-ip.net geo-ip api . Bijvoorbeeld door jQuery te gebruiken:

$(document).ready( function() {
    $.getJSON( "http://smart-ip.net/geoip-json?callback=?",
        function(data){
            alert( data.host);
        }
    );
});

16

U kunt de userinfo.io javascript-bibliotheek gebruiken.

<script type="text/javascript" src="userinfo.0.0.1.min.js"></script>
UserInfo.getInfo(function(data) {
  alert(data.ip_address);
}, function(err) {
  // Do something with the error
});

U kunt ook vereisten gebruiken om het script te laden.

Het geeft u het IP-adres van uw bezoeker, evenals een paar gegevens op de locatie (land, stad, enz.). Het is gebaseerd op MAXMIND GEOIP-database.

DISCLAIMER: Ik heb deze bibliotheek


17

Ik hou echt van api.ipify.orgomdat het zowel HTTP als ondersteunt Https.

Hier zijn enkele voorbeelden van het ontvangen van het IP met api.ipify.orgmet jQuery.

JSON-indeling via HTTPS

https://api.ipify.org?format=json

$.getJSON("https://api.ipify.org/?format=json", function(e) {
    alert(e.ip);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

18

Verkrijg je IP met jQuery

U kunt uw openbare IP-adres ontvangen met één regel JS? Er is een gratis service die dit voor u biedt en een ontvangen verzoek is alles wat u moet doen:

  $.get('http://jsonip.com/', function(r){ console.log(r.ip); });

Voor het bovenstaande fragment naar het werk, zal uw browser CORS (Cross-Origin-aanvraagverdeling moeten ondersteunen). Anders
een beveiligingspantie zou worden gegooid. In oudere browsers kunt u deze versie gebruiken, die een JSON-P-aanvraag gebruikt:

  $.getJSON('http://jsonip.com/?callback=?', function(r){ console.log(r.ip); });

Antwoord 19

Gebruik ipdata.co.

De API biedt ook geolocatiegegevens en heeft 10 wereldwijde eindpunten die elk >800 miljoen verzoeken per dag kunnen verwerken!

Dit antwoord gebruikt een ‘test’-API-sleutel die zeer beperkt is en alleen bedoeld is voor het testen van een paar aanroepen. Meld u aanvoor uw eigen Gratis API-sleutel en ontvang dagelijks tot 1500 aanvragen voor ontwikkeling.

$.get("https://api.ipdata.co?api-key=test", function (response) {
    $("#response").html(response.ip);
}, "jsonp");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<pre id="response"></pre>

Antwoord 20

Javascript / jQuery krijgt het IP-adres van de klant & Locatie(Land, Stad)

U hoeft alleen een tag met “src”-link naar de server in te sluiten. De server retourneert “codehelper_ip” als een Object / JSON, en je kunt het meteen gebruiken.

// First, embed this script in your head or at bottom of the page.
<script language="Javascript" src="https://www.codehelper.io/api/ips/?js"></script>
// You can use it
<script language="Javascript">
    alert(codehelper_ip.IP);
    alert(codehelper_ip.Country);
</script>

Meer informatie op Javascript Detect Real IP Address Plus Country

Als je jQuery gebruikt, kun je het volgende proberen:

console.log(codehelper_ip); 

Het toont u meer informatie over het geretourneerde object.

Als je een terugbelfunctie wilt, probeer dan dit:

// First, embed this script in your head or at bottom of the page.
<script language="Javascript" src="https://www.codehelper.io/api/ips/?callback=yourcallback"></script>
// You can use it
<script language="Javascript">
    function yourcallback(json) {
       alert(json.IP);
     }
</script>

Antwoord 21

De terugbelservice van Appspot.com is niet beschikbaar. ipinfo.io lijkt te werken.

Ik heb een extra stap gedaan en alle geografische informatie opgehaald met AngularJS. (Met dank aan Ricardo) Check it out.

<div ng-controller="geoCtrl">
  <p ng-bind="ip"></p>
  <p ng-bind="hostname"></p>
  <p ng-bind="loc"></p>
  <p ng-bind="org"></p>
  <p ng-bind="city"></p>
  <p ng-bind="region"></p>
  <p ng-bind="country"></p>
  <p ng-bind="phone"></p>
</div>
<script src="https://code.jquery.com/jquery-1.10.2.min.js"></script>
<script src="https://code.angularjs.org/1.2.12/angular.min.js"></script>
<script src="https://code.angularjs.org/1.2.12/angular-route.min.js"></script>
<script>
'use strict';
var geo = angular.module('geo', [])
.controller('geoCtrl', ['$scope', '$http', function($scope, $http) {
  $http.jsonp('http://ipinfo.io/?callback=JSON_CALLBACK')
    .success(function(data) {
    $scope.ip = data.ip;
    $scope.hostname = data.hostname;
    $scope.loc = data.loc; //Latitude and Longitude
    $scope.org = data.org; //organization
    $scope.city = data.city;
    $scope.region = data.region; //state
    $scope.country = data.country;
    $scope.phone = data.phone; //city area code
  });
}]);
</script>

Werkpagina hier: http://www.orangecountyseomarketing.com/projects/_ip_angularjs.html


Antwoord 22

Als u toch een bestand opneemt, kunt u een eenvoudige ajax get doen:

function ip_callback() {
    $.get("ajax.getIp.php",function(data){ return data; }
}

En ajax.getIp.phpzou dit zijn:

<?=$_SERVER['REMOTE_ADDR']?>

Antwoord 23

Probeer dit: http://httpbin.org/ip(of https://httpbin.org/ip)

Voorbeeld met https:

$.getJSON('https://httpbin.org/ip', function(data) {
                console.log(data['origin']);
});

Bron: http://httpbin.org/


Antwoord 24

Er is niet echt een betrouwbare manier om het IP-adres van de clientcomputer te krijgen.

Dit gaat door enkele van de mogelijkheden. De code die Java gebruikt, zal breken als de gebruiker meerdere interfaces heeft.

http://nanoagent.blogspot.com/ 2006/09/hoe-te-vinden-evalueren-remoteaddrclients.html

Als je de andere antwoorden hier bekijkt, klinkt het alsof je het openbare IP-adres van de klant wilt hebben, wat waarschijnlijk het adres is van de router die ze gebruiken om verbinding te maken met internet. Veel van de andere antwoorden hier praten daarover. Ik raad je aan om je eigen serverpagina te maken en te hosten om het verzoek te ontvangen en te reageren met het IP-adres in plaats van afhankelijk te zijn van de service van iemand anders die al dan niet blijft werken.


Antwoord 25

Ik ga een methode aanbieden die ik veel gebruik als ik informatie op de html-pagina wil opslaan en wil dat mijn javascript informatie leest zonder dat ik parameters aan het javascript hoef door te geven. Dit is vooral handig als er extern naar uw script wordt verwezen in plaats van inline.

Het voldoet echter niet aan het criterium van “geen server-side script”. Maar als u server-side scripting in uw html kunt opnemen, doe dit dan:

Maak verborgen labelelementen onderaan je html-pagina, net boven de body-tag aan het einde.

Uw label ziet er als volgt uit:

<label id="ip" class="hiddenlabel"><?php echo $_SERVER['REMOTE_ADDR']; ?></label>

Zorg ervoor dat u een klasse maakt met de naam hiddenlabelen stel de visibility:hiddenzo in dat niemand het label daadwerkelijk ziet. Op deze manier kun je veel dingen opslaan, in verborgen labels.

Om nu in uw javascript de informatie op te halen die in het label is opgeslagen (in dit geval het ip-adres van de klant), kunt u dit doen:

var ip = document.getElementById("ip").innerHTML;

Nu is uw variabele “ip” gelijk aan het ip-adres. Nu kunt u het ip doorgeven aan uw API-verzoek.

* BEWERK 2 JAAR LATER *
Twee kleine verfijningen:

Ik gebruik deze methode routinematig, maar noem het label class="data", omdat het in feite een manier is om gegevens op te slaan. De klassenaam “hiddenlabel” is een beetje een domme naam.

De tweede wijziging bevindt zich in de stylesheet, in plaats van visibility:hidden:

.data{
    display:none;
}

…is de beste manier om het te doen.


Antwoord 26

Verkrijg lokaal systeem-IP:

 try {
var RTCPeerConnection = window.webkitRTCPeerConnection || window.mozRTCPeerConnection;
if (RTCPeerConnection) (function () {
    var rtc = new RTCPeerConnection({ iceServers: [] });
    if (1 || window.mozRTCPeerConnection) {
        rtc.createDataChannel('', { reliable: false });
    };
    rtc.onicecandidate = function (evt) {
        if (evt.candidate) grepSDP("a=" + evt.candidate.candidate);
    };
    rtc.createOffer(function (offerDesc) {
        grepSDP(offerDesc.sdp);
        rtc.setLocalDescription(offerDesc);
    }, function (e) { console.warn("offer failed", e); });
    var addrs = Object.create(null);
    addrs["0.0.0.0"] = false;
    function updateDisplay(newAddr) {
        if (newAddr in addrs) return;
        else addrs[newAddr] = true;
        var displayAddrs = Object.keys(addrs).filter(function (k) { return addrs[k]; });
        LgIpDynAdd = displayAddrs.join(" or perhaps ") || "n/a";
        alert(LgIpDynAdd)
    }
    function grepSDP(sdp) {
        var hosts = [];
        sdp.split('\r\n').forEach(function (line) {
            if (~line.indexOf("a=candidate")) {
                var parts = line.split(' '),
                    addr = parts[4],
                    type = parts[7];
                if (type === 'host') updateDisplay(addr);
            } else if (~line.indexOf("c=")) {
                var parts = line.split(' '),
                    addr = parts[2];
                alert(addr);
            }
        });
    }
})();} catch (ex) { }

Antwoord 27

   $.getJSON("http://jsonip.com?callback=?", function (data) {
        alert("Your ip address: " + data.ip);
    });

Antwoord 28

Allereerst het feitelijke antwoord: Het is niet mogelijk om puur door de client uitgevoerde code te gebruiken om uw eigen IP-adres te achterhalen.

U kunt echter gewoon een GET doen naar https://api.muctool.de/whoisen iets ontvangen zoals het verkrijgen van het IP-adres van een klant

{
"ip": "88.217.152.15",
"city": "Munich",
"isp": "M-net Telekommunikations GmbH",
"country": "Germany",
"countryIso": "DE",
"postalCode": "80469",
"subdivisionIso": "BY",
"timeZone": "Europe/Berlin",
"cityGeonameId": 2867714,
"countryGeonameId": 2921044,
"subdivisionGeonameId": 2951839,
"ispId": 8767,
"latitude": 48.1299,
"longitude": 11.5732,
"fingerprint": "61c5880ee234d66bded68be14c0f44236f024cc12efb6db56e4031795f5dc4c4",
"session": "69c2c032a88fcd5e9d02d0dd6a5080e27d5aafc374a06e51a86fec101508dfd3",
"fraud": 0.024,
"tor": false
}

29

U kunt deze volledig klantzijde en meestal in JavaScript doen met behulp van een Flash-object dat de JS kan bellen. Flash CAN Toegang tot het IP-adres van de lokale machine die mogelijk niet erg handig is.

Other episodes