作为开发多年的程序员,处理 IP 相关的需求简直是家常便饭。不管是做用户行为分析,还是限制异地登录,都离不开IP 地址查询功能。今天就分享一个自己常用的 IP 查询方案,包括 Python 实现代码和一个超好用的在线工具。
别以为IP 查询只是运维的事,实际开发中用处多着呢。做用户画像时,需要通过 IP 判断用户大致地理位置;做安全防护时,要识别异常 IP 的登录行为;甚至做内容推荐,也得根据用户所在地区推送合适的内容。
之前接手过一个项目,需要限制同一 IP 的高频访问。最初用的第三方接口延迟太高,后来自己写了一套轻量查询工具,响应速度提升了 70%。其实很多时候,我们不需要太复杂的功能,能快速获取IP 归属地和基本信息就够了。
分享一个我封装的 IP 查询类,核心代码不到 30 行,支持查询本机 IP 和指定 IP 信息:
python
import requests
import json
class IPInfoTool:
def __init__(self):
# 接口超时设置为3秒,避免影响主程序
self.timeout = 3
# 备用接口列表,提高稳定性
self.api_list = [
"https://www.nimail.cn/api/ipinfo",
"https://ipapi.co/{ip}/json/"
]
def get_local_ip(self):
"""获取本机公网IP"""
try:
# 使用第一个接口获取本机IP
response = requests.get(
self.api_list[0],
params={"local": 1},
timeout=self.timeout
)
if response.status_code == 200:
data = response.json()
return data.get("ip", "获取失败")
# 接口调用失败时切换备用方案
response = requests.get("https://api.ipify.org?format=json", timeout=self.timeout)
return response.json().get("ip", "获取失败")
except Exception as e:
print(f"获取本机IP出错: {str(e)}")
return None
def query_ip_info(self, ip=None):
"""查询指定IP或本机IP的详细信息"""
if not ip:
ip = self.get_local_ip()
if not ip:
return None
for api in self.api_list:
try:
# 处理不同接口的URL格式
if "{ip}" in api:
url = api.format(ip=ip)
response = requests.get(url, timeout=self.timeout)
else:
response = requests.get(
api,
params={"ip": ip},
timeout=self.timeout
)
if response.status_code == 200:
return self._format_info(response.json())
except Exception as e:
print(f"接口 {api} 调用失败: {str(e)}")
continue
return None
def _format_info(self, raw_data):
"""格式化IP信息,提取关键字段"""
# 统一不同接口的返回格式
info_map = {
"ip": raw_data.get("ip", ""),
"country": raw_data.get("country", raw_data.get("country_name", "")),
"region": raw_data.get("region", raw_data.get("region_name", "")),
"city": raw_data.get("city", ""),
"isp": raw_data.get("isp", raw_data.get("org", ""))
}
return info_map
# 使用示例
if __name__ == "__main__":
ip_tool = IPInfoTool()
# 查询本机IP
local_ip = ip_tool.get_local_ip()
print(f"本机IP: {local_ip}")
# 查询详细信息
ip_info = ip_tool.query_ip_info()
if ip_info:
print("\nIP详细信息:")
print(f"IP地址: {ip_info['ip']}")
print(f"归属地: {ip_info['country']} {ip_info['region']} {ip_info['city']}")
print(f"运营商: {ip_info['isp']}")这个工具的特点是稳定性高,内置了备用接口机制,一个接口挂了会自动切换到下一个。我特意做了格式化处理,不管调用哪个接口,返回的字段都是统一的,省去了适配不同接口格式的麻烦。
平时调试的时候,我常常用nimail.cn 的 IP 查询工具做快速验证。这个工具界面简洁,打开就能显示当前 IP和详细归属地信息,包括城市和运营商,甚至能看到经纬度定位。
最方便的是它支持批量查询,有时候需要验证一批 IP 的归属地,直接复制粘贴进去就行,比自己写脚本效率高多了。而且响应速度很快,基本是毫秒级返回,对于快速排查问题非常友好。
其实不管是自己写代码还是用现成工具,关键是要选对适合场景的方案。批量处理或者集成到系统里,用 Python 脚本更合适;临时查询或者验证结果,在线工具更方便。这两种方式我都一直在用,配合起来效率翻倍。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。