#! /usr/bin/env python
# -*- coding: utf-8 -*-
try:
from string import digits, ascii_uppercase, ascii_lowercase
from random import choice, randint, shuffle
from re import search
from os import system, name, sys
from time import sleep
from colorama import Fore, Back, Style
except ImportError as err:
exit(err)
# sudo apt install python3-pip
# pip3 install colorama
"""
The result has at least:
- Total of 12 symbol
- One symbol of uppercase letter
- Random symbol of ascii_lowercase
- Random number of digits
- Maximum of three identical characters in a row
"""
def logo():
"""
Text to ASCII:
http://patorjk.com/software/taag/#p=display&f=Graffiti&t=Type%20Something%20
"""
logo = [Fore.RED + "",
" ██▓███ ▄▄▄ ██████ ██████ ▄████ ▓█████ ███▄ █ ",
" ▓██░ ██▒▒████▄ ▒██ ▒ ▒██ ▒ ██▒ ▀█▒▓█ ▀ ██ ▀█ █ ",
" ▓██░ ██▓▒▒██ ▀█▄ ░ ▓██▄ ░ ▓██▄ ▒██░▄▄▄░▒███ ▓██ ▀█ ██▒",
" ▒██▄█▓▒ ▒░██▄▄▄▄██ ▒ ██▒ ▒ ██▒░▓█ ██▓▒▓█ ▄ ▓██▒ ▐▌██▒",
" ▒██▒ ░ ░ ▓█ ▓██▒▒██████▒▒▒██████▒▒░▒▓███▀▒░▒████▒▒██░ ▓██░",
" ▒▓▒░ ░ ░ ▒▒ ▓▒█░▒ ▒▓▒ ▒ ░▒ ▒▓▒ ▒ ░ ░▒ ▒ ░░ ▒░ ░░ ▒░ ▒ ▒ ",
" ░▒ ░ ▒ ▒▒ ░░ ░▒ ░ ░░ ░▒ ░ ░ ░ ░ ░ ░ ░░ ░░ ░ ▒░",
" ░░ ░ ▒ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ",
" ░ ░ ░ ░ ░ ░ ░ ░ ",
"" + Style.RESET_ALL,
]
for i in range(len(logo)):
sleep(0.2)
print(logo[i])
def count_range():
""" Функция определяет желаемое количество сгенерированных паролей. """
while True:
count = input(Fore.CYAN + "{0:60}: ".format("Задайте желаемое количество сгенерированных паролей", end = '') + Style.RESET_ALL)
if count == "":
print(u"Прекращаю работу программы.")
raise SystemExit
if not count.isdigit(): # Если строка не состоит из цифр
print(u"Необходимо ввести число, а не строку.")
continue
if int(count) == 0:
print(u"Количество паролей не может равняться нулю.")
continue
if int(count) < 0:
print(u"Количество паролей не может быть отрицательным.")
continue
else:
count = int(count)
break
return count
def length_all_pass():
""" Функция определяет общую длину пароля. """
while True:
min_length = input(Fore.YELLOW + "{0:60}: ".format("Введите минимальную длину пароля", end = '') + Style.RESET_ALL) # Минимальная длина пароля
if not min_length.isdigit():
print("Необходимо ввести число, а не строку. ")
continue
if min_length < '0':
print(u"Минимальная длина пароля не может быть отрицательной.")
continue
if min_length == '0':
print(u"Минимальная длина пароля не может равняться нулю.")
continue
max_length = input(Fore.YELLOW + "{0:60}: ".format("Введите максимальную длину пароля", end = '') + Style.RESET_ALL) # Максимальная длина пароля
if int(max_length) < int(min_length):
print("Максимальное значение не должно превышать минимального.")
continue
if not max_length.isdigit():
print("Значение должно быть цифрой.")
continue
if max_length < '0':
print(u"Максимальная длина пароля не может быть отрицательной.")
continue
if max_length == '0':
print(u"Максимальная длина пароля не может равняться нулю.")
continue
else:
min_length = int(min_length)
max_length = int(max_length)
global length_all_passwd
length_all_passwd = randint(min_length, max_length)
break
return length_all_passwd
def pass_ascii_uppercase():
""" Функция формирует часть пароля, состоящая из букв верхнего регистра """
while True:
global length_ascii_uppercases # Количество (длина) букв верхнего регистра в пароле
length_ascii_uppercases = input(Fore.RED + "{0:60}: ".format("Введите количество знаков - букв верхнего регистра", end = '') + Style.RESET_ALL)
if length_ascii_uppercases == "exit":
print(u"Прекращаю работу программы.")
raise SystemExit
if length_ascii_uppercases < '0':
print(u"Вводимое значение не может быть отрицательным.")
continue
if not length_ascii_uppercases.isdigit():
print(u"Необходимо ввести число, а не строку.")
continue
if int(length_ascii_uppercases) > length_all_passwd:
print(u"Вводимое значение превышает длину пароля.")
continue
else:
length_ascii_uppercases = int(length_ascii_uppercases)
break
if length_ascii_uppercases >= 1:
ascii_uppercase_result = list()
for x in range(length_ascii_uppercases):
symbol = choice(ascii_uppercase)
ascii_uppercase_result.append(symbol)
global pass_ascii_uppercases
pass_ascii_uppercases = "".join(ascii_uppercase_result)
else:
pass_ascii_uppercases = ''
return pass_ascii_uppercases
def pass_ascii_lowercase():
""" Функция формирует часть пароля. состоящая из букв нижнего регистра """
global length_ascii_lowercases # Kоличество букв нижнего регистра в будущем пароле
length_ascii_lowercases = randint(0, length_all_passwd - length_ascii_uppercases)
if length_ascii_lowercases >= 1:
ascii_lowercase_result = list()
for x in range(length_ascii_lowercases):
symbol = choice(ascii_lowercase)
ascii_lowercase_result.append(symbol)
global pass_ascii_lowercases
pass_ascii_lowercases = "".join(ascii_lowercase_result)
else:
pass_ascii_lowercases = ''
return pass_ascii_lowercases
def pass_digit():
""" Функция формирует цифровую составляющую пароля. """
length_digits = length_all_passwd - length_ascii_lowercases - length_ascii_uppercases
if length_digits >= 1:
digit_result = list()
for x in range(length_digits):
symbol = choice(digits) # Случайная цифра
digit_result.append(symbol) # Добавляем в пароль
global pass_digits
pass_digits = "".join(map(str, digit_result))
else:
pass_digits = ''
return pass_digits
def shuffle_passwd(s):
""" Функция для перемешивания символов в пароле и проверки соответствия условиям задания"""
s = list(s)
while True:
shuffle(s)
p = ''.join(s)
if ' ' in p: continue # Hикаких пробелов вместе
if p.startswith(' ') or p.endswith(' '): continue # Hе может начинаться или заканчиваться пробелом
if search(r"(.)" + r"\1" * (3 - 1), p): continue # Hе более трёх одинаковых символов подряд
return p
#Main
def main():
system(['clear', 'cls'][name == sys.platform]) # Очистка консоли
logo() # Логотип
length_all_passwd = length_all_pass() # Переменная = длина всего пароля
pass_part1 = pass_ascii_uppercase() # Часть пароля, состоящая из букв верхнего регистра
pass_part2 = pass_ascii_lowercase() # Часть пароля. состоящая из букв нижнего регистра
pass_part3 = pass_digit() # Часть пароля, состоящая из цифр
for i in range(count_range()): # Цикл формирующий список паролей
passwd = pass_part1 + pass_part2 + pass_part3
print(shuffle_passwd(passwd)) # Распечатка перемешанных паролей
print(Back.RED + "Bye-bye!" + Style.RESET_ALL) # Што-Та НИпАнЯтНА
if __name__ == "__main__":
main()