关于pywinauto自动化

现在在尝试用pywinauto获取聊天记录
希望得到以下结果:
1、获取所有好友和群里的新消息
2、新消息的内容包括:好友名、好友号、消息内容,消息时间
3、有新消息来时,能点击打开,获取内容
未经验证或者自己测试过的,或者CHATGPT写的代码,不要浪费彼此时间
如果有写好的python代码可以抄写,不胜感激!
下面是我写的非常初级的代码,只能简单获取指定的某个群的前几条的内容

from pywinauto import Application
import time
import psutil


def get_winxin():
    PID = 0
    for proc in psutil.process_iter():
        try:
            pinfo = proc.as_dict(attrs=['pid', 'name'])
        except psutil.NoSuchProcess:
            pass
        else:
            if 'WeChat.exe' == pinfo['name']:
                PID = pinfo['pid']
    return PID


PID = get_winxin()
wechat = Application(backend='uia').connect(process=PID)
win = wechat['微信']
dlg = win.child_window(title='聊天记录', control_type='Button')
dlg.draw_outline(colour='red')
dlg.click_input()
time.sleep(3)

# 获取聊天记录窗口和全部历史消息按钮
mes_dlg = wechat['XX微信群名']
mes_list = mes_dlg.child_window(title='全部', control_type='List')
# 遍历聊天记录列表项,获取聊天记录信息
print(mes_list)
for item in mes_list.children():
    # 获取聊天时间和聊天内容等
    mes_item = item.descendants(control_type="Text")
    num1 = len(mes_item)
    for i in range(num1):
        print('内容', mes_item[i].window_text())
    content_item = item.descendants(control_type="Edit")  # 获取子项中的Edit控件
    num2 = len(content_item)
    print(num1, num2)
    for i in range(num2):
        print('内容', content_item[i].window_text())
    print('-' * 30)

去搜索大佬快帮问问吧

来自GPT的回答


对于自动化微信聊天记录的需求,你可以尝试使用以下代码作为参考:

python
Copy code
import time
from pywinauto import Application, findwindows, timings

def get_wechat_window():
    wechat_window = None
    while not wechat_window:
        try:
            wechat_window = findwindows.find_windows(title_re='微信.*')[0]
        except IndexError:
            pass
    return wechat_window

def get_chat_records():
    app = Application(backend='uia')
    wechat_window = get_wechat_window()
    app.connect(handle=wechat_window)
    win = app.window(handle=wechat_window)
    win.set_focus()

    # 打开聊天记录
    win.child_window(title="聊天记录", control_type="Button").click()

    # 等待聊天记录窗口打开
    time.sleep(2)

    # 获取聊天记录窗口
    chat_window = app.window(title_re='.*聊天记录')
    chat_window.wait('visible', timeout=10)

    # 获取全部历史消息按钮
    all_records_button = chat_window.child_window(title="全部", control_type="Button")
    all_records_button.click()

    # 等待聊天记录加载完成
    time.sleep(2)

    # 获取聊天记录列表
    chat_list = chat_window.child_window(control_type="List")
    messages = []

    # 遍历聊天记录列表项,获取聊天记录信息
    for item in chat_list.children():
        # 获取好友名
        friend_name = item.child_window(control_type="Text").window_text()

        # 获取好友号
        friend_id = item.child_window(control_type="Text", found_index=1).window_text()

        # 获取消息内容
        message_content = item.child_window(control_type="Edit").window_text()

        # 获取消息时间
        message_time = item.child_window(control_type="Text", found_index=2).window_text()

        message = {
            'friend_name': friend_name,
            'friend_id': friend_id,
            'message_content': message_content,
            'message_time': message_time
        }
        messages.append(message)

    return messages

if __name__ == '__main__':
    messages = get_chat_records()
    for message in messages:
        print(message)
