2025-03-17 18:06:54 +08:00

104 lines
3.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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