本文目录导读:

- 方法一:使用 curl(命令行/Linux/Mac)
- 方法二:Python 脚本(最推荐)
- 方法三:Bash 脚本(无 jq 依赖)
- 方法四:JavaScript/Node.js
- 推荐替代 API 列表
- 注意事项
可以使用很多种脚本查询 IP 归属地,最常用的方法是调用免费的 IP 地理定位 API,然后解析返回的 JSON 数据。
以下是几种主流语言的查询脚本示例,所有这些脚本都基于一个常用的免费 API:https://ipapi.co 或 https://ip-api.com。
使用 curl(命令行/Linux/Mac)
如果你只需要在终端快速查一下,这是最直接的方法。
查询当前本机IP归属地:
curl -s https://ipapi.co/json/ | jq .
注意:你需要安装 jq(一个命令行 JSON 处理器),否则输出会是一大段未格式化的文本。
查询指定IP(8.8.8.8):
curl -s https://ipapi.co/8.8.8.8/json/ | jq .
Python 脚本(最推荐)
Python 代码简洁,适合集成到自动化任务中。
import requests
import json
def get_ip_location(ip_address=None):
"""
查询IP归属地
:param ip_address: 要查询的IP,如果为None则查询本机IP
:return: 包含归属地信息的字典
"""
if ip_address:
# 查询指定IP(以 ip-api.com 为例,免费且无需API Key)
url = f"http://ip-api.com/json/{ip_address}"
else:
# 查询本机IP(使用 ip-api 同样支持)
url = "http://ip-api.com/json"
try:
response = requests.get(url, timeout=10)
data = response.json()
if data.get("status") == "success":
info = {
"IP": data.get("query"),
"国家": data.get("country"),
"地区": data.get("regionName"),
"城市": data.get("city"),
"ISP": data.get("isp"),
"组织": data.get("org"),
"经纬度": f"{data.get('lat')},{data.get('lon')}"
}
return info
else:
return {"错误": data.get("message", "查询失败")}
except Exception as e:
return {"错误": str(e)}
# 示例使用
if __name__ == "__main__":
# 查询本机IP
print("=== 本机IP归属地 ===")
result = get_ip_location()
for key, value in result.items():
print(f"{key}: {value}")
print("\n=== 查询 Google DNS (8.8.8.8) ===")
result = get_ip_location("8.8.8.8")
for key, value in result.items():
print(f"{key}: {value}")
Bash 脚本(无 jq 依赖)
如果你没有 jq 又想用 Shell 脚本,可以用 awk 或 sed 手动解析。
#!/bin/bash
# 查询本机IP归属地
query_ip() {
local ip=${1:-""}
local url
if [ -z "$ip" ]; then
url="http://ip-api.com/json/"
else
url="http://ip-api.com/json/$ip"
fi
# 获取JSON并解析(使用awk简单提取)
response=$(curl -s "$url")
# 提取常用字段
country=$(echo "$response" | awk -F'"' '/"country":"/{print $4}')
city=$(echo "$response" | awk -F'"' '/"city":"/{print $4}')
isp=$(echo "$response" | awk -F'"' '/"isp":"/{print $4}')
query_ip=$(echo "$response" | awk -F'"' '/"query":"/{print $4}')
echo "IP: $query_ip"
echo "国家: $country"
echo "城市: $city"
echo "ISP: $isp"
}
# 测试
echo "当前IP归属地:"
query_ip
echo ""
echo "指定IP (8.8.8.8) 归属地:"
query_ip "8.8.8.8"
JavaScript/Node.js
如果你想在服务器端或浏览器(有跨域限制)使用。
// Node.js 版本(需要安装 axios 或使用 fetch)
const fetch = require('node-fetch'); // 或使用内置 fetch (Node 18+)
async function getIpLocation(ipAddress = null) {
const baseUrl = 'http://ip-api.com/json';
const url = ipAddress ? `${baseUrl}/${ipAddress}` : baseUrl;
try {
const response = await fetch(url);
const data = await response.json();
if (data.status === 'success') {
return {
ip: data.query,
国家: data.country,
地区: data.regionName,
城市: data.city,
ISP: data.isp
};
} else {
return { error: '查询失败' };
}
} catch (error) {
return { error: error.message };
}
}
// 使用
getIpLocation('8.8.8.8').then(console.log);
推荐替代 API 列表
| API 地址 | 特点 | 免费限制 |
|---|---|---|
ip-api.com |
响应快,字段全,支持中文 | 每分钟45次请求 |
ipapi.co |
稳定,但部分字段需付费Key | 免费版每天1000次 |
ipinfo.io |
简单易用 | 免费版每天50000次(需注册Key) |
注意事项
- 尊重频率限制:免费API通常有请求频率限制(如
ip-api.com每分钟45次),不要高频率循环查询。 - 离线查询:如果需要大量查询且不想依赖网络,可以使用离线数据库(如 纯真IP库 或 GeoIP2),但脚本会更复杂。
- 隐私:不要用脚本频繁查询敏感IP(如公司服务器IP),因为请求会发送到第三方服务器。
最简单的选择是直接运行上面的 Python 版本,它兼顾了可读性和实用性。