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