121 lines
3.1 KiB
Python
121 lines
3.1 KiB
Python
# @Time : 2023/8/13 19:54
|
||
# @Author : Lan
|
||
# @File : utils.py
|
||
# @Software: PyCharm
|
||
import datetime
|
||
import hashlib
|
||
import os
|
||
import random
|
||
import re
|
||
import string
|
||
import time
|
||
from core.settings import settings
|
||
|
||
|
||
async def get_random_num():
|
||
"""
|
||
获取随机数
|
||
:return:
|
||
"""
|
||
return random.randint(10000, 99999)
|
||
|
||
|
||
r_s = string.ascii_uppercase + string.digits
|
||
|
||
|
||
async def get_random_string():
|
||
"""
|
||
获取随机字符串
|
||
:return:
|
||
"""
|
||
return "".join(random.choice(r_s) for _ in range(5))
|
||
|
||
|
||
async def get_now():
|
||
"""
|
||
获取当前时间
|
||
:return:
|
||
"""
|
||
return datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=8)))
|
||
|
||
|
||
async def get_select_token(code: str):
|
||
"""
|
||
获取下载token
|
||
:param code:
|
||
:return:
|
||
"""
|
||
token = settings.admin_token
|
||
return hashlib.sha256(
|
||
f"{code}{int(time.time() / 1000)}000{token}".encode()
|
||
).hexdigest()
|
||
|
||
|
||
async def get_file_url(code: str):
|
||
"""
|
||
对于需要通过服务器中转下载的服务,获取文件下载地址
|
||
:param code:
|
||
:return:
|
||
"""
|
||
return f"/share/download?key={await get_select_token(code)}&code={code}"
|
||
|
||
|
||
async def max_save_times_desc(max_save_seconds: int):
|
||
"""
|
||
获取最大保存时间的描述
|
||
:param max_save_seconds:
|
||
:return:
|
||
"""
|
||
|
||
def gen_desc_zh(value: int, desc: str):
|
||
if value > 0:
|
||
return f"{value}{desc}"
|
||
else:
|
||
return ""
|
||
|
||
def gen_desc_en(value: int, desc: str):
|
||
if value > 0:
|
||
ret = f"{value} {desc}"
|
||
if value > 1:
|
||
ret += "s"
|
||
ret += " "
|
||
return ret
|
||
else:
|
||
return ""
|
||
|
||
max_timedelta = datetime.timedelta(seconds=max_save_seconds)
|
||
desc_zh, desc_en = "最长保存时间:", "Max save time: "
|
||
desc_zh += gen_desc_zh(max_timedelta.days, "天")
|
||
desc_en += gen_desc_en(max_timedelta.days, "day")
|
||
desc_zh += gen_desc_zh(max_timedelta.seconds // 3600, "小时")
|
||
desc_en += gen_desc_en(max_timedelta.seconds // 3600, "hour")
|
||
desc_zh += gen_desc_zh(max_timedelta.seconds % 3600 // 60, "分钟")
|
||
desc_en += gen_desc_en(max_timedelta.seconds % 3600 // 60, "minute")
|
||
desc_zh += gen_desc_zh(max_timedelta.seconds % 60, "秒")
|
||
desc_en += gen_desc_en(max_timedelta.seconds % 60, "second")
|
||
return desc_zh, desc_en
|
||
|
||
|
||
async def sanitize_filename(filename: str) -> str:
|
||
"""
|
||
安全处理文件名:
|
||
1. 剥离路径只保留文件名
|
||
2. 替换非法字符
|
||
3. 处理空文件名情况
|
||
"""
|
||
filename = os.path.basename(filename)
|
||
illegal_chars = r'[\\/*?:"<>|\x00-\x1F]' # 包含控制字符
|
||
# 替换非法字符为下划线
|
||
cleaned = re.sub(illegal_chars, '_', filename)
|
||
# 处理空格(可选替换为_)
|
||
cleaned = cleaned.replace(' ', '_')
|
||
# 处理连续下划线
|
||
cleaned = re.sub(r'_+', '_', cleaned)
|
||
# 处理首尾特殊字符
|
||
cleaned = cleaned.strip('._')
|
||
# 处理空文件名情况
|
||
if not cleaned:
|
||
cleaned = 'unnamed_file'
|
||
# 长度限制(按需调整)
|
||
return cleaned[:255]
|