如何使用JavaScript获取客户端的IP地址?

我需要以某种方式使用纯JavaScript来提取客户端的IP地址; 没有服务器端的代码,甚至没有SSI。

我并不反对使用免费的第三方脚本。

我会使用可以返回JSON的Web服务(与jQuery一起使事情变得更简单)。 以下是我可以find的所有免费的主动 IP查找服务以及他们返回的信息。 如果你知道更多,然后请添加评论,我会更新这个答案。


DB-IP

试试看: api.db-ip.com/addrinfo?api_key= < 你的api key >&addr = < ip地址 >

返回:

{ "address": "116.12.250.1", "country": "SG", "stateprov": "Central Singapore", "city": "Singapore" } 

限制:

  • 每小时2,500个请求
  • 不支持JSONPcallback
  • 需要IP地址参数
  • 需要电子邮件地址来获取您的API密钥
  • 没有SSL(https)免费计划

freegeoip.net

试试看: freegeoip.net/json/

 $.getJSON('//freegeoip.net/json/?callback=?', function(data) { console.log(JSON.stringify(data, null, 2)); }); 

返回:

 { "ip": "116.12.250.1", "country_code": "SG", "country_name": "Singapore", "region_code": "01", "region_name": "Central Singapore Community Development Council", "city": "Singapore", "zip_code": "", "time_zone": "Asia/Singapore", "latitude": 1.2931, "longitude": 103.8558, "metro_code": 0 } 

限制:

  • 每小时10,000个请求

Geobytes

试试看: gd.geobytes.com/GetCityDetails

 $.getJSON('http://gd.geobytes.com/GetCityDetails?callback=?', function(data) { console.log(JSON.stringify(data, null, 2)); }); 

返回:

 { "geobytesforwarderfor": "", "geobytesremoteip": "116.12.250.1", "geobytesipaddress": "116.12.250.1", "geobytescertainty": "99", "geobytesinternet": "SA", "geobytescountry": "Saudi Arabia", "geobytesregionlocationcode": "SASH", "geobytesregion": "Ash Sharqiyah", "geobytescode": "SH", "geobyteslocationcode": "SASHJUBA", "geobytescity": "Jubail", "geobytescityid": "13793", "geobytesfqcn": "Jubail, SH, Saudi Arabia", "geobyteslatitude": "27.004999", "geobyteslongitude": "49.660999", "geobytescapital": "Riyadh ", "geobytestimezone": "+03:00", "geobytesnationalitysingular": "Saudi Arabian ", "geobytespopulation": "22757092", "geobytesnationalityplural": "Saudis", "geobytesmapreference": "Middle East ", "geobytescurrency": "Saudi Riyal", "geobytescurrencycode": "SAR", "geobytestitle": "Saudi Arabia" } 

限制:

  • 每小时16384个请求
  • 可以返回错误的地点(我在新加坡,而不是沙特阿拉伯)
  • 没有SSL(https)免费计划

geoPlugin

尝试一下: http://www.geoplugin.net/json.gp

 $.getJSON('http://www.geoplugin.net/json.gp?jsoncallback=?', function(data) { console.log(JSON.stringify(data, null, 2)); }); 

返回:

 { "geoplugin_request": "116.12.250.1", "geoplugin_status": 200, "geoplugin_credit": "Some of the returned data includes GeoLite data created by MaxMind, available from <a href=\\'http://www.maxmind.com\\'>http://www.maxmind.com</a>.", "geoplugin_city": "Singapore", "geoplugin_region": "Singapore (general)", "geoplugin_areaCode": "0", "geoplugin_dmaCode": "0", "geoplugin_countryCode": "SG", "geoplugin_countryName": "Singapore", "geoplugin_continentCode": "AS", "geoplugin_latitude": "1.2931", "geoplugin_longitude": "103.855797", "geoplugin_regionCode": "00", "geoplugin_regionName": "Singapore (general)", "geoplugin_currencyCode": "SGD", "geoplugin_currencySymbol": "&#36;", "geoplugin_currencySymbol_UTF8": "$", "geoplugin_currencyConverter": 1.4239 } 

限制:

  • 每分钟120个请求
  • 没有SSL(https)免费计划

黑客目标

试试看: api.hackertarget.com/geoip/?q= < ip address >

返回:

 IP Address: 116.12.250.1 Country: SG State: N/A City: Singapore Latitude: 1.293100 Longitude: 103.855797 

