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

15

我想使用JavaScript从以下网页(http://l2.io/ip或其他)读取我的IP地址,并将它保存在名为"myIp"的变量中。

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

你怎样做呢?


1
可能是Get Client IP using just Javascript?的重复问题。 - PSL
另一个问题要求提供客户端JS解决方案。相反,这个问题是关于通过一些远程Web服务检索IP地址的。 - moooeeeep
7个回答

35

查看你的链接网站,你可以包含一个脚本标签,传递一个?var=desiredVarName参数,它将被设置为包含IP地址的全局变量:

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

演示

我认为我不必说这可以很容易地被欺骗(通过代理或伪造请求头),但无论如何都值得注意。


HTTPS支持

如果您的页面使用https协议提供,则大多数浏览器将阻止使用http协议在同一页面中提供的内容(包括脚本和图像),因此选项相当有限。如果您每天的点击率小于5k,则可以使用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


使用后端逻辑

如果你有后端服务器逻辑,则最坚韧且简单的方法是在<script>标签中输出请求者的IP地址,这样你就不需要依赖外部资源。例如:

PHP:

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

这里也有一个更稳定的 PHP 解决方案(考虑到代理有时会设置头信息),在此相关答案中。

C#:

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

1
我在Aptana Studio本地尝试了一下,它可以工作。但是当我将其加载到我的网页上时,显示为“未定义”。 - Milton90
我相信你的第一个脚本的srchttp://,因为你没有将其格式化为代码,所以Stack Overflow将其删除了,但它应该可以正常工作。也许在上传编辑后的文件后,可以按Ctrl+F5来确保这不是缓存问题。=] - Fabrício Matté
1
如果您正在使用Chrome,请检查请求是否在Dev Tools(F12)的Network选项卡中进行:http://i.imgur.com/2oC7qal.png 如果请求未出现,请检查页面源代码以查看脚本是否实际存在。 - Fabrício Matté
1
最后,请确保您的脚本中没有 var myip;。并且您的全局范围内没有 "use strict";(尚未测试,但由于 l2.io 设置全局变量的方式可能会导致破坏)。 - Fabrício Matté
是的,我使用Chrome,在开发者工具中读到:阻止了页面https://mypage...从http://l2.io/ip.js?var=myip运行不安全内容。 - Milton90
显示剩余14条评论

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

这也可以适用于https


该服务不再可用。 - Vishnu Bhadoriya

9

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

该终端不仅返回IP地址,还会返回地理位置信息。并且启用了跨域请求(Access-Control-Allow-Origin: *),因此您无需编写JSONP代码。


该服务不再可用。 - Vishnu Bhadoriya

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 调用代替。


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

0

这也会返回客户端信息。

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

这不起作用,因为不允许跨域请求。同时,执行同步请求是极其不好的。 - Valentin Klinghammer

0

如果在HTML中导入了一个脚本...

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

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

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

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

免责声明:我是所述导入脚本的作者。该脚本使用PHP获取IP。脚本的源代码如下。

<?php //获取IP地址 $ip = getenv("REMOTE_ADDR") ; Echo "var userIP = '" . $ip . "';"; ?>


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