如何用Python同时记录键鼠操作并存储为可用于函数/循环的变量
优化PC农场游戏键鼠录制重放功能
原代码无法运行的核心问题是pyautogui没有getEvent()方法,同时还存在操作节奏无法还原、停止逻辑无效等问题。以下是修复并优化后的代码,实现了完整的录制、精准重放以及循环重放功能:
import pyautogui from pynput import mouse, keyboard import time from threading import Thread # 全局变量存储录制的事件与时间戳 recorded_events = [] recording = False stop_key = keyboard.Key.f9 def on_mouse_event(x, y, button, pressed): if recording: event_time = time.time() if pressed: recorded_events.append(('mouse_down', x, y, button, event_time)) else: recorded_events.append(('mouse_up', x, y, button, event_time)) def on_mouse_move(x, y): if recording: event_time = time.time() recorded_events.append(('mouse_move', x, y, event_time)) def on_keyboard_event(key, pressed): global recording if key == stop_key and pressed: recording = False print("录制已停止") return False # 停止监听 if recording: event_time = time.time() try: key_name = key.char except AttributeError: key_name = str(key).split('.')[-1] if pressed: recorded_events.append(('key_down', key_name, event_time)) else: recorded_events.append(('key_up', key_name, event_time)) def record_operations(): global recording, recorded_events recorded_events = [] recording = True print("开始录制,按F9停止") # 启动鼠标和键盘监听线程 mouse_listener = mouse.Listener(on_move=on_mouse_move, on_click=on_mouse_event) keyboard_listener = keyboard.Listener(on_press=lambda k: on_keyboard_event(k, True), on_release=lambda k: on_keyboard_event(k, False)) mouse_listener.start() keyboard_listener.start() # 等待录制停止 while recording: time.sleep(0.1) mouse_listener.stop() keyboard_listener.stop() def replay_operations(loop_count=1): if not recorded_events: print("没有录制的操作可重放") return print(f"开始重放,循环{loop_count}次") for _ in range(loop_count if loop_count > 0 else float('inf')): start_time = recorded_events[0][-1] for event in recorded_events: # 计算事件间隔,还原操作节奏 current_time = time.time() delay = event[-1] - start_time - (current_time - start_time) if delay > 0: time.sleep(delay) # 执行对应操作 if event[0] == 'mouse_move': pyautogui.moveTo(event[1], event[2], duration=0.01) elif event[0] == 'mouse_down': pyautogui.mouseDown(x=event[1], y=event[2], button=str(event[3]).split('.')[-1]) elif event[0] == 'mouse_up': pyautogui.mouseUp(x=event[1], y=event[2], button=str(event[3]).split('.')[-1]) elif event[0] == 'key_down': pyautogui.keyDown(event[1]) elif event[0] == 'key_up': pyautogui.keyUp(event[1]) if loop_count > 0: print(f"完成第{_+1}次循环") # 使用示例 if __name__ == "__main__": # 第一步:录制操作 record_operations() # 第二步:循环重放(输入0表示无限循环) replay_operations(loop_count=0)
关键改动说明
- 替换事件监听库:用
pynput替代pyautogui做事件捕获,pyautogui更适合执行自动化操作,而非监听用户输入 - 时间戳记录:每个事件都存储触发时间,重放时通过计算时间差还原真实操作节奏
- 停止触发逻辑:设置F9为停止录制快捷键,解决原代码无效的Quit事件问题
- 精准操作还原:鼠标移动添加平滑过渡,键盘事件区分按下/抬起,避免原代码中
press()方法的逻辑误差 - 循环重放功能:支持指定循环次数,输入0即可实现无限循环,满足休息时持续运行的需求
使用注意事项
- 运行前需安装依赖:
pip install pyautogui pynput - 录制时按F9停止,重放过程中可通过移动鼠标到屏幕左上角触发pyautogui的安全机制强制停止
- 部分游戏可能有反外挂机制,使用前请确认游戏允许此类自动化工具
内容的提问来源于stack exchange,提问作者Forseen
相关产品推荐
相关产品推荐

