今天跟大家分享一套自动化操作流程解决方案,基于Python语言。
涉及:
pyautogui、pyperclip、pythoncom、win32com 依赖包。
安装命令为:
pip install pyautogui
pip install pyperclip
pip install pythoncom
pip install win32com
pyautogui 是一个自动化控制鼠标和键盘的 Python 模块,使用 PyAutoGUI 执行的一些常见任务:移动鼠标光标、单击鼠标(左键、右键和中键单击)、截取屏幕截图、在屏幕上查找图像或模式、获取当前鼠标位置等等。
pyperclip 可以在不同应用程序之间复制和粘贴文本数据,有一些应用程序界面不支持按键的Ctrl C和Ctrl V操作,可以借此实现。
pythoncom 允许Python程序与COM对象进行交互,实现COM对象的创建、访问、调用(例如访问 Microsoft Office 文档、操作 Windows 注册表等),这对于与Windows上的各种应用程序和服务进行集成和自动化非常有用。
win32com 和pythoncom模块一样,但提供了更高级的功能和更容易使用的接口。
我将基于上述4个模块,讲述Windows系统下某应用程序的自动化操作流程的实现步骤:
自动化操作流程类似于RPA机器人流程自动化软件,首先需要进行一遍人工操作流程,把关键点击节点或重要操作步骤截图保存,基于这一系列截图照片和应用程序界面进行图片比对、相对坐标位置点击实现鼠标点击或者键盘输入,达到自动化操作。
但是在模拟操作过程中,需要应用程序始终为置顶状态,下面程序可以获取到当前电脑打开的所有应用程序句柄,找到待操作对象的应用程序句柄hwnd,将其进行置顶,下图为获取到的当前所有应用程序句柄列表。
win32gui.EnumWindows(get_all_hwnd, 0)
for h, t in hwnd_title.items():
if t is not "":
print(([h], [t]))
应用程序置顶可以有效避免了新闻或者广告弹窗覆盖了操作区域,发生误触,下面程序是实现句柄为hwnd的应用程序置顶。
def setFront(hwnd):
pythoncom.CoInitialize()
shell = win32com.client.Dispatch("WScript.Shell")
shell.SendKeys('%')
win32gui.SetForegroundWindow(hwnd)
time.sleep(0.2)
# 释放资源
pythoncom.CoUninitialize()
进入应用程序界面,接下来在待操作区域进行图像识别,得到模拟点击的位置或者相对坐标位置,以下示例中im1是应用程序界面截图,img是待模拟点击功能按钮区域截图,以下两种方法均可实现:
im1 = pyautogui.screenshot(region=(截图区域左上角X轴坐标, 截图区域左上角Y轴坐标,截图区域的宽度, 截图区域的高度))
# 在im1区域内定位img图像 grayscale=True开启灰度识别 confidence=0.7相似度匹配阈值
loc = pyautogui.locate(img, im1, grayscale=True, confidence=0.7)
# 点击待操作功能按钮截图中心坐标
x, y = pyautogui.center(loc)
setFront(hwnd)
pyautogui.click(x, y)
获取当前程序的坐标x、y及其宽度w、高度h,在此基础上进行偏移量计算后进行点击
rect = win32gui.GetWindowRect(hwnd)
x = rect[0]
y = rect[1]
w = rect[2] - x
h = rect[3] - y
setFront(hwnd)
pyautogui.click(x + 相对偏移位置, y + 相对偏移位置)
下图为点击应用程序界面的相对坐标位置实现鼠标点击启动:
如果应用程序区域正在响应过程,还没有出现待点击功能区域,固定的等待时间可能出现意外,所以获取函数的返回值loc = pyautogui.locate(img, im1, grayscale=True, confidence=置信度),该函数在没有匹配到待操作功能区域截图时,将会返回None,下面程序是基于函数的返回值None判断是否出现某个功能按钮,实现停等程序响应:
# 等待img出现在程序界面,默认等待30秒
def waitOccur(img, n=30):
for i in range(n):
m1 = pyautogui.screenshot(region=(截图区域左上角X轴坐标, 截图区域左上角Y轴坐标,截图区域的宽度, 截图区域的高度))
loc = pyautogui.locate(img, im1, grayscale=True, confidence= 置信度)
locx, locy = getLoc(img)
if locx != 0 and locy != 0:
return True
time.sleep(1)
return False
下图为等待应用程序内某个待点击区域出现后,点击对应位置,实现操作。
上述内容为自动化流程的几个关键操作函数,后续的功能操作,也是这几种关键方法实现,读者们自行实现定制化操作,但在实现过程有以下注意事项:
1.在实现过程中,建议每一次鼠标模拟点击前进行一次应用程序置顶操作setFront(hwnd);
2.建议点击间隔秒数控制较大一些,使用time.sleep(睡眠秒数)进行设置,避免程序响应过慢引起失效。