限制:

  • 每天50个请求
  • 不支持JSONPcallback
  • 需要IP地址参数
  • 返回纯文本

ipapi.co

试试看: ipapi.co/json/

 $.getJSON('//ipapi.co/json/', function(data) { console.log(JSON.stringify(data, null, 2)); }); 

返回:

 { "ip": "116.12.250.1", "city": "Singapore", "region": "Central Singapore Community Development Council", "country": "SG", "country_name": "Singapore", "postal": null, "latitude": 1.2855, "longitude": 103.8565, "timezone": "Asia/Singapore" } 

限制:

  • 每天有1,000个请求

IP-API.com

试试看: ip-api.com/json

 $.getJSON('http://ip-api.com/json?callback=?', function(data) { console.log(JSON.stringify(data, null, 2)); }); 

返回:

 { "as": "AS3758 SingNet", "city": "Singapore", "country": "Singapore", "countryCode": "SG", "isp": "SingNet Pte Ltd", "lat": 1.2931, "lon": 103.8558, "org": "Singapore Telecommunications", "query": "116.12.250.1", "region": "01", "regionName": "Central Singapore Community Development Council", "status": "success", "timezone": "Asia/Singapore", "zip": "" } 

限制:

  • 每分钟150个请求
  • 没有SSL(https)免费计划

IP查找

试试看: ipfind.co/me?auth= < 你的api密钥 >

 $.getJSON('//ipfind.co/me?auth=<your_api_key>', function(data) { console.log(JSON.stringify(data, null, 2)); }); 

返回:

 { "ip_address": "116.12.250.1", "country": "Singapore", "country_code": "SG", "continent": "Asia", "continent_code": "AS", "city": "Singapore", "county": null, "region": "Central Singapore", "region_code": "01", "timezone": "Asia/Singapore", "owner": null, "longitude": 103.8565, "latitude": 1.2855, "currency": "SGD", "languages": [ "cmn", "en-SG", "ms-SG", "ta-SG", "zh-SG" ] } 

限制:

  • 每天300个请求
  • 需要注册才能获取您的API密钥

ipify

试试看: api.ipify.org/?format=json

 $.getJSON('//api.ipify.org?format=jsonp&callback=?', function(data) { console.log(JSON.stringify(data, null, 2)); }); 

返回:

 { "ip": "116.12.250.1" } 

限制:

  • 无(无限带宽)

IPInfoDB

试试看: api.ipinfodb.com/v3/ip-city/? key = < 你的api key >&format = json

 $.getJSON('//api.ipinfodb.com/v3/ip-city/?key=<your_api_key>&format=json&callback=?', function(data) { console.log(JSON.stringify(data, null, 2)); }); 

返回:

 { "statusCode": "OK", "statusMessage": "", "ipAddress": "116.12.250.1", "countryCode": "SG", "countryName": "Singapore", "regionName": "Singapore", "cityName": "Singapore", "zipCode": "048941", "latitude": "1.28967", "longitude": "103.85", "timeZone": "+08:00" } 

限制:

  • 每秒两个请求
  • 需要注册才能获取您的API密钥

ipinfo.io

试试看: ipinfo.io/json

 $.getJSON('//ipinfo.io/json', function(data) { console.log(JSON.stringify(data, null, 2)); }); 

返回:

 { "ip": "116.12.250.1", "hostname": "No Hostname", "city": "Singapore", "region": "Central Singapore Community Development Council", "country": "SG", "loc": "1.2931,103.8558", "org": "AS3758 SingNet" } 

限制:

  • 每天有1,000个请求

jsonip.com

试试看: jsonip.com/

 $.getJSON('//jsonip.com/?callback=?', function(data) { console.log(JSON.stringify(data, null, 2)); }); 

返回:

 { "ip": "116.12.250.1", "about": "/about", "Pro!": "http://getjsonip.com" } 

限制:

  • 无(无限带宽)

JSONtesting

试试看: ip.jsontest.com/

 $.getJSON('http://ip.jsontest.com/?callback=?', function(data) { console.log(JSON.stringify(data, null, 2)); }); 

返回:

 { "ip": "116.12.250.1" } 

限制:

  • 下降了很多(超过配额),所以我不会用它来生产
  • 返回IPv6地址(如果有),这可能不是您想要的
  • 没有SSL(https)

Nekudo

试试看: geoip.nekudo.com/api/ < ip地址 >

 $.getJSON('//geoip.nekudo.com/api/<ip_address>', function(data) { console.log(JSON.stringify(data, null, 2)); }); 

