脚本如何查询IP归属地

wen 实用脚本 28

本文目录导读:

脚本如何查询IP归属地

  1. 方法一:使用 curl(命令行/Linux/Mac)
  2. 方法二:Python 脚本(最推荐)
  3. 方法三:Bash 脚本(无 jq 依赖)
  4. 方法四:JavaScript/Node.js
  5. 推荐替代 API 列表
  6. 注意事项

可以使用很多种脚本查询 IP 归属地,最常用的方法是调用免费的 IP 地理定位 API,然后解析返回的 JSON 数据。

以下是几种主流语言的查询脚本示例,所有这些脚本都基于一个常用的免费 API:https://ipapi.cohttps://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 脚本,可以用 awksed 手动解析。

#!/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)

注意事项

  1. 尊重频率限制:免费API通常有请求频率限制(如 ip-api.com 每分钟45次),不要高频率循环查询。
  2. 离线查询:如果需要大量查询且不想依赖网络,可以使用离线数据库(如 纯真IP库GeoIP2),但脚本会更复杂。
  3. 隐私:不要用脚本频繁查询敏感IP(如公司服务器IP),因为请求会发送到第三方服务器。

最简单的选择是直接运行上面的 Python 版本,它兼顾了可读性和实用性。

抱歉,评论功能暂时关闭!