通过第三方Web服务获取客户端IP地址

Mil*_*n90 15 javascript ip

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

function getMyIP() {
  var myIp;
  ...
  return myIp;
}
Run Code Online (Sandbox Code Playgroud)

你怎么办?

Fab*_*tté 33

检查链接的站点,您可以包含一个脚本标记,该脚本标记传递一个?var=desiredVarName参数,该参数将被设置为包含IP地址的全局变量:

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

演示

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


HTTPS支持

如果您的页面使用https协议提供服务,大多数浏览器将阻止使用http协议(包括脚本和图像)提供的同一页面中的内容,因此选项相当有限.如果您每天的点击次数<5k,则可以使用智能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>
Run Code Online (Sandbox Code Playgroud)

演示

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


使用后端逻辑

如果您有后端服务器逻辑,最有弹性和最简单的方法是在<script>标记内简单地输出请求者的IP ,这样您就不需要依赖外部资源.例如:

PHP:

<script>var myip = '<?php echo $_SERVER['REMOTE_ADDR']; ?>';</script>
Run Code Online (Sandbox Code Playgroud)

在这个相关的答案中,还有一个更加坚固的PHP解决方案(占有时由代理设置的标题).

C#:

<script>var myip = '<%= Request.UserHostAddress %>';</script>
Run Code Online (Sandbox Code Playgroud)


Ran*_*mar 14

    $.ajax({
        url: '//freegeoip.net/json/',
        type: 'POST',
        dataType: 'jsonp',
        success: function(location) {
            alert(location.ip);
        }
    });
Run Code Online (Sandbox Code Playgroud)

这也适用于https


Day*_*son 9

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

同时返回IP地址和地理位置.还启用了跨域请求(Access-Control-Allow-Origin:*),因此您无需围绕JSONP进行编码.