我需要以某种方式检索客户端的IP地址使用JavaScript;没有服务器端代码,甚至没有SSI。
然而,我并不反对使用免费的第三方脚本/服务。
我需要以某种方式检索客户端的IP地址使用JavaScript;没有服务器端代码,甚至没有SSI。
然而,我并不反对使用免费的第三方脚本/服务。
当前回答
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。
我从哪里获取代码——>源代码
其他回答
<!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>
使用Smart-IP.net Geo-IP API。例如,使用jQuery:
$(document).ready( function() {
$.getJSON( "http://smart-ip.net/geoip-json?callback=?",
function(data){
alert( data.host);
}
);
});
Javascript / jQuery获取客户端的IP地址和位置(国家,城市)
你只需要嵌入一个带有“src”链接的标签到服务器。服务器将以Object / JSON的形式返回“codehelper_ip”,您可以立即使用它。
// 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);
它将显示关于返回对象的更多信息。
如果你想要回调函数,请试试这个:
// 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>
用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); });
你不能。你得问服务员。