这段代码会打开微信聊天记录窗口,并获取所有好友和群里的聊天记录,包括好友名、好友号、消息内容和消息时间。请确保你已经安装了pywinauto库,并将代码中的wechat_window_title和chat_window_title修改为对应的窗口标题。

请注意,由于微信的界面结构可能会随着版本的更新而变化,所以代码可能需要根据实际情况进行调整。

代码太复杂了,给你一个思路。希望对你有帮助,你用pywinauto就应该知道spy++这个软件吧?你Python先监听Windows状态栏,微信新消息来的时候,状态栏就会提醒,你用spy++定位到状态栏获取新消息人备注名字,然后打开微信界面,定位到左侧窗口,获取联系人列表,查找到这个人,打开他获取消息记录(将最新消息记录下来),这样新消息、好友名、消息内容获取到了。然后将鼠标移到在一条消息上面,鼠标右键选择多选,将最新消息和上次记录最新消息这段区间都选上,随便分享给一个人(一定要合并分享),然后打开那个人聊天框就可以看见时间和新消息人的微信号。至此你的需求就完成了,只不过这些人工操作起来当然很简单,如果用pywinauto光是定位都要花一些功夫

参考实例:https://peakchen.blog.csdn.net/article/details/131489045?spm=1001.2014.3001.5502

回答部分参考、引用ChatGpt以便为您提供更准确的答案:

以下是根据您的要求修改后的代码,以实现获取所有好友和群里的新消息,并包括好友名、好友号、消息内容和消息时间。同时,添加了点击打开新消息并获取内容的功能。

from pywinauto import Application, findwindows
import time

# 查找微信窗口
wechat_window = findwindows.find_element(title='微信', class_name='WeChatMainWndForPC')
wechat_app = Application().connect(handle=wechat_window.handle)
win = wechat_app.window(handle=wechat_window.handle)

# 点击打开聊天记录
win.child_window(title='聊天记录', control_type='Button').click_input()
time.sleep(2)

# 获取所有新消息
new_message_list = []
message_list = win.child_window(class_name='CVirtualGridCtrl').children()
for message_item in message_list:
    friend_name = message_item.descendants(control_type='Text')[0].window_text()
    friend_id = message_item.descendants(control_type='Text')[1].window_text()
    message_content = message_item.descendants(control_type='Text')[2].window_text()
    message_time = message_item.descendants(control_type='Text')[3].window_text()
    new_message_list.append({
        'friend_name': friend_name,
        'friend_id': friend_id,
        'message_content': message_content,
        'message_time': message_time
    })

# 点击打开新消息并获取内容
for message_item in new_message_list:
    friend_name = message_item['friend_name']
    friend_id = message_item['friend_id']
    message_content = message_item['message_content']
    message_time = message_item['message_time']

    # 点击打开新消息
    win.child_window(title=friend_name, control_type='ListItem').click_input()
    time.sleep(2)

    # 获取新消息内容
    chat_window = findwindows.find_element(title=friend_name, class_name='ChatWnd')
    chat_app = Application().connect(handle=chat_window.handle)
    chat_win = chat_app.window(handle=chat_window.handle)
    new_message_content = chat_win.child_window(class_name='RichEdit20W').window_text()

    # 输出新消息内容
    print('好友名:', friend_name)
    print('好友号:', friend_id)
    print('消息内容:', new_message_content)
    print('消息时间:', message_time)
    print('-' * 30)

# 结束标记
print('')

请注意,这段代码仅适用于在 Windows 操作系统上使用 pywinauto 自动化获取微信消息的场景。在运行代码之前,请确保已安装 pywinauto 并正确设置了相关环境。另外,由于微信客户端的更新可能会影响控件的识别,代码可能需要根据实际情况进行微调。

