20220708 pywinauto相关
如果需要监听wetchat消息为之奈何?就pywinauto而言,有两种监听方式。1. 每次处理信息后,将该聊天框删除,然后再获取聊天列表。2. 获取聊天列表,深拷贝一下,然后再次获取,对比两个列表的顺序,不一样的就是新的消息。当然这种监听方式比较慢。还有大佬提出:可以每次把2-3条信息 做为一个比对物, 这样就可以完整的监听到详细对话表。
看了下官方文档,查看app对应的属性窗口控件,可以使用print_control_identifiers()方法。但测试了下,微信中似乎没法用这个识别控件结构?报错记录:
pywinauto.findbestmatch.MatchError: Could not find 'Properties' in 'dict_keys(['Pane'])'
关于如何获取应用程序窗口句柄,我找到了这篇文章。(参考链接:https://blog.csdn.net/qq_30076271/article/details/122803937?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2-122803937-blog-120214006.pc_relevant_multi_platform_whitelistv1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2-122803937-blog-120214006.pc_relevant_multi_platform_whitelistv1&utm_relevant_index=5以及https://blog.csdn.net/m0_46435052/article/details/123800736)
另一个关于破解接口的方法的参考链接:https://blog.csdn.net/weixin_43881394/article/details/108219381?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-108219381-blog-122889438.pc_relevant_aa2&spm=1001.2101.3001.4242.1&utm_relevant_index=2
1、
【微信】控件采用了某种方法屏蔽了,用常规的pywinauto查找不到控件信息。
pywinauto可以配合spy++中文版查看控件信息。发现具体还是pywinauto的操作功能不熟悉,具体操作可以参考链接:https://blog.csdn.net/weixin_44251585/article/details/105792768及https://www.cnblogs.com/little-kwy/p/11926182.html,还是要多练多学。
0715
继续学习,可参考
1. https://static.kancloud.cn/gnefnuy/pywinauto_doc/1193039 这是pywinauto中文手册
2. https://blog.csdn.net/smart_num_1/article/details/122406466 pywinauto自动微信监控
3. https://www.cnblogs.com/qican/p/13209744.html pywinauto对窗口进行操作
4. https://blog.csdn.net/smart_num_1/article/details/108377104 打造wechat小客服
5.
(0)https://juejin.cn/post/7107174495475433503 Pywinauto自动化操作PC微信提取好友微信号
(1)https://www.cnblogs.com/xingag/p/15196124.html 简单实现微信模拟点击发送消息
(2)https://blog.csdn.net/shawpan/article/details/78170200?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-78170200-blog-107815326.pc_relevant_aa&spm=1001.2101.3001.4242.2&utm_relevant_index=4 pywinauto的使用——各控件的操作
(3)https://xuhss.com/marketing/experience/pywinauto-wechat 虚坏叔叔的微信公众号爬虫
6. 关于pywinauto翻页获取数据
(1)https://www.cnblogs.com/xp1315458571/p/13892205.html
(2)http://fancyerii.github.io/2021/05/24/pywinauto-wechat-crawler-2/
(3)https://blog.csdn.net/adamyouyou/article/details/89462404 pywinauto获取控件信息
2、
220717 继续学习pywinauto操作,发现自己压根没理解pywinauto的操作方式,其实跟selenium测试工具的操作大同小异,都是模拟鼠标操作点击、输入文本、回车、移动鼠标之类的。先解构具体操作规程。目前试验了下,用如下命令可以获取到微信聊天下面的窗口展示出的聊天列表。正常聊天分解:找到搜索框、输入对象名、回车、点击对象头像(其实还应有是否找到对象)
# -*- coding:utf-8 -*- import psutil import pywinauto from pywinauto.application import Application from pywinauto.timings import Timings from PIL import Image import io import sys sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf8') def find_PID(): PID = 0 print("获取微信进程id") for proc in psutil.process_iter(): try: pinfo = proc.as_dict(attrs=['pid', 'name']) except psutil.NoSuchProcess: print("没有打开微信") pass else: if 'WeChat.exe' == pinfo['name']: PID = pinfo['pid'] print("找到微信进程") return PID PID = find_PID() print("用PyWinAuto 实例化一个应用") app = Application(backend='uia').connect(process=PID) win = app['微信'] win.draw_outline(colour='red') #print(win.print_control_identifiers()) #def get_text(): # try: # 在这里如此定位控件是最快的,逐级定位思路清晰,定位精准 # return win.child_window(title="聊天", control_type="List").child_window(control_type="Edit", found_index=0).window_text() # except: # return '' def get_chatname(): p = win.child_window(title="会话", control_type="List") lst = [] for i in p: lst.append(i.window_text()) return lst print(get_chatname()) #def get_text(): # lst1 = [] # name = get_chatname() # win_dialog = win.child_window(title="会话", control_type="List").draw_outline(colour='red') # for i in name: # win_dialog.child_window(title="%s"%i, control_type="Button").wrapper_object().click() # win_dialog.draw_outline(colour='green') # s = win_dialog.child_window(control_type="Edit",found_index=0).window_text() # lst1.append(s) # return lst1
模仿大佬的思路,实现了给指定微信号发送信息的功能,我把大佬写的@全员的功能屏蔽掉了,记录如下:
# -*- coding:utf-8 -*- import psutil import pywinauto from pywinauto.application import Application from pywinauto.timings import Timings #from PIL import Image import pyautogui import openpyxl from time import sleep import io import sys # 改变标准输出的默认编码 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("D:\python-scripts\Clawer_wetchat\参数.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()) #wb = openpyxl.load_workbook("D:\python-scripts\Clawer_wetchat\参数.xlsx") #wscs = wb["参数"] #message = wscs['B3'].value #print("是否艾特:" + message)
3、
20220718
今天看到pywinauto网上的一篇教程还不错,记录如下https://www.lmlphp.com/user/17477/article/item/513372/。
20220719
今天尝试了下,发现pywinauto获取微信聊天会话的记录有些困难,多层叠加的对话框,提取关键信息不好提取。在网上又找了其他的思路,有人提到可以用uiautomation工具做一个微信工具。
开始尝试学习uiautomation库