python3实现鼠标键盘动作录制,并还原执行过程

news/2024/10/17 14:21:19/

这里写自定义目录标题

    • 1.录制鼠标过程源代码,按esc键结束录制,最后保存在commands.json文件中
    • 2.执行上面代码得到的commands.json文件,运行程序,输入文件绝对路径或者文件名,输入文件名则搜索当前程序下的目录文件

1.录制鼠标过程源代码,按esc键结束录制,最后保存在commands.json文件中

# -*- coding:utf-8 -*-
#一个记录用户操作,并保存到json文件的程序import time    #用于记录每一项操作的时间
import json    #用于保存导出我们记录的操作
import threading    #由于键盘和鼠标事件的监听都是阻塞的,所以用两个线程实现
import pynput    #用于记录用户事件
command_list=[]    #用来存储用户的操作
isRunning=True    #是否在运行,用于实现在按esc后退出的功能
startTime=0    #开始时间,会在之后main函数中进行初始化
def on_key_press(key):    #当按键按下时记录if key==pynput.keyboard.Key.esc:    #如果是escglobal isRunningisRunning=False    #通知监听鼠标的线程mouse=pynput.mouse.Controller()    #获取鼠标的控制器mouse.click(pynput.mouse.Button.left)    #通过模拟点击鼠标以执行鼠标的线程,然后退出监听.return False    #监听函数return False表示退出监听12command_list.append(("press",    #操作模式(str(key).strip("'"),),    #具体按下的键,传进来的参数并不是一个字符串,而是一个对象,如果按下的是普通的键,会记录下键对应的字符,否则会使一个"Key.xx"的字符串time.time()-startTime    #操作距离程序开始运行的秒数))
def on_key_release(key):    #但按键松开时记录command_list.append(("release",    #操作模式(str(key).strip("'"),),    #键信息,参见on_key_press中的相同部分time.time()-startTime    #操作距离程序开始运行的秒数))
def on_mouse_click(x,y,button,pressed):if not isRunning:    #如果已经不在运行了return False    #退出监听if not pressed:    #如果是松开事件return True    #不记录command_list.append(("click",    #操作模式(x,y,str(button)),    #分别是鼠标的坐标和按下的按键time.time()-startTime    #操作距离程序开始运行的秒数))
def start_key_listen():    #用于开始按键的监听# 进行监听with pynput.keyboard.Listener(on_press=on_key_press,on_release=on_key_release) as listener:listener.join()def start_mouse_listen():    #用于开始鼠标的监听# 进行监听with pynput.mouse.Listener(on_click=on_mouse_click) as listener:listener.join()def toFile(command_list,path):    #保存为文件,参数分别为操作记录和保存位置with open(path,"w") as f:f.write(json.dumps(command_list))    #使用json格式写入def main():    #主函数global startTimestartTime=time.time()    #初始化开始时间key_listen_thread=threading.Thread(target=start_key_listen)    #创建用于监听按键的线程mouse_listen_thread=threading.Thread(target=start_mouse_listen)    #创建用于监听鼠标的线程#运行线程key_listen_thread.start()mouse_listen_thread.start()#等待线程结束,也就是等待用户按下esckey_listen_thread.join()mouse_listen_thread.join()#保存文件toFile(command_list,"./commands.json")if __name__=="__main__":main()

2.执行上面代码得到的commands.json文件,运行程序,输入文件绝对路径或者文件名,输入文件名则搜索当前程序下的目录文件

