发布:2022/12/21 17:22:27作者:管理员 来源:本站 浏览次数:583
在网上搜了好几个用来获取外网IP的URL,在应用中也用了,但是过了一段时间发现,其中一个失效了,可能是请求的过多,用的人太多了吧。
今天找了一个来之“站长之家”的:
很简单的一个方法,直接看代码吧:
复制代码
public static string getExternalIp()
{
try
{
WebClient client = new WebClient();
client.Encoding = System.Text.Encoding.Default;
//string response = client.DownloadString("http://1212.ip138.com/ic.asp");//失效了
//string response = client.DownloadString("http://icanhazip.com/");//可用,可能不稳定
string response = client.DownloadString("http://ip.chinaz.com/");//站长之家
string myReg = @"<dd class=""fz24"">([\s\S]+?)<\/dd>";
Match mc = Regex.Match(response, myReg, RegexOptions.Singleline);
if (mc.Success && mc.Groups.Count > 1)
{
response = mc.Groups[1].Value;
return response;
}
else
{
return "Can't get you Ip address!";
}
}
catch(Exception)
{
return "Can't get you Ip address!";
}
}
复制代码
这里需要注意一点的就是里面的正则,不熟悉,查了半天。我们在页面中根据class的名字来正则匹配出来IP地址:
我们看这个网址:http://ip.chinaz.com/
我们要获取的就是红框中的IP地址:使用正则匹配:
复制代码
string myReg = @"<dd class=""fz24"">([\s\S]+?)<\/dd>";
Match mc = Regex.Match(response, myReg, RegexOptions.Singleline);
if (mc.Success && mc.Groups.Count > 1)
{
response = mc.Groups[1].Value;
return response;
}
复制代码
注意:@的作用就是输出“\”这种特殊字符时不需要转义。
\s表示匹配任意空字符,\S表示匹配任意不是空白符的字符。等价于 [^ \f\n\r\t\v]。
+表示匹配前面的子表达式一次或多次。
?表示匹配前面的子表达式零次或一次。
+?一起表示重复1次或更多次,但尽可能少重复。与上面一样,只是至少要重复1次。
最后才突然发现:站长之家提供查询外网IP的接口:http://ip.chinaz.com/getip.aspx
© Copyright 2014 - 2024 柏港建站平台 ejk5.com. 渝ICP备16000791号-4