前言
在创建新账号时总会遇到密码问题,好记安全性又高的密码又不是很好想,很耽误时间,用诗词、名言警句或者座右铭啥的转成密码就很好记。在网上搜索合适诗句的时候,发现已经有人总结的比较全了 。于是参考着实现了一下,整个代码都很ez,可以自定义。
步骤很简单:
- 去除诗句中的标点
- 中文转拼音(基于xpinyin)
- 取拼音首字母,并把行首的拼音首字母大写
- 特殊字符处理
代码
from xpinyin import Pinyin
# from icecream import ic
def Poetry_to_password(poetry):
# 转拼音首字母
p = Pinyin()
py = p.get_initials(poetry, '')
py = py.capitalize()
# 找到非字母字符所在位置
symbol = []
for i, c in enumerate(py):
if not c.isalpha():
symbol.append(i)
# 删除非字母字符
if symbol:
npy = py[:symbol[0]]
npoetry = poetry[:symbol[0]]
for i in range(1, len(symbol)):
npy += py[symbol[i - 1] + 1:symbol[i]].capitalize()
npoetry += poetry[symbol[i - 1] + 1:symbol[i]]
npy += py[symbol[- 1] + 1:].capitalize()
npoetry += poetry[symbol[- 1] + 1:]
else:
npy = py
npoetry = poetry
# 特殊字符识别处理
password = Special_character(npoetry, npy)
return password
def Special_character(npoetry, npy):
# 特殊字符识别处理
password = list(npy)
p = Pinyin()
py_all = p.get_pinyin(npoetry, tone_marks='marks')
py_all = py_all.split('-')
for i, y in enumerate(py_all):
if y in ['líng', 'lín', 'lin', 'ling']:
password[i] = '0'
elif y in ['yī', 'yi']:
password[i] = '1'
elif y in ['èr', 'er']:
password[i] = '2'
elif y in ['sān', 'shān', 'san', 'shan']:
password[i] = '3'
elif y in ['sì', 'shì', 'si', 'shi']:
password[i] = '4'
elif y in ['wǔ', 'wú', 'wu', 'wǒ']:
password[i] = '5'
elif y in ['liù', 'niù']:
password[i] = '6'
elif y in ['qī', 'qi', 'xī', 'xi']:
password[i] = '7'
elif y in ['bā', 'ba']:
password[i] = '8'
elif y in ['jiǔ', 'jiu']:
password[i] = '9'
elif y in ['jiā']:
password[i] = '+'
elif y in ['jiǎn']:
password[i] = '-'
elif y in ['shù', 'sù']:
password[i] = '|'
for i, y in enumerate(npoetry):
if y in ['云', '水', '雨', '风', '浪', '丝', '波']:
password[i] = '~'
elif y in ['未', '不', '惊', '叹', '无']:
password[i] = '!'
elif y in ['圈']:
password[i] = '@'
elif y in ['井', '网']:
password[i] = '#'
elif y in ['刀']:
password[i] = '$'
elif y in ['百', '白']:
password[i] = '%'
elif y in ['上', '高']:
password[i] = '^'
elif y in ['和', '兼', '且']:
password[i] = '&'
elif y in ['星', '乘', '日', '花', '雪']:
password[i] = '*'
elif y in ['下', '低', '底']:
password[i] = '_'
elif y in ['十']:
password[i] = '+'
elif y in ['等']:
password[i] = '='
elif y in ['大']:
password[i] = '>'
elif y in ['小']:
password[i] = '<'
elif y in ['斜', '除']:
password[i] = '/'
elif y in ['问', '谁', '孰', '何']:
password[i] = '?'
pw = ''
for i, c in enumerate(password):
pw += c
return pw
效果
调用:
password = Poetry_to_password(poetry)
示例1:
'不到长城非好汉,屈指行程二万。' -> !dccfhhQzxc2w
示例2:
'晚来天欲雪,能饮一杯无?' -> Wlty*Ny1b!
示例3:
'万般皆是命,半点不由人。' -> Wbj4mBd!yr
链接
参考这篇文章实现,这篇文章总结挺全,想法也挺好,比如补刀和通过声调来解决没有特殊字符和数字的问题,很有意思。我没有完全照着实现,只实现了基本的转换,一般情况够用了。
文章:
https://github.com/bingoohuang/blog/issues/22
实现:
https://github.com/Anonymous772066235/LittleTasks/blob/main/Poetry_to_password