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库

posted @ 2022-07-08 13:56  dion至君  阅读(199)  评论(0编辑  收藏  举报