图形自动化:pynput实现Win11系统动作点击录制与回放

发布于:2025-08-19 ⋅ 阅读:(15) ⋅ 点赞:(0)

下面给出「录制 → 回放」一体脚本,完全基于 pynput,零依赖(除 pynput)。

结构

mouse_replay/

├── mouse_recorder.py # 录制并保存 JSON

├── mouse_replay.py # 读取 JSON 并精准回放

└── main_demo.py # 一键「先录后播」示例


  1. 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()

  1. 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()

  1. 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()

使用流程

  1. 安装依赖

    pip install pynput

  2. 录制

    python main_demo.py

    → 鼠标左键点击若干次后 Ctrl+C 结束,生成 clicks.json

  3. 回放

    python main_demo.py --replay

    → 3 秒倒计时后,鼠标将自动移动到之前记录的坐标并依次点击。

如需扩展(键盘、拖拽、动态延迟),只需在 JSON 中增加字段并在 MouseReplay 解析即可。


网站公告

今日签到

点亮在社区的每一天
去签到