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

IT技术 javascript ip
2021-02-22 18:36:28

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

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

你能怎么办?

6个回答

检查您的链接站点,您可能包含一个传递?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>

演示

编辑:显然,此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>
我在本地使用 Aptana 工作室进行了尝试,效果很好。但是当我在我的网页上加载它时说“未定义”
2021-04-18 18:36:28
如果您有服务器端逻辑,最好的方法是回显用户用来请求页面的 IP。例如对于 PHP:<script>var myip = '<?php echo $_SERVER['REMOTE_ADDR']; ?>';</script>
2021-04-18 18:36:28
奇怪,你有没有一个接一个地包含两个脚本标签?只要您正在 ping 的站点已启动,这应该会起作用。
2021-05-01 18:36:28
最后确保var myip;你的脚本里面没有并且您没有"use strict";在全局范围内(尚未测试,但由于 l2.io 设置全局变量的方式,它可能会中断)
2021-05-02 18:36:28
如果您使用的是 Chrome,请检查是否在开发工具 (F12) 的网络选项卡中发出请求i.imgur.com/2oC7qal.png如果请求未出现在那里,请检查页面源以查看是否脚本实际上在那里。
2021-05-12 18:36:28
    $.ajax({
        url: '//freegeoip.net/json/',
        type: 'POST',
        dataType: 'jsonp',
        success: function(location) {
            alert(location.ip);
        }
    });

这也适用于 https

该服务不再可用
2021-04-22 18:36:28

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

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

该服务不再可用
2021-05-08 18:36:28

如果您遇到 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 调用。

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