返回:

 { "city": "Singapore", "country": { "name": "Singapore", "code": "SG" }, "location": { "accuracy_radius": 50, "latitude": 1.2855, "longitude": 103.8565, "time_zone": "Asia/Singapore" }, "ip": "116.12.250.1" } 

限制:

  • 需要IP地址参数

愚蠢的Web工具

尝试一下: http://www.stupidwebtools.com/api/my_ip.json

 $.getJSON('//www.stupidwebtools.com/api/my_ip.json', function(data) { console.log(JSON.stringify(data, null, 2)); }); 

返回:

 { "my_ip": { "ip": "116.12.250.1", "others": [] } } 

限制:

  • 没有SSL(https)

请记住,由于这些都是免费服务,因此您的里程可能会因配额和正常运行时间的不同而有所不同,并且谁知道何时/是否将在路上脱机(展品A: Telize )。 大多数这些服务还提供了一个付费层,以防您想要更强大的function。

另外,正如skobaljic在下面的评论中指出的那样,请求配额主要是学术的,因为这是发生在客户端,大多数最终用户将永远不会超过配额。

更新

  • 2/1/2016:删除Telize (不再提供免费计划)
  • 4/18/2016:删除freegeoip.net (停止服务)
  • 4/26/2016:添加DB-IP
  • 4/26/2016:增加黑客目标
  • 7/6/2016:恢复freegeoip.net
  • 7/6/2016:删除ip-json.rhcloud.com (死链接)
  • 12/21/2016:删除黑客目标 (停止服务)
  • 2/10/2017 :增加了Nekudo
  • 4/20/2017:添加ipapi.co (感谢艾哈迈德Awais)
  • 4/24/2017:恢复黑客目标
  • 4/24/2017:删除Snoopi.io (停止服务)
  • 2017/7/16:添加IP查找 (感谢JordanC)
  • 2017年7月16日:更新了不支持SSL的免费计划的限制
  • 9/25/2017:增加了愚蠢的Web工具 (谢谢Cœur)

你可以通过服务器端使用JSONP来中继它

而谷歌searchfind一个,在这里find它可以使用客户端JavaScript执行DNS查找(主机名到IP地址)?

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

注意:截至2015年11月15日, telize.com API已永久closures 。

