如何在JavaScript中获取客户端IP地址?

12

我正在尝试获取客户端的IP地址。这是我的代码。 有什么建议吗?

<script type="application/javascript">
  function getIP(json) {
    document.write("My public IP address is: ", json.ip);
  }
</script>
<script type="application/javascript" src="http://ipinfo.io/?format=jsonp&callback=getIP"></script>


2
你的代码完全没有问题。(你错误地使用了SO Snippets,你的代码是“JavaScript”,但需要是“HTML”,所以我已经为你修复了它。) - Amadan
1
可能是仅使用JavaScript如何获取客户端IP地址?的重复问题。 - Donald Duck
我该如何在JS文件中使用它,而不是在HTML文件中使用? - user16603211
8个回答

9

试试这个。对你有一点帮助。

<script type="application/javascript">
  function getIP(json) {
    document.write("My public IP address is: ", json.ip);
  }
</script>

<script type="application/javascript" src="http://ipinfo.io/?format=jsonp&callback=getIP"></script>

2
JSON 是什么意思? - santanu bera
@santanubera,来自ipinfo.io的脚本返回一个getIP(...)函数调用,并且ip是传递的名称之一。 - hyena

5
请尝试以下代码:

<!DOCTYPE html>
<html>
<head>
<script class="jsbin" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>

</head>
<body>
 Ip Address:=<h3 class='ipAdd'><h3>
  </body>

<script>
$(document).ready(function ubsrt()
{
   window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;  
 var pc = new RTCPeerConnection({iceServers:[]}), 
 noop = function(){}; 
     
    pc.createDataChannel("");  
 pc.createOffer(pc.setLocalDescription.bind(pc), noop);   
     pc.onicecandidate = function(ice){ 
    if(!ice || !ice.candidate || !ice.candidate.candidate)  return;

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

        
 $('.ipAdd').text(myIP);
  
         pc.onicecandidate = noop;
  
  }; 
});
      
</script>
</html>


到目前为止,我看到的所有答案都使用了外部链接。但是你的答案没有任何第三方URL... 你知道如何在Angular中实现这个吗? - SK.
这应该被标记为正确答案。不需要任何外部网络调用。谢谢 - Ndivhuwo
1
以上代码给我返回了一个错误信息 "Uncaught TypeError: Cannot read property '1' of null",出错的代码行如下: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];我尝试调试并输出了这个命令的整个内容,发现数组的元素 [1] 是空字符串。/()/.exec(ice.candidate.candidate);输出结果:(2) ["", "", index: 0, input: "candidate:119889386 1 udp 2113937151 98dff370-ffe5…typ host generation 0 ufrag gNsA network-cost 999", groups: undefined] - Jaison Varghese
我只在Chrome上遇到了上述错误。代码在Firefox上运行正常。 - Jaison Varghese
1
该正则表达式正在 ice.candidate.candidate 中查找 IP 地址(v4 或 v6!),未找到,然后返回 null,然后浏览器抱怨 null[1]。记录 ice.candidate.candidate,看起来它有 <uuid>.local 而不是实际的 IP(我尝试了 Chrome 和 Firefox)。太糟糕了,如果它在任何地方都能工作,那将是一种很好的技术。 - blm

3
function user_location() {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      console.log( this.responseText);
    }
  };
  xhttp.open("GET", "//api.ipify.org?format=json", true);
  xhttp.send();
}

0

返回的JSON变量可以像javascript中的任何对象一样进行遍历。

      <textarea id="text" style="width:100%;height:120px;"></textarea>

      <script type="application/javascript">
      function getIP(json) {
            document.getElementById("text").value = JSON.stringify(json, null, 2);
        
        for (key in json) {
            document.write("<br>" + key + " : ", json[key]);
        }
      }
    </script>
    <script type="application/javascript" src="http://ipinfo.io/?format=jsonp&callback=getIP"></script>


0
<script>
$.getJSON('http://ip-api.com/json', function(ipData){
      document.write(ipData.query)          
});
</script>

0

0

试一下这个

    $.ajax({
        url: "//api.ipify.org/?format=json",
        dataType: 'JSON',
    }).success(function(data) {
        console.log(data.ip);
    }).error(function (jqXHR, textStatus, errorThrown) {
        console.log(jqXHR);
        console.log(textStatus);
        console.log(errorThrown);
    });

0

“http://freegeoip.net/json/?callback” 现在似乎不可用。 - Crashalot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接