大家好,欢迎来到IT知识分享网。
KeymouseGo 简介
类似按键精灵的鼠标键盘录制和自动化操作 模拟点击和键入。
功能:记录用户的鼠标键盘操作,通过触发按钮自动执行之前记录的操作,可设定执行的次数,可以理解为 精简绿色版
的 按键精灵
。
用途:在进行某些操作简单、单调重复的工作时,使用本软件就可以很省力了。自己只要做一遍,然后接下来就让电脑来做。
下载路径:GitHub – taojy123/KeymouseGo: 类似按键精灵的鼠标键盘录制和自动化操作 模拟点击和键入 | automate mouse clicks and keyboard input
安装
该软件通过 Python
语言编写,已打包为可执行文件,未安装 Python
的用户可直接下载 release 版本 ,直接点击 KeymouseGo
运行
源码打包可执行文件
- Windows
1. 安装 Python3 2. pip install -r requirements-windows.txt 3. pip install pyinstaller 4. pyinstaller -F -w --add-data "./assets;assets" KeymouseGo.py
- Linux或Mac
1. 安装 Python3 2. pip3 install -r requirements-universal.txt 3. pip3 install pyinstaller 4. pyinstaller -F -w --add-data "./assets:assets" KeymouseGo.py
使用方法
基本操作
桌面模式
1、点击 录制
按钮,开始录制。
2、在计算机上进行任意操作,如点击鼠标、键盘输入,这部分的动作会被记录下来。
3、点击 结束
按钮,结束录制。
4、点击 启动
按钮,计算机会重复执行一遍第2步中所录制的动作。
命令行模式
直接运行指定脚本:
> ./KeymouseGo scripts/0314_1452.txt
运行指定脚本3次:
> ./KeymouseGo scripts/0314_1452.txt -rt 3 > ./KeymouseGo scripts/0314_1452.txt --runtimes 3
以200%的速度运行指定脚本:
> ./KeymouseGo scripts/0314_1452.txt -sp 200 > ./KeymouseGo scripts/0314_1452.txt --speed 200
加载自定义扩展MyExtension
运行指定脚本:
> ./KeymouseGo scripts/0314_1452.txt -m MyExtension > ./KeymouseGo scripts/0314_1452.txt --module MyExtension
提示
1、可设置脚本重复执行的次数,如果为 0
即为无限循环。
2、默认启动热键为 F6
,功能等同于 启动
按钮;默认终止热键为 F9
,按下后将会停止正在运行的脚本。
3、录制时只记录鼠标点击动作和键盘动作,不记录鼠标移动轨迹。
4、每次录制结束后都会在 scripts
目前下生成一个新的脚本文件。
5、运行前可以在列表中选择一个需要执行的脚本。
6、scripts
下的脚本文件内容可以修改,修改时可参考如下所述 脚本格式说明
。
7、热键设置中的Middle
指代鼠标中键,XButton
指代鼠标侧键
8、由于程序速度受限,当输入的鼠标速度大于一定值时脚本将无法以预期的输入速度执行
部分系统环境中,可能出现无法录制完整的鼠标事件的情况,请以管理员身份/root身份运行此工具即可正常使用。
使用Mac的用户,需要确保程序在辅助功能白名单,如果使用打包的exec文件,则还需要确保终端也在辅助功能白名单。 如果app程序闪退,请尝试给予~/.qt_material
目录下文件的写权限:
chmod -R 770 ~/.qt_material
脚本语法说明
演示屏幕分辨率为
1920 * 1080
[ [3000, "EM", "mouse right down", ["0.05208%", "0.1852%"]], // 开始运行 `3000ms` 后,在屏幕相对坐标 `(0.05208, 0.1852)`即 `(100,200)` 处 `按下鼠标右键`; [50, "EM", "mouse right up", ["0.05208%", "0.1852%"]], // 等待 `50ms` 后在相同位置 `抬起鼠标右键`; [1000, "EK", "key down", [70, "F", 0]], // 等待 `1000ms` 后 `按下f键`; [50, "EK", "key up", [70, "F", 0]], // 等待 `50ms` 后 `抬起f键`; [100, "EM", "mouse left down", ["0.2604%", "0.4630%"]], // 等待 `100ms` 后,在屏幕相对坐标 `(0.2604, 0.4630)`即 `(500, 500)` 处 `按下鼠标左键`; [100, "EM", "mouse move", ["0.2604%", "0.5556%"]], // 等待 `100ms` 后,鼠标移动至相对坐标 `(0.2604, 0.5556)`即 `(500, 600)` 位置; [100, "EM", "mouse left up", ["0.3125%", "0.5556%"]], // 等待 `100ms` 后,在屏幕相对坐标 `(0.3125, 0.5556)`即 `(600, 600)` 处 `抬起鼠标左键`; [100, "EX", "input", "你好 world"], // 等待 `100ms` 后,在当前位置输入 `你好 world` 文字。 ]
脚本为 json
格式,每一行代表一次动作:
- 每行的第 1 个元素表示时间间隔,指的是本次动作与上一次动作之间相隔的时间,单位为毫秒。
- 每行的第 2 个元素表示鼠标动作或是键盘动作:
EM
为鼠标,EK
为键盘,EX
为其他拓展动作。 - 每行的第 3 个元素表示动作的类型:
mouse left down
为鼠标左键按下,mouse left up
为鼠标左键抬起,mouse right down
为鼠标右键按下,mouse right up
为鼠标右键抬起,mouse middle down
为鼠标中键按下,mouse middle up
为鼠标中键抬起,mouse wheel up
为鼠标滚轮上滑,mouse wheel down
为鼠标滚轮下滑,key down
为键盘按键按下,key up
为键盘按键抬起,mouse move
为鼠标滑过,input
输入文字。
- 每行的第 4 个元素表示具体的动作参数
- 当为鼠标动作时,由两个子元素构成,分别为鼠标所在的屏幕位置的横纵坐标,
- 当为键盘动作时,由三个子元素构成,分别是(按键编号, 按键名, 拓展标记),
- 当为输入文字动作时,为要输入的文字内容。
- 每行
//
后的部分为注释内容。 - 修改时请严格遵守格式,否则可能导致脚本无法运行,建议修改前先备份一下。
- 横纵坐标为[-1, -1]时,表示在鼠标当前所在位置执行操作。
详细介绍
使用方法
基本操作
桌面模式
1、点击 录制
按钮,开始录制。
2、在计算机上进行任意操作,如点击鼠标、键盘输入,这部分的动作会被记录下来。
3、点击 结束
按钮,结束录制。
4、点击 启动
按钮,计算机会重复执行一遍第2步中所录制的动作。
命令行模式
usage: KeymouseGo.py [-h] [-rt RUNTIMES] [-sp SPEED] [-m MODULE] sctipts [sctipts ...] positional arguments: sctipts Path for the scripts optional arguments: -h, --help show this help message and exit -rt RUNTIMES, --runtimes RUNTIMES Run times for the script -sp SPEED, --speed SPEED Run speed for the script, input in percentage form -m MODULE, --module MODULE Extension for the program
直接运行指定脚本:
> ./KeymouseGo scripts/0314_1452.txt
运行指定脚本3次:
> ./KeymouseGo scripts/0314_1452.txt -rt 3 > ./KeymouseGo scripts/0314_1452.txt --runtimes 3
以200%的速度运行指定脚本:
> ./KeymouseGo scripts/0314_1452.txt -sp 200 > ./KeymouseGo scripts/0314_1452.txt --speed 200
加载自定义扩展MyExtension
运行指定脚本:
> ./KeymouseGo scripts/0314_1452.txt -m MyExtension > ./KeymouseGo scripts/0314_1452.txt --module MyExtension
脚本语法
演示屏幕分辨率为
1920 * 1080
[ [3000, "EM", "mouse right down", ["0.05208%", "0.1852%"]], // 开始运行 `3000ms` 后,在屏幕相对坐标 `(0.05208, 0.1852)`即 `(100,200)` 处 `按下鼠标右键`; [50, "EM", "mouse right up", ["0.05208%", "0.1852%"]], // 等待 `50ms` 后在相同位置 `抬起鼠标右键`; [1000, "EK", "key down", (70, 'F', 0)], // 等待 `1000ms` 后 `按下f键`; [50, "EK", "key up", (70, 'F', 0)], // 等待 `50ms` 后 `抬起f键`; [100, "EM", "mouse left down", ["0.2604%", "0.4630%"]], // 等待 `100ms` 后,在屏幕相对坐标 `(0.2604, 0.4630)`即 `(500, 500)` 处 `按下鼠标左键`; [100, "EM", "mouse move", ["0.2604%", "0.5556%"]], // 等待 `100ms` 后,鼠标移动至相对坐标 `(0.2604, 0.5556)`即 `(500, 600)` 位置; [100, "EM", "mouse left up", ["0.3125%", "0.5556%"]], // 等待 `100ms` 后,在屏幕相对坐标 `(0.3125, 0.5556)`即 `(600, 600)` 处 `抬起鼠标左键`; [100, "EX", "input", "你好 world"], // 等待 `100ms` 后,在当前位置输入 `你好 world` 文字。 ]
脚本为 json
格式,每一行代表一次动作:
- 每行的第 1 个元素表示时间间隔,指的是本次动作与上一次动作之间相隔的时间,单位为毫秒。
- 每行的第 2 个元素表示鼠标动作或是键盘动作:
EM
为鼠标,EK
为键盘,EX
为其他拓展动作。 - 每行的第 3 个元素表示动作的类型:
mouse left down
为鼠标左键按下,mouse left up
为鼠标左键抬起,mouse right down
为鼠标右键按下,mouse right up
为鼠标右键抬起,mouse middle down
为鼠标中键按下,mouse middle up
为鼠标中键抬起,mouse wheel up
为鼠标滚轮上滑,mouse wheel down
为鼠标滚轮下滑,key down
为键盘按键按下,key up
为键盘按键抬起,mouse move
为鼠标滑过,input
输入文字。
- 每行的第 4 个元素表示具体的动作参数
- 当为鼠标动作时,由两个子元素构成,分别为鼠标所在的屏幕位置的横纵坐标,
- 当为键盘动作时,由三个子元素构成,分别是(按键编号, 按键名, 拓展标记),
- 当为输入文字动作时,为要输入的文字内容。
- 每行
//
后的部分为注释内容。 - 修改时请严格遵守格式,否则可能导致脚本无法运行,建议修改前先备份一下。
- 横纵坐标为[-1, -1]时,表示在鼠标当前所在位置执行操作。
扩展
扩展可以实现的功能:
- 改变程序执行流程
- 运行时改变执行操作内容
- 执行过程中运行自定义内容
提示:扩展由Python语言编写,需要一定的编程知识
扩展类
程序提供了插件扩展接口,默认扩展类位于assets/plugins/Extension.py
,可以通过派生Extension
类实现自定义功能。
Extension
类初始化函数包含以下参数:
runtimes
脚本执行次数,运行时修改runtimes
的值会影响脚本的实际执行次数speed
脚本执行速度(%)thd
执行脚本的线程对象swap
交换数据,默认为None
,捕获到PushProcess
异常时会将swap
的内容传递给新扩展对象,在子流程结束后接收新扩展对象swap
的内容
Extension
类提供以下接口:
onbeginp()
,在脚本执行前,扩展模块实例化后执行onbeforeeachloop(currentloop)
,在每次执行脚本前执行,返回False时跳过本次执行onrunbefore(event, currentindex)
,在每行脚本执行前执行,返回False时跳过本行执行onrunafter(event, currentindex)
,在每行脚本后执行,无论onrunbefore
返回值如何,无返回值onaftereachloop(currentloop)
,在每次执行完脚本后执行,无论onbeforeeachloop
返回值如何,无返回值onrecord(event, currentindex)
,在每次录制到一个操作后执行,返回True记录本次操作onendp()
,在全部循环执行完成后执行
currentindex
和currentloop
分别指代当前脚本的行索引与循环索引(从0开始)
event
为当前脚本执行的操作,其内容包含
delay
操作延时(ms)event_type
事件类型message
操作类型action
操作参数addon
用户自定义内容,可以是任意数据类型,在自定义扩展中可使用
创建扩展
定义Extension
子类<name>
时,确保模块名<name>.py
与子类名<name>
相同。
为脚本指定扩展,可以在GUI环境或是命令行下指定,也可以在脚本内指定(优先级最高),在脚本内指定时,需要在脚本第一行加上扩展模块名。
[ "模块名", // 以下为脚本内容 ]
程序启动时默认添加plugins文件夹到库搜索路径,如果需要添加其它库搜索路径,可以通过在扩展开头添加以下内容:
示例
添加程序目录下的plugins文件夹到搜索路径
import os from KeymouseGo import add_lib_path add_lib_path([ os.path.join(os.getcwd(), "plugins") ])
在相应文件夹添加入搜索路径后,该文件夹下模块的引入可以直接通过import
或from ... import ...
实现:
假设plugins
文件夹下存在Util.py
,可直接通过以下指令引入模块
import Util
流程控制
程序对脚本执行流程提供了以下方法,均以异常形式定义,使用时通过raise
异常实现流程控制:
JumpProcess(index)
跳转到索引或标签为index
的脚本行BreakProcess
结束本次执行EndProcess
结束全部执行
各接口接受的流程控制异常:
– | onbeginp | onbeforeeachloop | onrunbefore | onrunafter | onafterloop | onendp | onrecord |
---|---|---|---|---|---|---|---|
Jump | × | × | √ | √ | × | × | × |
Break | × | √ | √ | √ | √ | × | × |
End | × | √ | √ | √ | √ | × | × |
声明标签
与声明指定扩展类似,在指定行前加上一行字符串,该字符串即为本行的标签:
[ // 脚本内容 "标签", // 脚本内容 ]
raise JumpProcess(“标签”)时将会跳转到该标签所在行的下一行内容。
警告:在5.1版本中不再支持通过索引号跳转到指定索引位置。
第一行的标签默认为”START”,为避免与扩展声明重复。
日志调试
本程序使用loguru
作为日志模块,在自定义扩展中可直接引入模块进行日志调试
from loguru import logger
日志内容默认保存在主程序日志中,如果有其它的需求可以参阅loguru的文档进行改动
示例
在Script
目录下存在录制的脚本1.txt
,2.txt
,其内容均多于3行,程序先执行1.txt
中内容。
扩展操作:
- 在第一次脚本执行中,执行完第一条(索引0)脚本内容后跳转到第3条脚本(索引2)
- 在第一次脚本执行中,执行完第3条脚本后转而加载新的扩展,以相同的速度执行
2.txt
内容2次,新的扩展操作包括:- 在第一次执行中,执行完第1条脚本后跳过本次循环
- 在第一次执行中,执行完第2条脚本后结束执行
- 结束执行后,显示从原扩展中转递过来的数据
- 在第二次脚本执行中,跳过第1条(索引0)脚本内容
- 在第二次脚本执行中,执行完第2条脚本后重复执行一次第二条脚本
- 限制脚本执行次数为3次
在plugins/
目录下新建MyExtension.py
,其内容为:
from assets.plugins.Extension import * from assets.plugins.ProcessException import * from UIFunc import RunScriptClass from loguru import logger logger.info('Import MyExtension') class MyExtension(Extension): def __init__(self, runtimes, speed, thd=None, swap=None): # 默认的构造函数将参数分别赋给self.runtimes,self.speed,self.swap super().__init__(runtimes, speed, thd, swap) # 保存当前执行次数 self.currentloop = 0 # 传递给子扩展的数据,传递时采用=赋值而不是浅/深复制 # self.swap = 'Helloworld' """ 完成功能5 GUI界面或命令行设置的执行次数通过runtimes参数传入,并保存到self.runtimes 修改此值可以改变实际执行次数 """ # self.runtimes = 3 def onbeforeeachloop(self, currentloop): # 更新当前执行次数 self.currentloop = currentloop return True def onrunbefore(self, event, currentindex): return True # 完成功能3 # if self.currentloop == 1 and currentindex == 0: # return False # else: # return True def onrunafter(self, event, currentindex): pass # 完成功能1 # if self.currentloop == 0 and currentindex == 0: # raise JumpProcess(2) # 完成功能2 # elif self.currentloop == 0 and currentindex == 2: # """ # run_sub_script包含5个参数, # extension: 父流程的扩展对象,在这里输入self即可 # scriptpath: 子流程执行的脚本路径,采用相对路径或是绝对路径均可 # speed: 子流程执行的速度,默认为100(%) # runtimes: 子流程执行次数,默认为1 # subextension_name: 子流程加载的扩展模块,默认为Extension # """ # RunScriptClass.run_sub_script(self, 'scripts/0603_1013.txt', # speed=self.speed, # runtimes=2, # subextension_name='MyExtension2', # thd=self.thd # ) # 完成功能4 # elif self.currentloop == 1 and currentindex == 1: # """ # 在程序中,每个操作被封装为一个ScriptEvent对象,其内容包含 # event.delay: int类型,为操作延时(ms) # event.event_type: str类型,为事件类型 # event.message: str类型,为操作类型 # event.action: str类型,为操作参数 # event.addon: 任意类型,添加的类型需要实现__str__方法以便保存 # """ # event.execute()
在plugins/
目录下新建MyExtension2.py
,其内容为:
from assets.plugins.Extension import * from assets.plugins.ProcessException import * from loguru import logger logger.info('Import MyExtension2') class MyExtension2(Extension): def __init__(self, runtimes, speed, thd=None, swap=None): super().__init__(runtimes, speed, thd, swap) self.currentloop = 0 def onbeforeeachloop(self, currentloop): self.currentloop = currentloop return True def onrunafter(self, event, currentindex): pass # 完成功能2.i # if self.currentloop == 0: # raise BreakProcess() # 完成功能2.ii # elif self.currentloop == 1 and currentindex == 1: # raise EndProcess() def onendp(self): pass # 完成功能2.iii # logger.info(self.swap)
流程图
资料路径:
GitHub – taojy123/KeymouseGo: 类似按键精灵的鼠标键盘录制和自动化操作 模拟点击和键入 | automate mouse clicks and keyboard input
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/143815.html