背景
自己创建文章口令太费脑了,不想使用统一口令,所以……便有了下面。
代码
import random
import string
import json
import os
from datetime import datetime
from typing import Dict, List, Union
# 定义JSON文件的路径
json_file_path = 'test.json'
def generate_random_string(length: int = 6) -> str:
"""
生成指定长度的随机字符串。
参数:
length: 生成的字符串长度,默认为6。
返回:
生成的随机字符串。
"""
return ''.join(random.choices(string.ascii_letters + string.digits, k=length))
def read_existing_data() -> Dict[str, Union[List[Dict[str, str]], Dict[str, str]]]:
"""
读取现有的数据。
返回:
一个字典,包含现有的数据,如果文件不存在或无法解析,则返回空字典。
"""
if os.path.exists(json_file_path):
try:
with open(json_file_path, 'r', encoding='utf-8') as file:
data = json.load(file)
if isinstance(data, dict):
return data
else:
print("警告: JSON 文件的格式不正确,重新创建一个空字典。")
return {}
except json.JSONDecodeError:
print("警告: 无法解析 JSON 文件,重新创建一个空字典。")
return {}
else:
return {}
def get_existing_random_strings(existing_data: Dict[str, Union[List[Dict[str, str]], Dict[str, str]]]) -> set:
"""
获取现有的随机字符串。
参数:
existing_data: 包含现有数据的字典。
返回:
一个包含所有已有随机字符串的集合。
"""
existing_random_strings = set()
for entries in existing_data.values():
if isinstance(entries, list):
for item in entries:
existing_random_strings.add(item['random_string'])
elif isinstance(entries, dict):
existing_random_strings.add(entries['random_string'])
return existing_random_strings
def append_to_existing_name(name: str, random_string: str, timestamp: str) -> None:
"""
将新的随机字符串追加到现有代号的记录中。
参数:
name: 代号。
random_string: 需要追加的随机字符串。
timestamp: 记录的时间戳。
"""
existing_data = read_existing_data()
if name in existing_data:
if isinstance(existing_data[name], list):
existing_data[name].append({
"random_string": random_string,
"timestamp": timestamp
})
else:
existing_data[name] = [existing_data[name], {
"random_string": random_string,
"timestamp": timestamp
}]
else:
existing_data[name] = [{
"random_string": random_string,
"timestamp": timestamp
}]
with open(json_file_path, 'w', encoding='utf-8') as file:
json.dump(existing_data, file, indent=4, ensure_ascii=False)
def generate_unique_string() -> str | None:
"""
生成唯一的随机字符串并追加到记录中。
返回:
生成的唯一字符串,如果操作被取消或失败则返回None。
"""
existing_data = read_existing_data()
name = input("请输入代号: ").strip()
if not validate_name(name):
return
existing_random_strings = get_existing_random_strings(existing_data)
if name in existing_data and not confirm_new_record(name):
print("操作已取消,不会创建新记录。")
return
generate_and_append_string(name, existing_random_strings)
def validate_name(name: str) -> bool:
"""
验证代号是否有效。
参数:
name: 需要验证的代号。
返回:
如果代号有效返回True,否则返回False。
"""
if not name:
print("代号不能为空,请重新输入。")
return False
return True
def confirm_new_record(name: str) -> bool:
"""
确认是否为指定代号创建新记录。
参数:
name: 需要确认的代号。
返回:
如果用户确认创建新记录返回True,否则返回False。
"""
print(f"代号 '{name}' 已存在。")
user_choice = input("是否要为该代号创建新记录?(是/否): ").strip().lower()
return user_choice == '是'
def generate_and_append_string(name: str, existing_random_strings: set) -> str:
"""
生成新的唯一随机字符串并追加到记录中。
参数:
name: 代号。
existing_random_strings: 现有的随机字符串集合。
返回:
生成的唯一随机字符串。
"""
while True:
new_string = generate_random_string()
if new_string not in existing_random_strings:
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
append_to_existing_name(name, new_string, timestamp)
print(f"生成的随机字符: {new_string}")
print(f"记录时间: {timestamp}")
return new_string
if __name__ == "__main__":
generate_unique_string()
效果
初次
请输入代号: 测试1
生成的随机字符: grdUvO
记录时间: 2024-08-19 22:43:12
再次
请输入代号: 测试1
代号 '测试1' 已存在。
是否要为该代号创建新记录?(是/否): 是
生成的随机字符: VK47MD
记录时间: 2024-08-19 22:41:16
取消
请输入代号: 测试1
代号 '测试1' 已存在。
是否要为该代号创建新记录?(是/否): 否
操作已取消,不会创建新记录。
新建
请输入代号: 测试2
生成的随机字符: GYHKKu
记录时间: 2024-08-19 22:43:12
JSON预览
测试1、测试2可看作文章名
{
"测试1": [
{
"random_string": "grdUvO",
"timestamp": "2024-08-19 22:41:05"
},
{
"random_string": "VK47MD",
"timestamp": "2024-08-19 22:41:16"
}
],
"测试2": [
{
"random_string": "GYHKKu",
"timestamp": "2024-08-19 22:43:12"
}
]
}
后记
不覆盖记录是为了方便后悔,我的历史记录可不能随便删。
评论区