首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Python 3个保存键盘输入记录的方法

Python 3个保存键盘输入记录的方法

作者头像
用户11081884
发布2026-07-20 19:02:02
发布2026-07-20 19:02:02
390
举报

键盘输入记录在某些场景下具有实用价值,如用户行为分析、数据收集或辅助工具开发。本文将介绍三种不同的Python实现方法,每种方法都包含详细的使用说明和原创代码示例。

方法一:使用pynput库(推荐)

使用方法介绍

pynput是专门用于监控和控制输入设备的库,支持跨平台运行。通过监听键盘事件,可以准确捕获各种按键操作,包括特殊功能键。

代码示例

代码语言:javascript
复制
from pynput.keyboard import Key, Listener
import threading
import time


class KeyboardRecorder:
    def __init__(self, filename='keylog.txt'):
        self.filename = filename
        self.keys_buffer = []
        self.is_recording = False
        
    def key_to_string(self, key):
        """将按键转换为可读字符串"""
        if hasattr(key, 'char') and key.char is not None:
            return key.char
        elif key == Key.space:
            return ' '
        elif key == Key.enter:
            return '\n'
        elif key == Key.tab:
            return '\t'
        else:
            return f'[{key.name.upper()}]'
    
    def on_press(self, key):
        """按键按下事件处理"""
        if self.is_recording:
            key_str = self.key_to_string(key)
            self.keys_buffer.append(key_str)
            
            # 每10个字符保存一次
            if len(self.keys_buffer) >= 10:
                self.save_to_file()
    
    def on_release(self, key):
        """按键释放事件处理"""
        if key == Key.f12:  # 使用F12键停止记录
            self.stop_recording()
            return False
    
    def save_to_file(self):
        """保存缓冲区内容到文件"""
        if self.keys_buffer:
            with open(self.filename, 'a', encoding='utf-8') as f:
                f.write(''.join(self.keys_buffer))
            self.keys_buffer.clear()
    
    def start_recording(self):
        """开始记录"""
        self.is_recording = True
        print("键盘记录已开始,按F12键停止...")
        
        with Listener(on_press=self.on_press, on_release=self.on_release) as listener:
            listener.join()
    
    def stop_recording(self):
        """停止记录"""
        self.is_recording = False
        self.save_to_file()
        print("键盘记录已停止")


# 使用示例
if __name__ == "__main__":
    recorder = KeyboardRecorder('my_keystrokes.txt')
    recorder.start_recording()

方法二:使用keyboard库

使用方法介绍

keyboard库提供了更简洁的API,适合快速实现基本的键盘记录功能。它支持实时事件捕获和全局钩子。

代码示例

代码语言:javascript
复制
import keyboard
import datetime
from threading import Event


class SimpleKeylogger:
    def __init__(self, log_file='simple_log.txt'):
        self.log_file = log_file
        self.stop_event = Event()
        self.recorded_keys = []
        
    def callback(self, event):
        """键盘事件回调函数"""
        timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        
        if event.event_type == 'down':
            key_name = event.name
            
            # 处理特殊按键
            if len(key_name) > 1:
                key_name = f'[{key_name.upper()}]'
            
            log_entry = f"{timestamp} - {key_name}\n"
            self.recorded_keys.append(log_entry)
            
            # 实时写入文件
            with open(self.log_file, 'a', encoding='utf-8') as f:
                f.write(log_entry)
    
    def start(self):
        """开始记录"""
        print("简单键盘记录器已启动,按ESC键停止...")
        
        # 设置键盘钩子
        keyboard.hook(self.callback)
        
        # 等待停止信号
        keyboard.wait('esc')
        self.stop()
    
    def stop(self):
        """停止记录"""
        keyboard.unhook_all()
        print("记录已停止,数据保存在", self.log_file)


# 使用示例
if __name__ == "__main__":
    logger = SimpleKeylogger()
    logger.start()