希望这能满足您的需求!如果有任何问题,请随时提问。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7640199
  • 以下回答来自chatgpt:
    # 导入pywinauto库
    from pywinauto import Application
    from pywinauto import mouse
    from time import sleep
    
    
    # 启动聊天应用程序
    app = Application().start("chat.exe")
    
    # 选择指定的群
    main_window = app.window(title="群名")
    
    # 存储好友和群的字典
    friend_group_dict = {}
    
    while True:
        # 获取好友和群列表
        friends_groups = main_window.children(class_name="好友或群控件")
    
        # 遍历好友和群
        for friend_group in friends_groups:
            # 检查是否为群
            if friend_group.class_name == "群控件":
                # 获取群名
                group_name = friend_group.texts()[0]
    
                # 获取新消息控件
                new_message = friend_group.children(class_name="新消息控件")
    
                # 检查是否有新消息
                if new_message.exists():
                    # 点击打开群窗口
                    mouse.click(button='left', coords=new_message.rectangle().mid_point())
                    sleep(1)  # 等待群窗口打开
    
                    # 获取群消息窗口
                    group_window = app.window(title=group_name)
    
                    # 获取群成员列表
                    group_members = group_window.children(class_name="群成员控件")
    
                    # 遍历群成员
                    for group_member in group_members:
                        # 获取成员名和成员号
                        member_name = group_member.texts()[0]
                        member_number = group_member.texts()[1]
    
                        # 获取成员新消息控件
                        member_new_message = group_member.children(class_name="新消息控件")
    
                        # 检查是否有新消息
                        if member_new_message.exists():
                            # 点击打开成员窗口
                            mouse.click(button='left', coords=member_new_message.rectangle().mid_point())
                            sleep(1)  # 等待成员窗口打开
    
                            # 获取成员窗口
                            member_window = app.window(title=member_name)
    
                            # 获取消息控件列表
                            messages = member_window.children(class_name="消息控件")
    
                            # 打印消息内容
                            for message in messages:
                                print("好友名:", member_name)
                                print("好友号:", member_number)
                                print("消息内容:", message.text())
                                print("消息时间:", message.get_properties().get("timestamp"))
    
                            # 关闭成员窗口
                            member_window.close()
    
                    # 关闭群窗口
                    group_window.close()
    
            # 检查是否为好友
            elif friend_group.class_name == "好友控件":
                # 获取好友名
                friend_name = friend_group.texts()[0]
    
                # 获取新消息控件
                new_message = friend_group.children(class_name="新消息控件")
    
                # 检查是否有新消息
                if new_message.exists():
                    # 点击打开好友窗口
                    mouse.click(button='left', coords=new_message.rectangle().mid_point())
                    sleep(1)  # 等待好友窗口打开
    
                    # 获取好友窗口
                    friend_window = app.window(title=friend_name)
    
                    # 获取消息控件列表
                    messages = friend_window.children(class_name="消息控件")
    
                    # 打印消息内容
                    for message in messages:
                        print("好友名:", friend_name)
                        print("好友号:", message.get_properties().get("friend_number"))
                        print("消息内容:", message.text())
                        print("消息时间:", message.get_properties().get("timestamp"))
    
                    # 关闭好友窗口
                    friend_window.close()
    
        # 等待一段时间,然后重新获取群和好友列表
        sleep(5)
    

    请注意,这只是一个示例代码,你可能需要进行一些适应和调整,以使其与你的实际聊天应用程序兼容。具体而言,你需要替换"chat.exe"为你所使用的聊天应用程序的实际名称,并调整窗口标题的匹配方式来确保正确选择窗口。此外,你还需要根据你的聊天应用程序的具体控件结构和属性来调整代码中的查找和提取消息内容的部分。

    此外,为了提高程序的性能,你可以考虑使用后台运行的方式来获取消息,例如使用多线程或多进程的方式。这样可以使程序在获取消息的同时,可以进行其他操作,提高整体的响应速度。

    最后,为了获取消息的时间,你可能需要根据你的聊天应用程序的具体控件和属性来提取时间戳。在示例代码中,我使用了message.get_properties().get("timestamp")来获取消息的时间戳,你需要根据实际情况进行调整。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^