# -*- coding:utf-8 -*-
# 一个运行使用"记录宏.py"记录的json的程序
import os  # 用于文件操作
import json  # 用于记录下来的操作
import time  # 用于按照记录下来的时间间隔操作
import pynput  # 用于模拟鼠标键盘操作def unicode_convert(input_data):#将unicode转换成strif isinstance(input_data, dict):return {unicode_convert(key): unicode_convert(value) for key, value in input_data.iteritems()}elif isinstance(input_data, list):return [unicode_convert(element) for element in input_data]elif isinstance(input_data, unicode):return input_data.encode('utf-8')else:return input_datadef ExecuteCommandsFile(path):# 如果命令行传入了参数,则使用命令行参数,否则提示用户输入,此变量表示操作记录文件的路径# 第二个不是:,也就代表路径是相对路径path = unicode_convert(path)if path[2] != ":":# 将其解析为从本文件开始的路径path = os.path.join(os.path.dirname(__file__), path)# 打开文件with open(path) as f:# 将记录的命令写入命令列表command_list = json.loads(f.read())command_list = unicode_convert(command_list)# 创建鼠标和键盘的执行器,用于模拟键盘和鼠标的操作mouse = pynput.mouse.Controller()keyboard = pynput.keyboard.Controller()# 鼠标的两个按钮buttons = {"Button.left": pynput.mouse.Button.left,"Button.right": pynput.mouse.Button.right}# 开始后已经经过的时间sTime = 0# 执行每一条记录for command in command_list:# 如果是点击记录print(command[0])print(command[1])#print(command[1][2])print(command[2])if command[0] == "click":# 将鼠标移动到记录中的位置mouse.position = (command[1][0], command[1][1])# 等待一下time.sleep(0.1)# 点击mouse.click(buttons[command[1][2]])# 如果是按键按下elif command[0] == "press":# 如果是特殊按键,会记录成Key.xxx,这里判断是不是特殊按键if command[1][0][:3] == "Key":# 按下按键keyboard.press(eval(command[1][0], {}, {"Key": pynput.keyboard.Key}))else:# 如果是普通按键,直接按下if "<255>" == command[1][0]:continueprint(command[1][0])print(command[1][0].split("'")[1])keyboard.press(command[1][0].split("'")[1])# 如果是按键释放elif command[0] == "release":# 如果是特殊按键if command[1][0][:3] == "Key":# 按下按键keyboard.release(eval(command[1][0], {}, {"Key": pynput.keyboard.Key}))else:# 普通按键直接按下if "<255>" == command[1][0]:continueprint(command[1][0])print(command[1][0].split("'")[1])keyboard.release(command[1][0].split("'")[1])# command[2]代表此操作距离开始操作所经过的时间,用它减去已经经过的时间就是距离下一次操作的时间time.sleep(command[2] - sTime)# 更新时间sTime = command[2]if __name__=="__main__":path = 'commands.json'ExecuteCommandsFile(path)

http://www.ppmy.cn/news/533380.html

相关文章

安卓实现按键录制回放

最近玩pokemongo需要将扔excellent球的操作录下来&#xff0c;这样子下次直接就可以不用自己手扔了。通过adb进入shell后getevent命令可以打印实时触摸的操作信息&#xff0c;sendevent能够写入操作到触摸屏&#xff0c;实现模拟滑动和点击和其他操作&#xff0c;但是将geteven…

如何录制/回放使用工具推荐

在测试过程&#xff0c;我们总是出现重复性劳动工作&#xff0c;步骤都一致&#xff0c;我们希望有个机器人帮我们完成&#xff0c;可是代码又不会写咋办&#xff1f; &#xff08;本文只对刚入门或者没有接触测试的同学&#xff09; 在这里就给大家推荐录制回放的工具&#…

前端监控:回放录制库 rrweb

rrweb rrweb 主要由 rrweb 、 rrweb-player 和 rrweb-snapshot 三个库组成&#xff1a; rrweb&#xff1a;提供了 record 和 replay 两个方法&#xff1b;record 方法用来记录页面上 DOM 的变化&#xff0c;replay 方法支持根据时间戳去还原 DOM 的变化。rrweb-player&#x…

java写键盘鼠标录制器,易语言仿按键精灵录制键盘鼠标操作的代码

DLL命令表 .版本 2 .DLL命令 取按键状态, 短整数型, "user32.dll", "GetAsyncKeyState" .参数 鼠标键, 整数型 .DLL命令 取鼠标位置, 整数型, "user32.dll", "GetCursorPos" .参数 当前鼠标位置, 鼠标位置, 传址 .DLL命令 模拟鼠标按键…

QT 录制鼠标键盘回放

QT 录制鼠标键盘回放 前段时间因为朋友想要解放双手想要把一些操作录制回放 所以做了这个小项目 因为我目前运用的QT只能在程序中去记录鼠标跟键盘的操作 所以网上找了找方法 有钩子函数使用 所以运用了钩子函数 一、Hook Window的钩子可以捕捉整个窗口的鼠标跟键盘 首先我们…

如何预防CC攻击 180.188.22.2

CC攻击是DDoS(分布式拒绝服务)的一种&#xff0c;相比其它的DDoS攻击CC似乎更有技术含量一些。这种攻击你见不到虚假IP&#xff0c;见不到特别大的异常流量&#xff0c;但造成服务器无法进行正常连接&#xff0c;一条ADSL的普通用户足以挂掉一台高性能的Web服务器 。 如何应对…

【备战秋招】每日一题:2023.3.15-阿里OD机试(第三题)-k次操作最小化极差

在线评测链接:P1084 题目内容 在一个遥远的王国里&#xff0c;有一座高耸入云的宝塔&#xff0c;据说里面藏有神秘的宝藏。但是&#xff0c;进入宝塔的道路异常困难&#xff0c;需要经过各种险阻&#xff0c;其中一个重要的关卡是“平衡之门”。 平衡之门是一条走廊&#xf…

Linux组管理和权限管理

一、Linux组 在linux中每个用户必须属于一个组&#xff0c;不能独立于组外&#xff0c;在linux中 文件所有者 一般为文件创建者&#xff0c;可以通过ls -ahl 查看文件所有者 chown 用户名 文件名 &#xff1a;修改文件所有者 groupadd 组名 创建组 当某个用户创建了一个文件…