import random
import string
import keyring
class MyPasswd:
"""生成随机密码"""
app_names = {}
@classmethod
def _set_password(cls, servicename, username, sample_content, passwd_num):
"""设置密码:param servicename: 应用名:param username: 用户名:param sample_content: 用于生成随机密码的样本字符:param passwd_num: 生成密码位数:return:"""
# 密码的位数必须为正整数
if isinstance(passwd_num, int) and passwd_num > 0:
one_list = random.choices(sample_content, k=passwd_num)
password = ''.join(one_list)
# 设置密码
keyring.set_password(servicename, username, password)
names_list = cls.app_names.get(servicename, [])
names_list.append(username)
cls.app_names[servicename] = names_list
else:
raise TypeError('密码的位数必须为正整数!')
@classmethod
def generate_random_passwd(cls, servicename, username, passwd_num=6):
"""生成随机密码, 可以为数字、字母、标点符号:param servicename: 应用名:param username: 用户名:param passwd_num: 密码位数, 为int类型:return:"""
sample_content = string.ascii_letters + string.digits + string.punctuation
cls._set_password(servicename, username, sample_content, passwd_num)
@classmethod
def generate_digit_passwd(cls, servicename, username, passwd_num=6):
"""生成随机的仅数字密码:param servicename: 应用名:param username: 用户名:param passwd_num: 密码位数, 为int类型:return:"""
sample_content = string.digits
cls._set_password(servicename, username, sample_content, passwd_num)
@classmethod
def generate_letter_passwd(cls, servicename, username, passwd_num=6):
"""生成随机的仅字母密码:param servicename: 应用名:param username: 用户名:param passwd_num: 密码位数, 为int类型:return:"""
sample_content = string.ascii_letters
cls._set_password(servicename, username, sample_content, passwd_num)
@classmethod
def generate_digit_letter_passwd(cls, servicename, username, passwd_num=6):
"""生成随机的仅字母和数字密码:param servicename: 应用名:param username: 用户名:param passwd_num: 密码位数, 为int类型:return:"""
sample_content = string.ascii_letters + string.digits
cls._set_password(servicename, username, sample_content, passwd_num)
@staticmethod
def get_password(servicename, username):
"""获取某个应用下指定用户名的密码:param servicename: 应用名:param username: 用户名:return:"""
return keyring.get_password(servicename, username)
@staticmethod
def delete_password(self, servicename, username):
"""删除账号:param self::param servicename: 应用名:param username: 用户名:return:"""
return keyring.delete_password(servicename, username)
@classmethod
def get_all_servicenames(cls):
"""获取所有的应用:return: 所有应用组成的列表"""
return list(cls.app_names.keys())
@classmethod
def get_all_acount_by_servicename(cls, servicename):
"""获取指定应用下的所有账户名:return: 指定应用下的所有账户名组成的列表"""
return cls.app_names.get(servicename)
@classmethod
def get_password_by_username(cls, username):
"""通过用户名获取密码:return: 获取这个用户的所有密码"""
one_list = []
for service_name in cls.get_all_servicenames():
for name in cls.app_names[service_name]:
if name == username:
try:
passwd = keyring.get_password(service_name, name)
except Exception:
continue
one_list.append({
service_name: passwd
})
return one_list
if __name__ == '__main__':
MyPasswd.generate_random_passwd('myapi', 'user1', 10)
MyPasswd.generate_random_passwd('myapi', 'user2', 20)
MyPasswd.generate_digit_passwd('apitest', 'user1', 8)
MyPasswd.generate_digit_passwd('apitest', 'user2', 13)
MyPasswd.generate_digit_letter_passwd('myapi', 'user3', 15)
MyPasswd.generate_digit_letter_passwd('apitest', 'user4', 18)
print(MyPasswd.get_password_by_username('user1'))
print(MyPasswd.app_names)