• 获取出口ip or api获取请求者ip


    艾玛,这两天为了整这个ip 真的可谓无所不用其极。

    在网上查阅了各种资料,其实我想实现的功能很简单

    就像百度

    直接看到自己的出口ip

    奈何查了许多资料,都没有适合的解决办法。

    灵机一动,我是不是可以访问百度的api呢?

    于是点击了上面的Ip地址查询,跳转到了  http://www.ip138.com/

    然后我试着在显示Ip的地方,查看元素

    惊喜来了

    原来它是套了一个iframe

    把  iframe 的地址那出来  http://2018.ip138.com/ic.asp

    直接返回ip地址和所在地。

    接着对返回数据进行解析

    public static string getExternalIp()
            {
                try
                {
                    WebClient client = new WebClient();
                    client.Encoding = System.Text.Encoding.Default;
                    string response = client.DownloadString("http://2018.ip138.com/ic.asp");
                    string myReg = @"<center>([sS]+?)</center>";
                    Match mc = Regex.Match(response, myReg, RegexOptions.Singleline);
                    if (mc.Success && mc.Groups.Count > 1)
                    {
                        var resStart = mc.Groups[1].Value.IndexOf('[');
                        var resEnd = mc.Groups[1].Value.IndexOf(']');
                        var resSub = mc.Groups[1].Value.Substring(resStart + 1, resEnd - resStart - 1);
                        response = resSub;
    
                        return response;
                    }
                    else
                    {
                        return "0.0.0.0";
                    }
                }
                catch (Exception)
                {
                    return "0.0.0.0";
                }
            }
    

      完美,是不是大功告成?

    可是在测试的途中发现有时候依然会失败,返回数据为 "0.0.0.0"

    于是我又加了一个定时器

     GetAddressIP();
                if (!this.lblIp.Content.ToString().Equals("0.0.0.0"))
                {
                    selectIp.Stop();
                }
    

      每一秒去取一次Ip,直到取到为止

    当然我觉得这都不是最好的办法

    可是转念一想,为什么我们不自己写一个获取请求者的Ip的接口呢?

    在这里我得感谢一个人

    老六代码

    多亏有了这位大哥的帮忙,才让我得已在 .net core api 下面成功拿到了请求者的Ip

    初始化时

       services.AddMvc();
                services.Configure<IISOptions>(options => 
                {
                    options.ForwardClientCertificate = false;
                });
    

      然后接口这里

     private IHttpContextAccessor _accessor;
    
     public Controller(IHttpContextAccessor accessor)
            {
                this._accessor = accessor;
            }
    
     [HttpPost, Route("GetIp")]
            public ActionResult<string> GetIp()
            {
                var ip = _accessor.HttpContext.Connection.RemoteIpAddress;
                return ip.ToString();
            }
    

      因为我是.net core 的缘故。所以用到了IHttpContextAccessor

    我想如果是普通的api 应该直接就可以用Request 吧,就像老六大哥说的那样~

  • 相关阅读:
    通过scp拷贝文件时无需交互输入密码
    suse linux安装lrzsz
    shc加密shell脚本
    linux小程序--cmatrix
    linux系统PXE+Kickstart自动安装系统
    升级SSH
    shell生成随机数的几种方法
    django —— MVT模型
    Django学习---笔记一
    python学习--Django虚拟环境搭建
  • 原文地址:https://www.cnblogs.com/myblogslh/p/10021902.html
Copyright © 2020-2023  润新知