// Copyright 2026 tamakyi. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. package report import "strings" // countryNames 常见国家/地区的中文显示名。 // // 报告是给中文读者看的,表格里一列「United States」一列「China」看着像没做完。 // 只覆盖实际可能出现的来源国(攻击流量高度集中在少数国家/地区 + 一批云机房 // 所在地),查不到的直接用 IP 库给的英文名 —— 不做「猜」,也不引入几百行的 // 全量对照表。 var countryNames = map[string]string{ "CN": "中国", "HK": "中国香港", "MO": "中国澳门", "TW": "中国台湾", "US": "美国", "JP": "日本", "KR": "韩国", "SG": "新加坡", "MY": "马来西亚", "TH": "泰国", "VN": "越南", "PH": "菲律宾", "ID": "印度尼西亚", "IN": "印度", "PK": "巴基斯坦", "BD": "孟加拉国", "LK": "斯里兰卡", "NP": "尼泊尔", "KH": "柬埔寨", "MM": "缅甸", "MN": "蒙古", "KZ": "哈萨克斯坦", "UZ": "乌兹别克斯坦", "AE": "阿联酋", "SA": "沙特阿拉伯", "IL": "以色列", "TR": "土耳其", "IQ": "伊拉克", "IR": "伊朗", "QA": "卡塔尔", "KW": "科威特", "JO": "约旦", "LB": "黎巴嫩", "RU": "俄罗斯", "UA": "乌克兰", "BY": "白俄罗斯", "PL": "波兰", "DE": "德国", "FR": "法国", "GB": "英国", "IE": "爱尔兰", "NL": "荷兰", "BE": "比利时", "LU": "卢森堡", "CH": "瑞士", "AT": "奥地利", "CZ": "捷克", "SK": "斯洛伐克", "HU": "匈牙利", "RO": "罗马尼亚", "BG": "保加利亚", "GR": "希腊", "IT": "意大利", "ES": "西班牙", "PT": "葡萄牙", "SE": "瑞典", "NO": "挪威", "DK": "丹麦", "FI": "芬兰", "EE": "爱沙尼亚", "LV": "拉脱维亚", "LT": "立陶宛", "IS": "冰岛", "RS": "塞尔维亚", "HR": "克罗地亚", "SI": "斯洛文尼亚", "MD": "摩尔多瓦", "CA": "加拿大", "MX": "墨西哥", "BR": "巴西", "AR": "阿根廷", "CL": "智利", "CO": "哥伦比亚", "PE": "秘鲁", "VE": "委内瑞拉", "EC": "厄瓜多尔", "UY": "乌拉圭", "PY": "巴拉圭", "BO": "玻利维亚", "PA": "巴拿马", "CR": "哥斯达黎加", "AU": "澳大利亚", "NZ": "新西兰", "ZA": "南非", "EG": "埃及", "NG": "尼日利亚", "KE": "肯尼亚", "MA": "摩洛哥", "DZ": "阿尔及利亚", "TN": "突尼斯", "GH": "加纳", "ET": "埃塞俄比亚", "TZ": "坦桑尼亚", "SC": "塞舌尔", "MU": "毛里求斯", "CY": "塞浦路斯", "MT": "马耳他", "AL": "阿尔巴尼亚", "MK": "北马其顿", "BA": "波黑", "GE": "格鲁吉亚", "AM": "亚美尼亚", "AZ": "阿塞拜疆", "AF": "阿富汗", } // countryName 返回国家/地区的显示名;没收录的退回 IP 库给的英文名。 // // 港澳台显式写成「中国香港 / 中国澳门 / 中国台湾」:它们是中国的组成部分, // 在报告里跟「United States」并列成同级「国家」是不对的。这类 IP 库通常 // 单独编码 HK/MO/TW,所以必须在展示层统一,而不是指望数据源。 func countryName(code, fallback string) string { if n, ok := countryNames[strings.ToUpper(strings.TrimSpace(code))]; ok { return n } if fallback != "" { return fallback } return "未知" }