需求:利用PC端微信实现自动向文件传输助手,好友等发送信息
库说明
psutil: 获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息,用于获取进程ID pywinauto:自动化Microsoft Windows GUI的python模块,用于检索微信窗口的控件位置(https://www.kancloud.cn/gnefnuy/pywinauto_doc) pyautogui:PyAutoGUI是一个纯Python的GUI自动化工具,其目的是可以用程序自动控制鼠标和键盘操作用于控制键盘热键 pyinstaller -F xxx.py 最后用打包exe
可使用psutil 库来查看所有进程的名字,匹配进程名字返回进程ID,,进程名字ID查看工具:inspect.exe:
「inspect.exe」https://www.aliyundrive.com/s/JDSBosz7CfR 点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。
- import psutil
-
- # 获取进程id
- def get_pid(processName):
- for proc in psutil.process_iter():
- try:
- if (proc.name() == processName):
- print(proc.name())
- print(str(proc.pid))
- return proc.pid
- except psutil.NoSuchProcess:
- pass
- return -1
- # 打开微信的快捷键
- pyautogui.hotkey('ctrl', 'alt', 'w')
- # 利用进程ID初始化一下实例
- app = Application(backend='uia').connect(process=procId)
- # print(app.window())
- # 检索微信窗口
- main_Win = app.window(class_name='WeChatMainWndForPC')
- # 打印所有的窗口控件信息
- # main_Win.print_control_identifiers()
- # 最大化
- main_Win.maximize()
首先定位“通讯录”元素:main_Win.chind_window() 需要二个参数:title和control_type
点击该元素click_input()
- # 切换到通讯录
- btn1 = main_Win.child_window(title="通讯录", control_type="Button").wrapper_object()
- # main_Win.Properties.Button3.click()
- btn1.draw_outline(colour='red')
- btn1.click_input()
- # 搜索联系人--文件传输助手
- searchKey = ‘张三’
- searchEdit = main_Win.child_window(title="搜索", control_type="Edit").wrapper_object()
- searchEdit.draw_outline(colour='red')
- searchEdit.click_input()
- searchEdit.type_keys(searchKey)
- sleep(2)
- # 选择搜索出的第一个
- try:
- selectItem = main_Win.child_window(title=searchKey, control_type="ListItem").wrapper_object()
- selectItem.click_input()
- except:
- print("对话框已打开")
- # 清空对话框
- pyautogui.hotkey('ctrl', 'a')
- pyautogui.hotkey('backspace')
- # 发送消息
- sendMsg = ‘How are you?’
- inputMsg = main_Win.child_window(title="输入", control_type="Edit").wrapper_object()
- inputMsg.click_input()
- inputMsg.type_keys(sendMsg, with_spaces=True)
-
- # 发送
- # sendbtn = main_Win["sendBtn"]
- # sendbtn.draw_outline(colour='red')
- # sendbtn.click_input()
- # 回车发送
- pyautogui.hotkey('enter')
- print(xlsbody[0][i] + ":发送完成")
- # 置顶
- top = main_Win.child_window(title="置顶", control_type="Button").wrapper_object()
- # 定位到置顶元素,画个红色的方框醒目
- top.draw_outline(colour='red')
- top.click_input()
-
- # 取消置顶
- notop = main_Win.child_window(title="取消置顶", control_type="Button").wrapper_object()
- notop.draw_outline(colour='red')
- notop.click_input()
- # 改变标准输出的默认编码
- sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf8')
-
-
- # 获取进程id
- def get_pid(processName):
- for proc in psutil.process_iter():
- try:
- if (proc.name() == processName):
- print(proc.name())
- print(str(proc.pid))
- return proc.pid
- except psutil.NoSuchProcess:
- pass
- return -1
-
-
- # 获取参数
- def get_xls():
- # 打开参数表
- print("获取参数中")
- wb = openpyxl.load_workbook("参数.xlsx")
- wscs = wb["参数"]
- groupname = wscs['B1'].value.split(',') # 转换为列表组名
- groupcoount = len(groupname)
- message = wscs['B2'].value
- atall = wscs['B3'].value
- print(groupname)
- print("共计:" + str(groupcoount) + "组")
- print("发送内容:" + message)
- print("是否@所有人:" + atall)
- return groupname, message, atall, groupcoount
-
-
- # 获取主窗口
- def get_body(procId, xlsbody):
- # 打开微信的快捷键
- pyautogui.hotkey('ctrl', 'alt', 'w')
- # 利用进程ID初始化一下实例
- app = Application(backend='uia').connect(process=procId)
- # print(app.window())
- # 检索微信窗口
- main_Win = app.window(class_name='WeChatMainWndForPC')
- # 打印所有的窗口控件信息
- # main_Win.print_control_identifiers()
- # 最大化
- main_Win.maximize()
- # 置顶
- top = main_Win.child_window(title="置顶", control_type="Button").wrapper_object()
- top.draw_outline(colour='red')
- top.click_input()
-
- print(main_Win.is_dialog)
- for i in range(xlsbody[3]):
- # 切换到通讯录
- btn1 = main_Win.child_window(title="通讯录", control_type="Button").wrapper_object()
- # main_Win.Properties.Button3.click()
- btn1.draw_outline(colour='red')
- btn1.click_input()
- # 搜索联系人--文件传输助手
- # print(i)
- searchKey = xlsbody[0][i]
- searchEdit = main_Win.child_window(title="搜索", control_type="Edit").wrapper_object()
- searchEdit.draw_outline(colour='red')
- searchEdit.click_input()
- searchEdit.type_keys(searchKey)
- sleep(2)
- # 选择搜索出的第一个
- try:
- selectItem = main_Win.child_window(title=searchKey, control_type="ListItem").wrapper_object()
- selectItem.click_input()
- except:
- print("对话框已打开")
- # 清空对话框
- pyautogui.hotkey('ctrl', 'a')
- pyautogui.hotkey('backspace')
- # if (xlsbody[2] == "是"):
- # # @所有人
- # sendMsg = "@"
- # inputMsg = main_Win.child_window(title="输入", control_type="Edit").wrapper_object()
- # inputMsg.click_input()
- # inputMsg.type_keys(sendMsg, with_spaces=True)
- # allpeople = main_Win.child_window(title="所有人", control_type="Text").wrapper_object()
- # allpeople.draw_outline(colour='red')
- # allpeople.click_input()
-
- # 发送消息
- sendMsg = xlsbody[1]
- inputMsg = main_Win.child_window(title="输入", control_type="Edit").wrapper_object()
- inputMsg.click_input()
- inputMsg.type_keys(sendMsg, with_spaces=True)
-
- # 发送
- # sendbtn = main_Win["sendBtn"]
- # sendbtn.draw_outline(colour='red')
- # sendbtn.click_input()
- # 回车发送
- pyautogui.hotkey('enter')
- print(xlsbody[0][i] + ":发送完成")
- # 取消置顶
- notop = main_Win.child_window(title="取消置顶", control_type="Button").wrapper_object()
- notop.draw_outline(colour='red')
- notop.click_input()
-
-
- if __name__ == '__main__':
- procId = get_pid("WeChat.exe")
- if (procId == -1):
- print("微信未运行")
- else:
- get_body(procId, get_xls())
说明:学习视频来源pywinauto实现微信自动发送消息的小实践_哔哩哔哩_bilibili
感谢UP主分享。