下面给出「录制 → 回放」一体脚本,完全基于 pynput,零依赖(除 pynput)。
结构
mouse_replay/
├── mouse_recorder.py # 录制并保存 JSON
├── mouse_replay.py # 读取 JSON 并精准回放
└── main_demo.py # 一键「先录后播」示例
- mouse_recorder.py
"""
录制鼠标左键点击序列,保存为 JSON
"""
import json
import time
from pathlib import Path
from pynput import mouse
DEFAULT_FILE = Path("clicks.json")
class MouseRecorder:
def __init__(self, save_path: Path = DEFAULT_FILE):
self.save_path = save_path
self.clicks = []
def _on_click(self, x, y, button, pressed):
if button == mouse.Button.left and pressed:
self.clicks.append({"x": x, "y": y, "delay": 0})
def run(self):
print("开始录制,按 Ctrl+C 结束...")
with mouse.Listener(on_click=self._on_click) as lst:
try:
lst.join()
except KeyboardInterrupt:
print("\n录制结束,保存中...")
# 计算每一步的相对延时(秒)
for i in range(1, len(self.clicks)):
self.clicks[i]["delay"] = 0.5 # 固定间隔,可改成动态
self.save_path.write_text(json.dumps(self.clicks, indent=2))
print(f"已保存 {len(self.clicks)} 次点击 → {self.save_path}")
if __name__ == "__main__":
MouseRecorder().run()
- mouse_replay.py
"""
读取 clicks.json,精准回放鼠标点击
"""
import json
import time
from pathlib import Path
from pynput.mouse import Button, Controller
DEFAULT_FILE = Path("clicks.json")
class MouseReplay:
def __init__(self, load_path: Path = DEFAULT_FILE):
if not load_path.exists():
raise FileNotFoundError(load_path)
self.clicks = json.loads(load_path.read_text())
self.mouse = Controller()
def run(self):
print(f"准备回放 {len(self.clicks)} 次点击,3 秒后开始...")
time.sleep(3)
for idx, step in enumerate(self.clicks, 1):
x, y, delay = step["x"], step["y"], step["delay"]
print(f"[{idx}] 移动到 ({x}, {y}) 并点击,延时 {delay}s")
self.mouse.position = (x, y)
time.sleep(0.1) # 稳定
self.mouse.click(Button.left, 1)
time.sleep(delay)
print("回放完成!")
if __name__ == "__main__":
MouseReplay().run()
- main_demo.py (一键「录→播」)
"""
python main_demo.py # 先录
python main_demo.py --replay # 后播
"""
import argparse
from mouse_recorder import MouseRecorder
from mouse_replay import MouseReplay
parser = argparse.ArgumentParser()
parser.add_argument("--replay", action="store_true", help="直接回放")
args = parser.parse_args()
if args.replay:
MouseReplay().run()
else:
MouseRecorder().run()
使用流程
安装依赖
pip install pynput
录制
python main_demo.py
→ 鼠标左键点击若干次后 Ctrl+C 结束,生成 clicks.json
回放
python main_demo.py --replay
→ 3 秒倒计时后,鼠标将自动移动到之前记录的坐标并依次点击。
如需扩展(键盘、拖拽、动态延迟),只需在 JSON 中增加字段并在 MouseReplay
解析即可。