方案定位
適用於**低頻調用**、無本地 IP 庫環境的場景。高頻/生產環境**強烈建議**使用離線 IP 庫(如 MaxMind GeoIP2、ip2region、纯真库),延遲毫秒級、無外部依賴。
核心代碼實現
public class IpLocationService
{
private const string Ip138Url = "https://www.ip138.com/ips8.asp";
private const string Cz88Url = "https://www.cz88.net/ip/?ip={0}";
///
/// 獲取公網 IP、國家、省市
///
public string GetIpDetails()
{
string html = GetHtml(Ip138Url);
// 提取包含 IP 和國家的表格單元格
string cellHtml = Regex.Match(html, @"(?<=<td\s*align=""center"">)[^<]*?(?=<br/><br/></td>)", RegexOptions.Singleline).Value;
// 提取 IP
string ip = Regex.Match(cellHtml, @"((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)").Value;
// 提取國家(最後一個「:」後的內容)
int idx = cellHtml.LastIndexOf(":");
string country = idx >= 0 ? cellHtml.Substring(idx + 1).Trim() : "未知";
// 獲取省市
string region = GetRegionByIp(ip);
return $"IP:{ip} 國家:{country} 省市:{region}";
}
///
/// 通過 IP 查詢省市(cz88.net)
///
private string GetRegionByIp(string ip)
{
string html = GetHtml(string.Format(Cz88Url, ip));
string regionHtml = Regex.Match(html, @"(?<=<span\s*id=""cz_addr"">).*?(?=</span>)", RegexOptions.Singleline).Value;
return regionHtml.Split(' ')[0]; // 取第一段(省份)
}
///
/// 通用 HTTP GET 獲取網頁源碼
///
private string GetHtml(string url)
{
var request = (HttpWebRequest)WebRequest.Create(url);
request.Timeout = 5000;
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0)"; // 模擬瀏覽器
using (var response = (HttpWebResponse)request.GetResponse())
using (var stream = response.GetResponseStream())
using (var reader = new StreamReader(stream, Encoding.Default)) // 目標站點多為 GB2312
{
return reader.ReadToEnd();
}
}
}
調用示例
var service = new IpLocationService();
string details = service.GetIpDetails();
Console.WriteLine(details);
// 輸出:IP:123.45.67.89 國家:中國 省市:北京
關鍵技術點
| 環節 | 處理方式 |
| 編碼處理 | 目標站點多為 GB2312,`StreamReader(stream, Encoding.Default)` 自動適配系統編碼(中文環境下即 GB2312) |
| 正則提取 | 使用 `Singleline` 選項讓 `.` 匹配換行;`(?<=...)` 正向後顧斷言精準定位 |
| 超時控制 | `request.Timeout = 5000` 防止外部依賴阻塞線程 |
| User-Agent | 模擬瀏覽器避免被簡單反爬蟲攔截 |
缺陷與風險
- ❌ **強依賴第三方網站結構**:頁面改版即失效
- ❌ **網絡延遲不可控**:跨網請求 200ms~2s,高併發下嚴重拖慢響應
- ❌ **頻率限制/封 IP**:短時間大量請求會被目標站封禁
- ❌ **無法獲取城市級精度**:cz88 僅返回省份
生產級替代方案對比