已调通,可直接在python2使用
1.录制鼠标过程源代码,按esc键结束录制,最后保存在commands.json文件中
2.执行上面代码得到的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: #如果是esc
global isRunning
isRunning=False #通知监听鼠标的线程
mouse=pynput.mouse.Controller() #获取鼠标的控制器
mouse.click(pynput.mouse.Button.left) #通过模拟点击鼠标以执行鼠标的线程,然后退出监听.
return False #监听函数return False表示退出监听12
command_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 startTime
startTime=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()
#等待线程结束,也就是等待用户按下esc
key_listen_thread.join()
mouse_listen_thread.join()
#保存文件
toFile(command_list,"./commands.json")
if __name__=="__main__":
main()
# -*- coding:utf-8 -*-
# 一个运行使用"记录宏.py"记录的json的程序
import os # 用于文件操作
import json # 用于记录下来的操作
import time # 用于按照记录下来的时间间隔操作
import pynput # 用于模拟鼠标键盘操作
def unicode_convert(input_data):
#将unicode转换成str
if 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_data
def 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]:
continue
print(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]:
continue
print(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 = raw_input("请输入操作记录文件路径(相对路径从本文件位置开始)")
path = 'StartUeMonitor.json'
ExecuteCommandsFile(path)