本文为在实际工作中需要使用IP来源查询而整理的小工具。已正常运行使用1个月以上。文章假设当前面对的是一台刚安装好Linux系统全新服务器【虚拟机或真实的服务器均可】,从部署环境开始分享全部实践过程。
一、实践环境:
Linux centOS服务器;
Docker:Docker version 20.10.23, build 7155243
Python10:3.10
二、实现方式:
因大多数在线查询网站有数量等限制或API收费,因此经过实践最终采用方式是使用“纯真”离线IP库方式实现,该库每周更新1次,可以在实现了代码后,只更新IP库文件qqwry.dat即可。本实践中已集成当前最新版本的库,最新版本的库可纯真官网www.cz88.net获取。
注:根据实践此离线方式已能满足绝大多数情况下使用。如果对实时精度要求高则请忽略【有IP无对应供应商,可能会显示供应商为CZ88.NET的情况。】
三、使用Python实现IP查询
Python中使用纯真IP离线库,需要安装库qqwry(Python3中安装qqwry-py3):
pip install qqwry-py3
3.1、实现IP简单查询的demo:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import io
from qqwry import QQwry
from qqwry import updateQQwry
#离线库,在本Python的相同目录下
IPDB_FILE = "qqwry.dat"
def test(ip):
q = QQwry()
q.load_file(IPDB_FILE)
res = q.lookup(ip.strip())
#print(type(res))
print("IP:{:17}==> 归属地:{}, 运营商:{}".format(ip,res[0],res[1]))
if __name__ == "__main__":
test("127.0.0.1")
test("117.67.111.197")
测试结果:
3.2、在Linux服务器实现读取文档后批量查询:
在服务器中,查询IP的执行文件所在目录结构:
批量待查IP清单为txt文件格式,每行一个IP:
批量待查IP结果为txt文件格式:
实现代码:
程序从同目录下的temp文件夹下,读取“当天日期_IP.txt”的文件(例如20230104_IP.txt),进行批量查询,查询后的结果保存到ipsource文件夹下当天日期的txt文档,例如:IPsource_20230104.txt
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import io
from qqwry import QQwry
from qqwry import updateQQwry
##--注意实际环境和测试环境可能不同
## ---生产环境配置----
PYTHON_HOME = "/home/python_home/"
IPDB_FILE = PYTHON_HOME + "qqwry.dat"
## ---本地测试环境----
##IPDB_FILE = "qqwry.dat"
##PYTHON_HOME = "./"
def getIPsource(IPlist):
q = QQwry()
q.load_file(IPDB_FILE)
time_start = time.time() # 开始工作时间
IPsources = []
for ip in IPlist:
ip = ip.strip()
print("当前查询的IP是:{}".format(ip))
try:
res = q.lookup(ip)
tempInfo = "IP:{:17}==>归属地:{}, 运营商:{}".format(ip,res[0],res[1])
except:
tempInfo = "IP:{:17}==>归属地:{}, 运营商:{}".format(ip,"错误IP","错误IP")
print(tempInfo)
IPsources.append(tempInfo)
time_end = time.time() # 查询完成的时间
print("查询的IP数:{},查询耗时(s):{}".format(len(IPsources),(time_end - time_start)) )
return IPsources
def saveIPsource(IPsources, filename=""):
## 将IP源信息保存到同目录下的ipsource/文件夹,文件名以当天日期为名字
if filename=="":
filename = PYTHON_HOME + "ipsource/IPsource_" + time.strftime("%Y%m%d", time.localtime())+".txt"
with io.open(filename, 'w', encoding='utf8') as f:
for line in IPsources:
f.write(line + "\n")
f.close()
print("Save IPsources successed!")
if __name__ == "__main__":
today = time.strftime("%Y%m%d", time.localtime())
iplistfile = PYTHON_HOME + "temp/"+today + "_IP.txt"
with open(iplistfile, "r") as f:
IPlist = f.readlines()
IPsources = getIPsource(IPlist)
ipsourcefile = PYTHON_HOME + "ipsource/IPsource_"+today+".txt"
saveIPsource(IPsources, ipsourcefile)
四、Linux中部署实现
4.1、docker环境安装
4.1.1、安装社区版本的docker:
yum install docker-ce docker-ce-cli containerd.io
安装成功后,可以使用版本查询命令:docker version 确认是否成功,出现类似下图信息则安装成功:
4.1.2、启动docker
systemctl start docker
4.2、在docker中安装、运行Python容
docker环境安装成功后,进行Python环境安装。
因为本实践操作需要使用一些库,因此将当前已安装相关库的Python镜像导出供实践中直接导入使用。本实践Python镜像下载地址:
链接:https://pan.baidu.com/s/1obscDSCg-B-QAe9GaB5cNQ?pwd=4wwh
提取码:4wwh
4.2.1、将Python镜像上传到服务器
在Linux服务器根目录下创建tools文件夹,将已下载的Python镜像上传到此文件夹。
4.2.2、导入镜像
使用指令:
docker load -i /tools/python310.tar
4.2.3、从镜像创建Python容器
查看当前已有镜像: docker images
创建并以后台守护模式启动一个名字为Python的容器:
为该Python容器在本地的/opt目录创建文件夹dkhome_python,作为docker容器在服务器上的映射点,对应容器内的位置为" /home/python_home.
【只需要按要求创建文件夹,执行指令即可】
docker run -itd --name python -v /opt/dkhome_python:/home/python_home python:3.10
查看当前启动的docker容器: docker ps
当前已可以看见启动了的容器,ID号为:4b41aea77bbc
4.3、使用Python容器查询IP
首先将脚本及依赖库文件:getIPsource.py、qqwry.dat,上传到容器映射在本地服务器的位置:/opt/dkhome_python,在temp文件夹下放置待查的IP清单文件。
4.3.1、脚本执行方式:
在服务器根目录,创建rxshell文件夹,创建脚本:getIPsource.sh:
#!/bin/bash
# 执行Python脚本,查询IP源信息。
# 日志文件
logfile="/rxshell/getIP.log"
echo $(date +"%Y-%m-%d %H:%M:%S")":执行getIPsource.sh --> 准备获取IP源脚本..." >> $logfile
docker restart python && docker exec python python /home/python_home/getIPsource.py
echo $(date +"%Y-%m-%d %H:%M:%S")":执行getIPsource.sh --> 获取IP源脚本成功!" >> $logfile
为getIPsource.sh增加执行权限:
sudo chmod +x /rxshell/getIPsource.sh
进入到rxshell目录: cd /rxshell
执行脚本: ./getIPsource.sh
即可在/opt/dkhome_python/source文件夹下得到查询结果文件。
4.3.2、容器交互模式执行方式:
进入/opt/dkhome_python文件夹: cd /opt/dkhome_python/
进入名字为Python的容器:
docker exec -it python /bin/bash
显示结果:
在交互页面中,进入Python容器的挂载点(4.2.3中执行指令时,指定的容器内的挂载点),
cd /home/python_home,
执行Python脚本: python getIPsource.py
执行结果如下:
完成后,退出容器交互式对话模式,使用exit 命令即可:
成功退出后,系统自动返回到进入容器前的目录点。