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

然而,我并不反对使用免费的第三方脚本/服务。


当前回答

用jQuery获取你的IP

你可以用一行JS得到你的公共IP地址?有一个免费的服务为你提供这个,你需要做的就是一个get请求:

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

要使上面的代码片段正常工作,浏览器必须支持CORS(跨源请求共享)。否则 将引发安全异常。在旧的浏览器中,你可以使用这个版本,它使用JSON-P请求:

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

其他回答

Appspot.com回调服务不可用。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

2021年更新:

正如最近一个新的Github存储库WebRTC - IP所示,你现在可以使用WebRTC泄露用户的公共IP地址。遗憾的是,由于逐渐转向mDNS(至少对于WebRTC),这种泄漏不适用于私有ip,在这里完全解释了。然而,这里有一个工作演示:

getIPs()。然后(res =>文档) <剧本剧本src = " https://cdn.jsdelivr.net/gh/joeymalvinni/webrtc-ip/dist/bundle.dev.js " > < / >

这个存储库的编译源代码可以在这里找到。




(前情提要)最终更新

这个解决方案将不再工作,因为浏览器正在修复webrtc泄漏:有关更多信息,请阅读另一个问题:rtciccandidate不再返回IP


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

var findIP =新的承诺(r = > {var w =窗口,= new (w.RTCPeerConnection | | w.mozRTCPeerConnection | | w.webkitRTCPeerConnection) ({iceServers: []}), b = () = > {}; a.createDataChannel (" "); a.createOffer (c = > a.setLocalDescription (c, b, b), b), a.onicecandidate = c = >{尝试{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)}捕捉(e) {}}}) / * * /用法示例 findIP。然后(ip =>文档。写入('your ip: ', ip))。Catch (e => console.error(e))

注意:如果你想要用户的所有IP(这可能更多地取决于他的网络),这个新的最小化代码将只返回一个IP,使用原始代码…


多亏了WebRTC,在WebRTC支持的浏览器中很容易获得本地IP(至少现在)。我修改了源代码,减少了行,不做任何stun请求,因为你只需要本地IP,而不是公共IP,下面的代码在最新的Firefox和Chrome中工作,只是运行代码片段并检查自己:

function findIP(onNewIP) { // onNewIp - your listener function for new IPs 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)) return; ice.candidate.candidate.match(ipRegex).forEach(ipIterate); }; } var ul = document.createElement('ul'); ul.textContent = 'Your IPs are: ' document.body.appendChild(ul); function addIP(ip) { console.log('got ip: ', ip); var li = document.createElement('li'); li.textContent = ip; ul.appendChild(li); } findIP(addIP); <h1> Demo retrieving Client IP using WebRTC </h1>

这里所发生的是,我们正在创建一个虚拟的对等端连接,为了让远程对等端与我们联系,我们通常彼此交换候选冰。读取ice candidate(从本地会话描述和onicecanddateevent),我们可以知道用户的IP。

我从哪里获取代码——>源代码

我会说乍得和马耳他有很好的答案。然而,他们的想法很复杂。所以我建议这个代码,我发现从广告国家插件

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

没有ajax。只是简单的javascript。: D

如果你访问http://j.maxmind.com/app/geoip.js,你会看到它包含

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不包含IP(尽管我打赌它使用IP来获取国家)。

但是编写这样的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访问的服务器也可以毫无问题地工作。

您可以使用我的服务http://ipinfo.io,它将为您提供客户端IP、主机名、地理位置信息和网络所有者。下面是一个记录IP的简单示例:

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

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

如果你总是包含一个文件,你可以做一个简单的ajax get:

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

ajax。getip。php是这样的

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