更新 :我一直想做一个min / ugl的版本的代码,所以这里是一个ES6的承诺代码:

 var findIP = new Promise(r=>{var w=window,a=new (w.RTCPeerConnection||w.mozRTCPeerConnection||w.webkitRTCPeerConnection)({iceServers:[]}),b=()=>{};a.createDataChannel("");a.createOffer(c=>a.setLocalDescription(c,b,b),b);a.onicecandidate=c=>{try{c.candidate.candidate.match(/([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g).forEach(r)}catch(e){}}}) /*Usage example*/ findIP.then(ip => document.write('your ip: ', ip)).catch(e => console.error(e)) 

大多数的答案在这里“解决”服务器端代码的需求,通过…击中别人的服务器。 这是一个完全有效的技术,除非你确实需要获得IP地址而不需要访问服务器。

传统上,这是不可能的,没有某种插件(即使如此,如果你在NAT路由器后面,你可能会得到错误的 IP地址),但随着WebRTC的出现,它实际上可以做到这一点。 如果你的浏览器支持WebRTC (目前是Firefox,Chrome和Opera)。

有关如何使用WebRTC检索有用的客户端IP地址的详细信息, 请阅读mido的答案

你可以做一个ajax调用hostip.info或类似的服务…

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

作为奖励,地理定位信息在同一个电话中返回。

你不能。 你不得不问一个服务器。

再看一眼

看看http://www.ipify.org/

根据他们:

  • 您可以毫无限制地使用它(即使您每分钟处理数百万个请求)。
  • ipify是完全开源的(查看GitHub仓库 )。

下面是一个有效的JS例子(而不是想知道为什么这个答案只有很less的选票,请亲自尝试一下,看看它的实际情况):

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

懒得复制/粘贴? 我喜欢。 这是一个演示

太懒了点击? :O

注意在运行演示之前closuresAdblock Plus / uBlock&co,否则它将不起作用。

我和IPify团队没有任何关系。 我只是觉得有人会为了一般的好处而提供这样的服务真是太酷了。

您可以使用我的服务http://ipinfo.io ,这将为您提供客户端IP,主机名,地理位置信息和networking所有者。 这是一个简单的例子,loggingIP:

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

下面是一个更详细的JSFiddle示例,它还打印出完整的响应信息,以便您查看所有可用的详细信息: http : //jsfiddle.net/zK5FN/2/

在您的页面中包含以下代码: <script type="text/javascript" src="http://l2.io/ip.js"></script>

更多文档在这里: http : //l2.io

我会说乍得和马耳他有很好的答案。 但是,他们是复杂的。 所以我build议我从国家插件的广告中find这个代码

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

没有阿贾克斯。 只是简单的JavaScript。 :d

如果你去http://j.maxmind.com/app/geoip.js你会看到它包&#x542B;

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

它并没有真正回答这个问题,因为

http://j.maxmind.com/app/geoip.js不包含知识产权(尽pipe我敢打赌它使用知识产权得到国家)&#x3002;

但是制作一个类似Pop的PhP脚本非常容易

 function visitorsIP() { return '123.123.123.123'; } 

做那个。 穿上http://yourdomain.com/yourip.php

然后呢

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

这个问题特别提到不使用第三方脚本。 没有别的办法。 Javascript不能知道你的IP。 但是可以通过JavaScript访问的其他服务器可以正常工作,没有问题。

使用Smart-IP.net Geo-IP API 。 例如,通过使用jQuery:

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

那么,我从这个问题离题了,但我今天有类似的需求,虽然我不能使用JavaScript从客户端findID,我做了以下。

在服务器端:

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

使用Javascript

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

我正在使用ASP.Net Ajax,但您可以使用getElementById而不是$ get()。

发生什么事情是,我在页面上有一个隐藏的div元素,用户的IP从服务器渲染。 比在JavaScript中,我只是加载该值。

这可能会对像你一样有类似需求的人有帮助(像我一样,但是我没有弄清楚)。

干杯!

有一个更简单和免费的方法,不会问你的访问者的任何许可。

它包括向http://freegeoip.net/json提交一个非常简单的Ajax POST请求。 一旦你收到你的位置信息,在JSON,你作出相应的反应,通过更新页面或redirect到一个新的。

以下是您如何提交位置信息的请求:

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

对这个问题有两种解释。 大多数人将“客户端IP”解释为Web服务器在局域网之外和互联网上看到的公共IP地址。 不过,在大多数情况下,这不是客户端计算机的IP地址

我需要运行托pipe我的JavaScript软件的浏览器的计算机的真实IP地址(它几乎总是局域网上的本地IP地址,是NAT层的后面)。

Mido在上面贴出了一个FANTASTIC的答案,似乎是真正提供客户IP地址的唯一答案。

谢谢你,米多!

但是,呈现的function是asynchronous运行的。 我需要在我的代码中实际使用IP地址,而在asynchronous解决scheme中,我可能会尝试在检索/学习/存储之前使用IP地址。 在使用之前,我必须能够等待结果。

这是Midofunction的“Waitable”版本。 我希望它可以帮助别人:

 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> 

一般情况下不可能,除非你使用某种外部服务。

获取客户端计算机的IP地址并不是一个可靠的方法。

这经历了一些可能性。 如果用户有多个接口,则使用Java的代码将会中断。

http://nanoagent.blogspot.com/2006/09/how-to-find-evaluate-remoteaddrclients.html

从这里查看其他答案,听起来像你可能想要获取客户端的公共IP地址,这可能是他们用来连接到互联网的路由器的地址。 这里有很多其他的答案都是这样说的。 我会build议创build和托pipe自己的服务器端页面接收请求和响应与IP地址,而不是依赖于别人的服务,可能会或可能不会继续工作。

Javascript / jQuery获取客户端的IP地址和位置 (国家,城市)

您只需要将带有“src”链接的标签embedded到服务器中即可。 服务器将返回“codehelper_ip”作为一个对象/ JSON,你可以马上使用它。

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

更多信息在Javascript检测真正的IP地址加国家

如果你正在使用jQuery,你可以尝试:

 console.log(codehelper_ip); 

它会显示更多关于返回对象的信息。

如果你想要callback函数,请试试这个:

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

Appspot.comcallback的服务不可用。 ipinfo.io似乎工作。

我做了一个额外的步骤,并使用AngularJS检索所有地理信息。 (感谢里卡多)检查出来。

 <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="http://code.jquery.com/jquery-1.10.2.min.js"></script> <script src="http://code.angularjs.org/1.2.12/angular.min.js"></script> <script src="http://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> 

工作页面: http : //www.orangecountyseomarketing.com/projects/_ip_angularjs.html

您可以使用userinfo.io JavaScript库。

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

您也可以使用requirejs来加载脚本。

它会给你你的访问者的IP地址,以及它的位置(国家,城市等)的一些数据。 它基于maxmind geoip数据库。

免责声明:我写了这个库

我要提供一个方法,当我想要将信息存储在html页面时,我需要使用很多方法,并且希望我的javascript读取信息,而不必将parameter passing给javascript。 当你的脚本被外部引用而不是内联引用时,这是特别有用的。

但是,它不符合“无服务器端脚本”的标准。 但是,如果你可以在你的html中包含服务器端脚本,请执行以下操作:

将隐藏的标签元素放在您的html页面的底部,就在end body标签的上方。

你的标签看起来像这样:

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

一定要做一个名为hiddenlabel的类,并设置visibility:hidden所以没有人看到标签。 你可以用隐藏的标签来存储很多东西。

现在,在你的javascript中,为了检索存储在标签中的信息(在这里是客户端的IP地址),你可以这样做:

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

现在你的variables“ip”等于ip地址。 Now you can pass the ip to your API request.

* EDIT 2 YEARS LATER * Two minor refinements:

I routinely use this method, but call the label class="data" , because, in fact, it is a way to store data. Class name "hiddenlabel" is kind of a stupid name.

The second modification is in the style sheet, instead of visibility:hidden :

 .data{ display:none; } 

…is the better way of doing it.

You could do this entirely client side and mostly in JavaScript by using a Flash object that the js can call. Flash can access the IP address of the local machine which might not be very useful.

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

data.host is the ip address. Simply call this from your browser.

http://smart-ip.net/geoip-json?callback=? [Without quotes] and get the ip.

You can use web services like: http://ip-api.com/

例:

 <script type="text/javascript" src="http://ip-api.com/json/?callback=foo"> <script> function foo(json) { alert(json.query) } </script> additional example: http://whatmyip.info 

I'm no javascript guru, but if its possible you could open an iframe with http://www.whatismyip.com/automation/n09230945.asp as the source and read the content of the frame.

Edit: this wont work because of the cross domain security.

All the above answers have a server part, not pure client part. This should be provided by the web browser. At present, no web browser support this.

However, with this addon for firefox: https://addons.mozilla.org/en-US/firefox/addon/ip-address/ You will have to ask your users to install this addon. (it's good from me, a 3rd party).

you can test whether the user has installed it.

 var installed=window.IP!==undefined; 

you can get it with javascript, if it is installed, then var ip=IP.getClient(); var IPclient=ip.IP; //while ip.url is the url

 ip=IP.getServer(); var IPserver=ip.IP; var portServer=ip.port; //while ip.url is the url //or you can use IP.getBoth(); 

more information here: http://www.jackiszhp.info/tech/addon.IP.html

 <!DOCTYPE html> <html ng-app="getIp"> <body> <div ng-controller="getIpCtrl"> <div ng-bind="ip"></div> </div> <!-- Javascript for load faster ================================================== --> <script src="lib/jquery/jquery.js"></script> <script src="lib/angular/angular.min.js"></script> <script> /// Scripts app 'use strict'; /* App Module */ var getIp = angular.module('getIp', [ ]); getIp.controller('getIpCtrl', ['$scope', '$http', function($scope, $http) { $http.jsonp('http://jsonip.appspot.com/?callback=JSON_CALLBACK') .success(function(data) { $scope.ip = data.ip; }); }]); </script> </body> </html> 
  $.getJSON("http://jsonip.com?callback=?", function (data) { alert("Your ip address: " + data.ip); }); 

I have my own api back end with laravel, so I usually just the following:

 $(document).ready( function() { $.getJSON( "http://api.whoisdoma.com/v1/ip/visitor?api_key=key", function(data){ alert( data.ip); } ); }); 

For extra security, I provide an api key which is required to get results.

It can't be done with Javascript alone (unless the clients have a browser plugin as described above). It can't be done with Flash on the client either. But it can be done on the client using a Java applet (and javascript can talk to that), although it will prompt for full permissions. eg See http://www.findmyrouter.net

If you use NGINX somewhere, you can add this snippet and ask your own server via any AJAX tool.

 location /get_ip { default_type text/plain; return 200 $remote_addr; } 
Interesting Posts