解放双手, python自动化操作电脑端微信

写一段能运转、实现需求的代码不难,但要写一段在各种情况下都能长期稳定运行的代码是真心不容易。

图片

一. 工具准备

01   python3.* 版本

https://www.python.org/downloads/release/python-395

图片

python 信息

02   pycharm开发工具

https://www.jetbrains.com/pycharm/

pycharm是付费软件, 可下载免费的社区版本, 或自行选择其他开发工具

图片

pycharm 开发界面

03   Inspect.exe 控件识别工具(仓库已失效)

https://gitee.com/moxf/gui-inspect-tool.git

win窗口, 布局检查器和布局验证工具, 如下图所示,

图片

Inspect.exe

官网提示: Inspect.exe 是遗留工具, 推荐使用 Accessibility Insights

图片官方提示

Accessibility Insights for Windows 界面如下(确实好看了不少)

图片

Accessibility Insights for Windows

04  WeChat.exe

图片

WeChat 聊天窗口(图片来自官网)


二. 安装依赖包

01   pywinauto是什么

摘取官方介绍如下

pywinauto is a set of python modules to automate the Microsoft Windows GUI. At its simplest it allows you to send mouse and keyboard actions to windows dialogs and controls, but it has support for more complex actions like getting text data.

来翻译一下

pywinauto是一组用于自动化Microsoft Windows GUI的python模块。最简单的是,它允许您将鼠标和键盘操作发送到Windows对话框和控件,但它支持更复杂的操作,例如获取文本数据。

简单点说就是有了这个模块,就可以直接通过python模拟我们手工操作windows桌面程序, 简直是自动化测试之光啊, 从此解放双手, 开启了测试轻松摸鱼的上班生活。安装方法就在下边啦, 一行命令轻松解决, 不过因为某些原因, 下载速度较慢, 或者下载不到, 需要多尝试几次。

通过 pip 安装 pywinauto

pip install pywinauto

推荐使用这种方法, 因为简单省事, 当然不怕折腾的小伙伴也可以在官方仓库下载源码进行安装, 源码安装需要自行解决相关的依赖问题。

02   keyboard 官方介绍如下

Take full control of your keyboard with this small Python library. Hook global events, register hotkeys, simulate key presses and much more.

翻译一下:

通过这个小型Python库完全控制您的键盘。钩住全局事件,注册热键,模拟按键等。

简单来说就是, 有了这个库, 我们就可在通过代码模拟我们手动操作键盘了, 各种快捷键组合, 一行代码就能解决, 简直爽歪歪。就下来的问题就是要怎么安装了。
通过 pip 安装 keyboard

pip install keyboard

三. pywinauto发送微信消息

1. pywinauto的一些基本操作记录如下, 这里就直接以电脑端的微信作为例子, 进行演示:

(1) 通过pywinauto调起电脑端微信

from pywinauto.application import Application
# 通过exe文件打开wx程序
# wx_path 选择自己电脑端微信的安装路径
wx_path = r'D:\WeChat\WeChat.exe'
wx_app = Application(backend='uia').start(wx_path)

(2) 通过进程号连接到微信

from pywinauto.application import Application

wx_path = r'D:\WeChat\WeChat.exe'
# 调起界面
Application(backend='uia').start(wx_path)
# 连接到wx, 连接已有微信进程(进程号在 任务管理器-详细信息 可以查看)
# 任务管理器中查询出来会有两个WeChat.exe 的进程
# 具体是哪一个需要自己试一下
wx_app = Application(backend='uia').connect(process=33140)

图片

任务管理器

2. backend 的选择以及控件查看工具 Inspect.exe 的使

安装了 pywinauto 第一个必要的事情是确定哪种可访问性技术(pywinauto的backend)可以用于将要操作的应用程序。Windows上受支持的辅助功能技术列表:

Win32 API (backend="win32") - 默认backend

MFC, VB6, VCL, 简单的WinForms控件和大多数旧的遗留应用程序

MS UI Automation (backend="uia")

WinForms, WPF, Store apps, Qt5, 浏览器

如果仍然不确定哪个backend最适合,可以使用 Inspect.exe 或者 Spy++ 等检查工具, 下载地址(仓库已失效):

https://gitee.com/moxf/gui-inspect-tool.git

将inspect左上角的下拉列表中切换到“UI Automation”,然后鼠标点一下需要测试的程序窗体,inspect就会显示相关信息,如下图所示, 说明backend为uia

图片

Inspect.exe 界面

3. 获取微信的主窗口, 打印所有控件信息

通过Inspect.exe可以获得微信主窗口的class_name: WeChatMainWndForPC, 接下来通过python对窗口进行定位:

process = 33140
# 调起界面
Application(backend='uia').start(wx_path)
# 连接到wx
wx_app = Application(backend='uia').connect(process=process)
# 定位到主窗口
wx_win = wx_app.window(class_name='WeChatMainWndForPC'

获取到 WeChatMainWndForPC 之后, 打印微信窗口的所有控件:

# 打印当前窗口的所有controller(控件和属性)
# 参数说明: 
# depth: 打印的深度,缺省时打印最大深度。
# filename: 将返回的标识存成文件(生成的文件与当前运行的脚本在同一个路径下)
wx_win. print_control_identifiers(depth=None, filename=None)

图片

微信所有控件打印信息

图片

具体的对话框

4. 定位到联系人

现在微信的所有控件我们都获取到了, 那么接下来要怎样写代码才能试下那我们的目标: 主动发送消息给对应的联系人哪?

分析微信的窗口控件, 可以知道联系人的窗口信息如下:

child_window(title="聊天1", control_type="ListItem")

那么在python中如何定位到对话框?

wx_chat_win = wx_win.child_window(title=send_to, control_type="ListItem")

对话框定位获取后我们需要定位到输入信息的编辑框中, 才能实现输入消息,代码如下:

wx_msg_input = wx_win.child_window(title="输入", control_type="Edit")

现在消息框和联系人的信息我们都获取到了, 但是我们不能保证每次进入微信时, 默认的联系人就是我们需要发送消息的联系人, 这时我们需要先定位到对应的联系人, 并在代码中模拟点击, 来聚焦到所需的对话框:

# 聚焦到所需的对话框
    wx_chat_win.click_input()

为了保证我们输入消息时鼠标聚焦在文本框内, 我们先进行一次模拟点击:

# 聚焦到文本框
wx_msg_input.click_input()

5. 发送消息到联系人

我们定位到了联系人, 也定位到了文本框, 接下来就是发送消息给他了, 发送消息有两种方法, 第一种就是使用pywinauto的方法 type_keys() 方法, 第二种就是通过 keyboard 模拟键盘的操作。两者的区别: pywinauto是从前到后啪啪啪的输入,keyboard是啪一下就出来了, 很快。

(1) 使用 pywinauto type_keys() 发送消息

# 输入发送信息
wx_msg_input.type_keys('发送信息test', i)
# 点击发送按钮
wx_send_btn.click_input()

(2) 使用 keyboard 模拟键盘操作发送消息

# 输入发送信息
keyboard.write(send_msg)
# 模拟按下键盘enter键
keyboard.send('enter')

6. 程序运行效果

图片

posted @ 2023-01-23 23:06  胡安  阅读(5784)  评论(0编辑  收藏  举报