在网上搜了好几个用来获取外网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
关于C#正则详细请移步:http://www.jb51.net/article/360.htm