在網上搜了好幾個用來獲取外網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