来聊聊桌面图形界面的自动化和采集

2021-07-20 11:46:12 浏览数 (1)

如今的计算机软件形态,已被 Web 占据大半,基本上我们能使用到的产品,都能由一个网站来提供服务。

但是有一些需要消耗计算机硬件资源的软件,和限定桌面使用的软件,都还会继续提供桌面客户端而非 Web 应用。

对于这些桌面客户端软件,其实我们也会有自动化操作和数据采集的需求。

如何使用 Python 来对桌面客户端进行呢?州的先生结合实际的使用经验,介绍两个库供大家参考使用。

PyAutoGUI

大家应该都知道有个软件叫「按键精灵」,用来录制一些鼠标和键盘操作,然后进行自动操作的软件。

PyAutoGUI 其实也是类似的库。

PyAutoGUI 让我们通过 Python 脚本,控制计算机的鼠标和键盘,以达到自动和桌面客户端程序进行交互操作的目的

PyAutoGUI 支持在 Windows、Linux 和 macOS 上使用。除了支持计算机的鼠标和键盘控制之外,还能提供简易的弹出框,并且支持进行截图。

PyAutoGUI 的使用方法也是很直观和简洁。

在引入 PyAutoGUI 库之后:

代码语言:javascript复制
  1. import pyautogui

通过 pyautogui.size() 获取屏幕的高度和宽度;

通过 pyautogui.position() 获取鼠标在屏幕上的坐标;

通过 pyautogui.moveTo(x, y) 移动鼠标到指定的坐标;

通过 pyautogui.click() 操纵鼠标单击;

通过 pyautogui.click(x, y) 操纵鼠标单击指定的坐标位置;

通过 pyautogui.doubleClick() 操纵鼠标双击;

通过 pyautogui.write() 执行键盘键的输入;

通过 pyautogui.press(‘xxx’) 按下指定的键名;

通过 pyautogui.keyDown(‘xxx’) 按住指定的键名;

通过 pyautogui.hotkey(‘xxx’, ‘xxx’) 执行热键操作;

通过 pyautogui.keyUp(‘xxx’) 松开指定的键名;

基本上,这些操作已经包含了我们日常在计算机上使用的全部操作了。

我们可以借助 PyAutoGUI 的鼠标键盘控制功能,完成大部分的计算机操作。

不足的地方在于,PyAutoGUI 只能机械地对鼠标键盘进行操作,而不能识别或分析程序或计算机桌面的情况,也不能获取程序内的所有内容

如果桌面的操作出现了意外的情况,比如弹出了一个小广告、操作超时、软件更新提醒等等。

就会导致接下来的操作走向不可控的局面。

PyWinAuto

而 PyWinAuto 就要好很多。

PyWinAuto 是一组用于自动化Microsoft Windows GUI的python模块,所以 PyWinAuto 只能用于 Windows 环境下的桌面客户端程序。

PyWinAuto 通过「Win32 API」和「MS UI Automation」来识别、判断和获取程序的属性,并依赖上述两种技术实现对程序控件的控制。

同时,PyWinAuto 也提供了键盘和鼠标的控制操作,在某些控件无法进行操作的情况下,可以继续借助鼠标键盘来完成操作。

相较于 PyAutoGui 的简便操作,PyWinAuto 的使用则稍显复杂。

在安装好 pywinauto 之后:

代码语言:javascript复制
  1. pip install pywinauto

可以通过 PyWinAuto 初始启动一个程序:

代码语言:javascript复制
  1. from pywinauto.application import Application
  2. app = Application(backend="uia").start('notepad.exe')

然后,就可以捕获程序的控件和结构了。

PyWinAuto 支持所谓的「魔法解析」,像 Python 字典一样对程序内的控件进行定位和访问。

比如,获取程序的主窗口:

代码语言:javascript复制
  1. dlg = app['窗口名称']

然后获取程序主窗口内的控件:

代码语言:javascript复制
  1. btn = dlg['Button1']

最后对控件进行操作:

代码语言:javascript复制
  1. btn.click()

但是我们怎么知道程序内各个控件的结构呢?

一个方法可以使用控件的 print_control_identifiers() 方法或 dump_tree() 方法,输出控件下所有控件的信息。

另一个方法则是使用 PyWinAuto 推荐的几个第三方程序,比如:

  • Spy ;
  • Inspect.exe

先对程序的控件结构进行获取,再编写代码。

正如上面所说,并不是所有的控件都能被识别,当有些控件识别不了,就可以辅助键盘鼠标的控制来完成操作。

最后

上述两个库最主要的应用场景在于自动化操作,对数据采集的功能很弱。

如果客户端提供了报表下载或导出功能,则可以先用这两个库自动化把文件导出到本地,再用另外的 Python 代码对文件数据进行读取、解析和存储。

州的先生之前对「旺店通」桌面客户端进行的「旺店通订单数据分析平台」即是使用这种处理方式进行数据的获取(旺店通是一个聚合的ERP平台,里面可以由商家对接多个电商平台,然后进行订单处理。算是一个风险极低的获取自己订单数据的渠道)。

如果数据不能通过导出获取,那么一个方式是通过 PyWinAuto 中的控件属性进行数据的提取;另一个方式,则是抓包了。

关于抓包,此是后话。

关于桌面客户端程序的自动化,你还有什么心得和经验?欢迎留言讨论!

0 人点赞