【问题标题】:Get client IP address via third party web service通过第三方 Web 服务获取客户端 IP 地址
【发布时间】:2013-06-29 04:39:25
【问题描述】:

我想使用 javascript 从以下页面(http://l2.io/ip 或其他)读取我的 IP 地址,以将他保存在我的变量“myIp”中。

function getMyIP() {
  var myIp;
  ...
  return myIp;
}

你怎么办?

【问题讨论】:

  • 另一个问题要求提供客户端 JS 解决方案。相比之下,此问题询问有关通过某些远程 Web 服务检索 IP 地址的问题。

标签: javascript ip


【解决方案1】:

检查您的linked site,您可能包含一个脚本标签,该标签传递?var=desiredVarName 参数,该参数将被设置为包含IP 地址的全局变量:

<script type="text/javascript" src="http://l2.io/ip.js?var=myip"></script>
                                                      <!-- ^^^^ -->
<script>alert(myip);</script>

Demo

我相信我不必说这很容易被欺骗(通过使用代理或欺骗的请求标头),但无论如何都值得注意。


HTTPS 支持

如果您的页面使用https 协议提供,大多数浏览器将阻止使用http 协议提供的同一页面中的内容(包括脚本和图像),因此选项相当有限。如果您每天的点击次数 Smart IP API。例如:

<script>
var myip;
function ip_callback(o) {
    myip = o.host;
}
</script>
<script src="https://smart-ip.net/geoip-json?callback=ip_callback"></script>
<script>alert(myip);</script>

Demo

编辑:显然,此https 服务的证书已过期,因此用户必须手动添加异常。直接打开其API查看证书状态:https://smart-ip.net/geoip-json


有后端逻辑

如果您有后端服务器逻辑,最灵活和最简单的方法是简单地将请求者的 IP 输出到 &lt;script&gt; 标记内,这样您就不需要依赖外部资源。例如:

PHP:

<script>var myip = '<?php echo $_SERVER['REMOTE_ADDR']; ?>';</script>

related answer 中还有一个更强大的 PHP 解决方案(考虑有时由代理设置的标头)。

C#:

<script>var myip = '<%= Request.UserHostAddress %>';</script>

【讨论】:

  • 我在本地使用 Aptana studio 进行了尝试,它可以工作。但是当我在我的网页上加载它时说“未定义”
  • 奇怪,你有没有一个接一个地包含两个脚本标签?只要您要 ping 的站点正常,这应该可以工作。
  • 如果您有服务器端逻辑,最好的方法是回显用户用于请求页面的 IP。例如。对于 PHP:&lt;script&gt;var myip = '&lt;?php echo $_SERVER['REMOTE_ADDR']; ?&gt;';&lt;/script&gt;
  • 如果您使用的是 Chrome,请检查是否在开发工具 (F12) 的网络选项卡中发出请求:i.imgur.com/2oC7qal.png 如果该请求未出现在此处,请检查页面源以看看脚本是否真的存在。
  • 最后确保你的脚本中没有var myip;。并且您在全局范围内没有 "use strict";(尚未测试,但由于 l2.io 设置全局变量的方式可能会中断)
【解决方案2】:
    $.ajax({
        url: '//freegeoip.net/json/',
        type: 'POST',
        dataType: 'jsonp',
        success: function(location) {
            alert(location.ip);
        }
    });

这也适用于 https

【讨论】:

  • 服务不再可用
【解决方案3】:

更可靠的 REST 端点是 http://freegeoip.net/json/

同时返回 IP 地址和地理位置。还启用了跨域请求(Access-Control-Allow-Origin: *),因此您不必围绕 JSONP 编写代码。

【讨论】:

  • 服务不再可用
【解决方案4】:

如果您遇到 CORS 问题,可以使用https://api.ipify.org/

function httpGet(theUrl)
{
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.open( "GET", theUrl, false );
    xmlHttp.send( null );
    return xmlHttp.responseText;
}


publicIp = httpGet("https://api.ipify.org/");
alert("Public IP: " + publicIp);

我同意使用同步 HTTP 调用不是一个好主意。然后你可以使用异步 ajax 调用。

【讨论】:

    【解决方案5】:
        <script type="application/javascript">
                function getip(json){
                alert(json.ip); // alerts the ip address
        }
        </script>
    
        <script type="application/javascript" src="http://jsonip.appspot.com/?callback=getip"></script>
    

    【讨论】:

      【解决方案6】:

      这也会拉回客户信息。

      var get = function(u){
          var x = new XMLHttpRequest;
          x.open('GET', u, false);
          x.send();
          return x.responseText;
      }
      
      JSON.parse(get('http://ifconfig.me/all.json'))
      

      【讨论】:

      • 这不起作用,因为不允许跨域请求。另外,做同步请求是非常邪恶的。
      【解决方案7】:

      好吧,如果您在 HTML 中导入脚本...

      <script type="text/javascript" src="//stier.linuxfaq.org/ip.php"></script>
      

      然后您可以在页面的任何位置使用变量 userIP(这将是访问者的 IP 地址)。

      重定向:&lt;script&gt;if (userIP == "555.555.555.55") {window.location.replace("http://192.168.1.3/flex-start/examples/navbar-fixed-top/");}&lt;/script&gt;

      或者在页面上显示:document.write (userIP);

      免责声明:我是我说要导入的脚本的作者。该脚本使用 PHP 提供 IP。该脚本的源代码如下。

      <?php //Gets the IP address $ip = getenv("REMOTE_ADDR") ; Echo "var userIP = '" . $ip . "';"; ?>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-14
        • 1970-01-01
        • 1970-01-01
        • 2016-02-24
        • 1970-01-01
        相关资源
        最近更新 更多