February 26, 2020

Генератор паролей

Переведено с гоблинского на нашенский

WIN

Начнём как обычно с импорта зависимостей. Т.К. эта статья для винды то и импортить мы будем либу для оповещений под винду.

import random
from win10toast import ToastNotifier
import pyperclip
from datetime import datetime
import keyboard

Установка:

pip install keyboard
pip install win10toast
pip install pyperclip

После установки всего необходимого мы создадим функцию генерации паролей:

def random4ik():
    pas = random.choice(list("1234567890abcdfghigklmnopqrstuvyxwzABCDFGHIGKMNOPQRSTUVYXWZ"))
    for x in range(36): 
        pas = pas + random.choice(list("!@#$%^&*()_+-1234567890abcdefghigklmnopqrstuvyxwzABCDEFGHIGKLMNOPQRSTUVYXWZ1234567890!@#$%^&*()_+-"))
    return pas

Итак, random.choice выберет первый символ нашего пароля, затем он передаст его дальше в цикл, в цикле мы будет складывать буквы по одной. то есть - каждый проход цикла будет добавлять один случайный символ к нашей строке. Символы вы можете заменить на свои, вставить символы которых нет на клавиатуре для более сложного пароля. По итогу функция нам возвращает рандомную строку размером - 36 символов.

Затем идёт функция которая записывает пароль в файл, добавляет в буфер обмена и выдаёт оповещение.

def pass_gen():
 f = open("pass_log.txt", "a")
 random_pass = random4ik()
 print(random_pass)
 pyperclip.copy(random_pass)
 toaster = ToastNotifier()
 toaster.show_toast("Пароль скопирован в буфер обмена", str(random_pass), icon_path="1.ico", duration=2)
 f.write(f"======== {str(datetime.now(tz=None))[:-7]} ========\n\n{random_pass}\n\n")
 return random_pass

Тут всё довольно таки просто. Сначала мы открываем файл на дозапись, чему соответствует атрибут "а", затем записываем нашу функцию рандома в переменную. Далее вы выводим наш рандомный пароль в консоль, далее с помощью pyperclip.copy мы заносим его в буфер обмена, затем создаем нотификатор (оповещение) что пароль был скопирован в буфер обмена и сам пароль. Так же - вы можете добавить свою иконку и длительность оповещения. Затем мы записываем это всё в файл и возвращаем рандомный пароль, это нам будет нужно для другой функции.

Выглядит нотификация вот так:

Иконку вы можете добавить свою. Как видите - принимает либа .ico файлы. Далее будет функция которую по сути можно было бы и не делать. Она будет вставлять за нас наш текст из буфера обмена.

def paste_pass(text):
 keyboard.write(text)

Она принимает в себя аргумент text, далее с помощью библиотеки keyboard она его печатает на клавиатуре.

Ну и самая главная функция:

if __name__ == '__main__':
 print("STARTED")
 keyboard.add_hotkey('Ctrl + 1', pass_gen)
 keyboard.add_hotkey('Ctrl + 2', lambda : paste_pass(pass_gen())) 
 keyboard.wait('Ctrl + Q')

Хотеки вы можете выставить свои, думаю тут не надо много объяснять, сначала выводим что программа запустилась, затем ждём сочетания клавишь, при нажатии на ctrl + Q программа закроется. Вы можете поменять хоткеи. При нажатии на ctrl + 1 будет сгенерирован пароль. При сочетании ctrl + 2 будет вызвана лямбда функция которая вставит наш пароль на место курсора.

Чутка больше про Лямба функции:

Информация с сайта : https://pythonworld.ru/tipy-dannyx-v-python/vse-o-funkciyax-i-ix-argumentax.html

Чуть не забыл, сам файл pass_log.txt:

Ну и полный листинг программы:

import random
from win10toast import ToastNotifier
import pyperclip
from datetime import datetime
import keyboard

def random4ik():
    pas = random.choice(list("1234567890abcdfghigklmnopqrstuvyxwzABCDFGHIGKMNOPQRSTUVYXWZ"))
    for x in range(36): 
        pas = pas + random.choice(list("!@#$%^&*()_+-1234567890abcdefghigklmnopqrstuvyxwzABCDEFGHIGKLMNOPQRSTUVYXWZ1234567890!@#$%^&*()_+-"))
    return pas

def pass_gen():
 f = open("pass_log.txt", "a")
 random_pass = random4ik()
 print(random_pass)
 pyperclip.copy(random_pass)
 toaster = ToastNotifier()
 toaster.show_toast("Пароль скопирован в буфер обмена", str(random_pass), icon_path="1.ico", duration=2)
 f.write(f"======== {str(datetime.now(tz=None))[:-7]} ========\n\n{random_pass}\n\n")
 return random_pass

def paste_pass(text):
 keyboard.write(text)

if __name__ == '__main__':
 print("STARTED")
 keyboard.add_hotkey('Ctrl + 1', pass_gen)
 keyboard.add_hotkey('Ctrl + 2', lambda : paste_pass(pass_gen())) 
 keyboard.wait('Ctrl + Q')
Мой код не идеален, я пишу костыли, вы всегда можете написать лучше и модифицировать мой код

Linux

Начнём с импорта зависимостей.

from pynput import keyboard
import random
import notify2
import pyautogui
import pyperclip
import time
from datetime import datetime

Скрипт был проверен на новой Убунту disco django.

После импортов нам надо создать нотификатор:

notify2.init('Password Generator')

