104 lines
3.4 KiB
Python
104 lines
3.4 KiB
Python
#!/bin/python
|
||
#coding: utf-8
|
||
# +-------------------------------------------------------------------
|
||
# | system: 如意面板 RUYI
|
||
# +-------------------------------------------------------------------
|
||
# | Author: lybbn
|
||
# +-------------------------------------------------------------------
|
||
# | QQ: 1042594286
|
||
# +-------------------------------------------------------------------
|
||
# | Date: 2024-07-03
|
||
# +-------------------------------------------------------------------
|
||
|
||
# ------------------------------
|
||
# IP 归属地
|
||
# ------------------------------
|
||
|
||
import os
|
||
import ipaddress
|
||
from qqwry import QQwry
|
||
from django.conf import settings
|
||
import requests
|
||
|
||
def is_valid_ipv4(ip):
|
||
'''
|
||
@name 是否有效的ipv4地址
|
||
@author lybbn
|
||
@date 2024-07-18
|
||
@param ip地址
|
||
@return True、False
|
||
'''
|
||
try:
|
||
ipaddress.IPv4Address(ip)
|
||
return True
|
||
except ipaddress.AddressValueError:
|
||
return False
|
||
|
||
def get_file_name_from_url(url):
|
||
"""
|
||
@name 使用 os.path.basename() 函数获取 URL 中的文件名
|
||
@author lybbn<2024-02-22>
|
||
"""
|
||
file_name = os.path.basename(url)
|
||
return file_name
|
||
|
||
def download_url_file(url, save_path=""):
|
||
"""
|
||
@name 下载网络文件
|
||
@save_path 下载本地路径名称(包含文件名),为空则默认存储在tmp中
|
||
@author lybbn<2024-02-22>
|
||
"""
|
||
try:
|
||
|
||
if not save_path:
|
||
save_directory = settings.BASE_DIR
|
||
if not os.path.exists(save_directory):
|
||
os.makedirs(save_directory)
|
||
filename = get_file_name_from_url(url)
|
||
save_path = os.path.join(save_directory, filename)
|
||
else:
|
||
save_directory = os.path.dirname(save_path)
|
||
if not os.path.exists(save_directory):
|
||
os.makedirs(save_directory)
|
||
headers = {}
|
||
if os.path.exists(save_path):
|
||
headers['Range'] = 'bytes={}-'.format(os.path.getsize(save_path))
|
||
|
||
with requests.get(url, headers=headers, stream=True) as r:
|
||
with open(save_path, 'ab') as f:
|
||
for chunk in r.iter_content(chunk_size=8192):
|
||
if chunk:
|
||
f.write(chunk)
|
||
|
||
return True,"下载成功"
|
||
except:
|
||
return False,"网络文件错误"
|
||
|
||
class IPQQwry:
|
||
def __init__(self):
|
||
self.qqwry = QQwry()
|
||
QQWRY_FILE_PATH = os.path.join(settings.BASE_DIR,'qqwry.dat')
|
||
if not os.path.exists(QQWRY_FILE_PATH):
|
||
download_url_file("https://raw.gitmirror.com/adysec/IP_database/main/qqwry/qqwry.dat",QQWRY_FILE_PATH)
|
||
self.qqwry.load_file(QQWRY_FILE_PATH)
|
||
|
||
def get_local_ips_area(self,ip_list):
|
||
'''
|
||
@name 本地离线获取ip地址归属地(第一次会触发下载离线库-文件太大20M左右)
|
||
@author lybbn
|
||
@date 2024-07-18
|
||
@param ip_list 类型list ['x.x.x.x']
|
||
@return list ['国家–省份–市')] 处理后
|
||
'''
|
||
results = []
|
||
try:
|
||
for ip in ip_list:
|
||
if is_valid_ipv4(ip):
|
||
result = self.qqwry.lookup(ip)#('国家–省份–市', '移动')
|
||
results.append(result[0])
|
||
else:
|
||
results.append("")
|
||
except:
|
||
results = [""] * (len(ip_list) - len(results))
|
||
return results
|
||
|