1c4d204906
Co-Authored-By: Claude Code <noreply@anthropic.com>
47 lines
1.9 KiB
Python
47 lines
1.9 KiB
Python
from iptocc import country_code
|
|
|
|
# ISO 3166-1 alpha-2 to country name (common ones)
|
|
COUNTRY_NAMES = {
|
|
"CN": "中国", "US": "美国", "NG": "尼日利亚", "GH": "加纳",
|
|
"KE": "肯尼亚", "TZ": "坦桑尼亚", "ZA": "南非", "EG": "埃及",
|
|
"AE": "阿联酋", "SA": "沙特阿拉伯", "IQ": "伊拉克", "JO": "约旦",
|
|
"PK": "巴基斯坦", "BD": "孟加拉国", "IN": "印度", "TH": "泰国",
|
|
"VN": "越南", "ID": "印尼", "PH": "菲律宾", "MY": "马来西亚",
|
|
"JP": "日本", "KR": "韩国", "GB": "英国", "DE": "德国",
|
|
"FR": "法国", "RU": "俄罗斯", "BR": "巴西", "MX": "墨西哥",
|
|
"AU": "澳大利亚", "CA": "加拿大", "TR": "土耳其", "IR": "伊朗",
|
|
"MM": "缅甸", "KH": "柬埔寨", "LA": "老挝", "LK": "斯里兰卡",
|
|
"NP": "尼泊尔", "UG": "乌干达", "ET": "埃塞俄比亚", "SN": "塞内加尔",
|
|
"CI": "科特迪瓦", "CM": "喀麦隆", "CD": "刚果(金)", "MZ": "莫桑比克",
|
|
}
|
|
|
|
|
|
def resolve_country(ip: str) -> str:
|
|
if not ip or ip in ("127.0.0.1", "::1", "localhost"):
|
|
return "本地"
|
|
try:
|
|
code = country_code(ip)
|
|
if code and code != "--":
|
|
return COUNTRY_NAMES.get(code, code)
|
|
return "未知"
|
|
except Exception:
|
|
return "未知"
|
|
|
|
|
|
def resolve_region_code(ip: str) -> str | None:
|
|
"""解析 ip 为 ISO 3166-1 alpha-2 国家码(如 "US"),查不到返回 None。
|
|
|
|
与 resolve_country 的分工:resolve_country 返回中文名(含"本地"/"未知"
|
|
兜底占位,仅供展示/记录);本函数返回 ISO alpha-2 或 None,供电话区号
|
|
推断等逻辑消费——绝无中文或占位值,调用方无需再过滤。
|
|
"""
|
|
if not ip or ip in ("127.0.0.1", "::1", "localhost"):
|
|
return None
|
|
try:
|
|
code = country_code(ip)
|
|
if code and code != "--":
|
|
return code
|
|
return None
|
|
except Exception:
|
|
return None
|