方法三:使用tkinter实现GUI键盘记录器

使用方法介绍

这种方法创建一个简单的GUI界面,在用户与特定文本框交互时记录按键。适合需要可视化界面的应用场景。

代码示例

代码语言:javascript
复制
import tkinter as tk
from tkinter import messagebox
import datetime


class GUIKeylogger:
    def __init__(self):
        self.window = tk.Tk()
        self.window.title("GUI键盘记录器")
        self.window.geometry("400x300")
        
        self.record_file = "gui_keystrokes.log"
        self.is_recording = False
        self.start_time = None
        
        self.setup_ui()
    
    def setup_ui(self):
        """设置用户界面"""
        # 标题
        title_label = tk.Label(self.window, text="GUI键盘记录演示", 
                              font=("Arial", 16))
        title_label.pack(pady=10)
        
        # 记录状态显示
        self.status_var = tk.StringVar()
        self.status_var.set("记录状态: 未开始")
        status_label = tk.Label(self.window, textvariable=self.status_var,
                               font=("Arial", 12))
        status_label.pack(pady=5)
        
        # 输入文本框
        self.text_box = tk.Text(self.window, height=8, width=40)
        self.text_box.pack(pady=10)
        self.text_box.bind('<KeyPress>', self.on_key_press)
        
        # 控制按钮
        button_frame = tk.Frame(self.window)
        button_frame.pack(pady=10)
        
        start_btn = tk.Button(button_frame, text="开始记录", 
                            command=self.start_recording)
        start_btn.pack(side=tk.LEFT, padx=5)
        
        stop_btn = tk.Button(button_frame, text="停止记录", 
                           command=self.stop_recording)
        stop_btn.pack(side=tk.LEFT, padx=5)
        
        clear_btn = tk.Button(button_frame, text="清空记录", 
                            command=self.clear_log)
        clear_btn.pack(side=tk.LEFT, padx=5)
    
    def on_key_press(self, event):
        """键盘按下事件处理"""
        if self.is_recording:
            timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            key_data = f"{timestamp} - 按键: {event.char if event.char else event.keysym}\n"
            
            with open(self.record_file, 'a', encoding='utf-8') as f:
                f.write(key_data)
    
    def start_recording(self):
        """开始记录"""
        self.is_recording = True
        self.start_time = datetime.datetime.now()
        self.status_var.set(f"记录状态: 进行中 (开始于: {self.start_time.strftime('%H:%M:%S')})")
        messagebox.showinfo("提示", "键盘记录已开始")
    
    def stop_recording(self):
        """停止记录"""
        if self.is_recording:
            self.is_recording = False
            duration = datetime.datetime.now() - self.start_time
            self.status_var.set("记录状态: 已停止")
            messagebox.showinfo("提示", f"记录已停止\n持续时间: {duration.total_seconds():.1f}秒")
    
    def clear_log(self):
        """清空记录文件"""
        if messagebox.askyesno("确认", "确定要清空记录文件吗?"):
            open(self.record_file, 'w').close()
            messagebox.showinfo("提示", "记录文件已清空")
    
    def run(self):
        """运行应用程序"""
        self.window.mainloop()


# 使用示例
if __name__ == "__main__":
    app = GUIKeylogger()
    app.run()

根据具体需求选择合适的方法,遵守相关法律法规和道德准则。

1、pynput方法功能最全面,适合专业应用;

2、keyboard方法最简单易用,适合快速原型;

3、GUI方法提供可视化界面,用户体验更好;

“无他,惟手熟尔”!有需要的用起来!

如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-11-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Nicholas与Pypi 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 方法一:使用pynput库(推荐)
    • 使用方法介绍
    • 代码示例
  • 方法二:使用keyboard库
    • 使用方法介绍
    • 代码示例
  • 方法三:使用tkinter实现GUI键盘记录器
    • 使用方法介绍
    • 代码示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档