Затем идёт код функции рандома:

def random4ik():
    pas = random.choice(list("1234567890abcdfghigklmnopqrstuvyxwzABCDFGHIGKMNOPQRSTUVYXWZ"))
    for x in range(36): 
        pas = pas + random.choice(list("!@#$%^&*()_+-1234567890abcdefghigklmnopqrstuvyxwzABCDEFGHIGKLMNOPQRSTUVYXWZ1234567890!@#$%^&*()_+-"))
    return pas

Итак, random.choice выберет первый символ нашего пароля, затем он передаст его дальше в цикл, в цикле мы будет складывать буквы по одной. то есть - каждый проход цикла будет добавлять один случайный символ к нашей строке. Символы вы можете заменить на свои, вставить символы которых нет на клавиатуре для более сложного пароля. По итогу функция нам возвращает рандомную строку размером - 36 символов.

Затем идёт функция которая записывает пароль в файл, добавляет в буфер обмена и выдаёт оповещение.

def pass_gen():
    f = open("pass_log.txt", "a")
    random_pass = random4ik()
    print(random_pass)
    pyperclip.copy(str(random_pass))
    n = notify2.Notification('Password ready', str(random_pass))
    n.show()
    f.write(f"======== {str(datetime.now(tz=None))[:-7]} ========\n\n{random_pass}\n\n")
    return random_pass

Тут всё довольно таки просто. Сначала мы открываем файл на дозапись, чему соответствует атрибут "а", затем записываем нашу функцию рандома в переменную. Далее вы выводим наш рандомный пароль в терминал, далее с помощью pyperclip.copy мы заносим его в буфер обмена, затем создаем нотификатор (оповещение) что пароль был скопирован в буфер обмена и сам пароль, после чего показываем оповещение. Затем мы записываем это всё в файл и возвращаем рандомный пароль, это нам будет нужно для другой функции.

Далее будет функция которую по сути можно было бы и не делать. Она будет вставлять за нас наш текст из буфера обмена.

Она принимает в себя аргумент text, далее с помощью библиотеки pyautogui она его печатает на клавиатуре. Задержка нужна, необходима для корректной работы. А вот и сама функция в 2 строки:

def paste_pass(text):
    time.sleep(0.15)
    pyautogui.typewrite(text)

Затем идут хоткеи

COMBINATION = {keyboard.Key.ctrl,keyboard.Key.alt, keyboard.KeyCode.from_char('a')}
COMBINATION2 = {keyboard.Key.ctrl, keyboard.Key.alt, keyboard.KeyCode.from_char('e')}

current = set()

Тут мы задаём нужные нам хоткеи, как их правильно задавать вы можете посмотреть на сайте проекта keyboard https://pypi.org/project/keyboard/

Ну и код я брал вот от сюда:

https://github.com/moses-palmer/pynput/issues/20#issuecomment-348675059

Затем идёт функция которая отлавливает нажатия на хоткеи:

def on_press(key):
    if key in COMBINATION:
        current.add(key)
        if all(k in current for k in COMBINATION):
            pass_gen()
    elif key in COMBINATION2:
        current.add(key)
        if all(k in current for k in COMBINATION2):
            paste_pass(pass_gen())

Её мы будем запускать через цикл with. В функции мы проверяем сочетания клавиш которые были нажаты. Сверяем их со списком. Ну и соответственно исходя из хоткея - выполняем действия. Далее идёт функция из документации.

def on_release(key):
    try:
        current.remove(key)
    except KeyError:
        pass

Она просто тут должна быть. Проверяет клавиши и удаляет если не наш хоткей.

Ну и наконец самые главные 2 строки которые запускают сие чудо

with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()

Видео как это работает можете посмотреть вот тут:

https://radikal.ru/video/RxrFhLSX5cR

А теперь полный листинг программы:

from pynput import keyboard
import random
import notify2
import pyautogui
import pyperclip
import time
from datetime import datetime

notify2.init('Password Generator')

def random4ik():
    pas = random.choice(list("1234567890abcdfghigklmnopqrstuvyxwzABCDFGHIGKMNOPQRSTUVYXWZ"))
    for x in range(36): 
        pas = pas + random.choice(list("!@#$%^&*()_+-1234567890abcdefghigklmnopqrstuvyxwzABCDEFGHIGKLMNOPQRSTUVYXWZ1234567890!@#$%^&*()_+-"))
    return pas

def pass_gen():
    f = open("pass_log.txt", "a")
    random_pass = random4ik()
    print(random_pass)
    pyperclip.copy(str(random_pass))
    n = notify2.Notification('Password ready', str(random_pass))
    n.show()
    f.write(f"======== {str(datetime.now(tz=None))[:-7]} ========\n\n{random_pass}\n\n")
    return random_pass


def paste_pass(text):
    time.sleep(0.15)
    pyautogui.typewrite(text)

COMBINATION = {keyboard.Key.ctrl,keyboard.Key.alt, keyboard.KeyCode.from_char('a')}
COMBINATION2 = {keyboard.Key.ctrl, keyboard.Key.alt, keyboard.KeyCode.from_char('e')}

current = set()

def on_press(key):
    if key in COMBINATION:
        current.add(key)
        if all(k in current for k in COMBINATION):
            pass_gen()
    elif key in COMBINATION2:
        current.add(key)
        if all(k in current for k in COMBINATION2):
            paste_pass(pass_gen())

def on_release(key):
    try:
        current.remove(key)
    except KeyError:
        pass

with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()