-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRecordingIOAsCSV.py
More file actions
114 lines (98 loc) · 3.09 KB
/
RecordingIOAsCSV.py
File metadata and controls
114 lines (98 loc) · 3.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
from pynput import mouse, keyboard
from datetime import datetime
import csv
import threading
keyboard_events = [] # 原始键盘事件
mouse_moves = []
mouse_clicks = []
start_time = datetime.now()
def now():
return (datetime.now() - start_time).total_seconds()
# 键盘监听
def on_press(key):
try:
key_name = key.char # 尝试获取字符键(如 'a')
except AttributeError:
key_name = str(key) # 特殊键(如 Key.enter)
keyboard_events.append({
'key': key_name,
'type': 'press',
'time': now()
})
def on_release(key):
if key == keyboard.Key.esc:
return False
try:
key_name = key.char
except AttributeError:
key_name = str(key)
keyboard_events.append({
'key': key_name,
'type': 'release',
'time': now()
})
# 鼠标监听
def on_move(x, y):
mouse_moves.append({
'time': now(),
'x': x,
'y': y
})
def on_click(x, y, button, pressed):
mouse_clicks.append({
'time': now(),
'x': x,
'y': y,
'button': str(button),
'pressed': pressed
})
# 启动监听线程
def start_listeners():
kb_listener = keyboard.Listener(on_press=on_press, on_release=on_release)
ms_listener = mouse.Listener(on_move=on_move, on_click=on_click)
kb_listener.start()
ms_listener.start()
kb_listener.join()
ms_listener.stop()
# 按键事件匹配 press 和 release
def pair_keyboard_events(events):
paired = []
pressed_dict = {}
for event in events:
key = event["key"]
t = event["time"]
if event["type"] == "press":
pressed_dict.setdefault(key, []).append(t)
elif event["type"] == "release":
if key in pressed_dict and pressed_dict[key]:
press_time = pressed_dict[key].pop(0)
paired.append({
"key": key,
"press_time": press_time,
"release_time": t
})
return paired
# 保存为 CSV
def save_csv_files():
# 1. 鼠标移动
with open("mouse_moves.csv", "w", newline='', encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["time", "x", "y"])
writer.writeheader()
writer.writerows(mouse_moves)
# 2. 鼠标点击
with open("mouse_clicks.csv", "w", newline='', encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["time", "x", "y", "button", "pressed"])
writer.writeheader()
writer.writerows(mouse_clicks)
# 3. 键盘点击(匹配 press 和 release)
paired_keys = pair_keyboard_events(keyboard_events)
with open("keyboard_log.csv", "w", newline='', encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["key", "press_time", "release_time"])
writer.writeheader()
writer.writerows(paired_keys)
# 主线程
if __name__ == "__main__":
print("监听中,按 ESC 退出...")
start_listeners()
save_csv_files()
print("记录完成,已保存为 3 个 CSV 文件:mouse_moves.csv, mouse_clicks.csv, keyboard_log.csv")