【uiautomation】微信好友列表获取(存储到txt中)

本文介绍如何利用uiautomation库获取微信好友列表,并将其存储到txt文件中。通过滚动屏幕并判断元素是否存在来遍历联系人,详细讲解了代码实现过程和关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝

🥰 博客首页:knighthood2001

🌞 系列专栏:uiautomation

😗 欢迎点赞👍评论🗨️

❤️ 热爱python,期待与大家一同进步成长!!❤️ 

        目的:使用uiautomation进行微信好友的获取,并存储到txt文件中。

目录

一、前言

二、具体步骤

模块导入

打开微信

进入通讯录管理

定位具体元素 

定义所用内容

获取并存储联系人

三、全部代码展示

四、总结


一、前言

实现过程:如下图 

打开通讯录管理,通过不断滚动鼠标,获取新的联系人列表,将他们逐个添加到列表与txt文件中。

当鼠标滚动到底时,按空格键,爬取最后的联系人列表。并打印代码运行时间。

二、具体步骤

模块导入

import subprocess
import uiautomation as auto
import time

打开微信

# ToDo 这里需要更改微信所在地址,可通过桌面微信图标右键打开文件所在的位置查找到路径
subprocess.Popen('E:\微信\WeChat\WeChat.exe')

进入通讯录管理

wechatWindow = auto.WindowControl(searchDepth=1, className='WeChatMainWndForPC', Name='微信')

# 点击通讯录
button = wechatWindow.ButtonControl(Name='通讯录')
button.Click()
# 点击通讯录管理
administration = wechatWindow.ButtonControl(Name="通讯录管理")
administration.Click()

定位具体元素 

 

代码中list1就是下图黄色框框

communication_administration = auto.WindowControl(Name="通讯录管理", ClassName="ContactManagerWindow")
# 将鼠标放至内容的中心,滚轮对联系人列表才能生效
communication_administration.MoveCursorToMyCenter()
list1 = communication_administration.ListControl(Name="")

注意:communication_administration.MoveCursorToMyCenter() 表示将鼠标放至内容的中心,由于这里将其放到通讯录管理页面的中心,由于这样,鼠标在联系人列表这边,因此滚轮对联系人列表才能生效。

定义所用内容

# a表示存储列表,b表示计数器,flag控制代码是否退出
a = []
b = 1

flag = True
start_time = time.time()
print("""开始时间:{}""".format(start_time))

这里也定义了初始时间,方便代码运行结束查看代码运行时间。

接下来就到了本文最重要的地方了


获取并存储联系人

先放代码

while flag:
    list1 = communication_administration.ListControl(Name="")
    nickname = list1.GetChildren()[0].TextControl()
    '''判断是不是在列表a中,如果列表中没有,则添加'''
    if nickname.Name not in a:
        print(b, '', nickname.Name)
        b += 1
        a.append(nickname.Name)
        with open('name.txt', 'a', encoding='utf-8') as f:
            f.write(nickname.Name)
            f.write('\n')
    # 滚轮下滚
    auto.WheelDown(waitTime=0.01)


    # 手动实现滚轮滚动到底操作
    # 空格
    if auto.IsKeyPressed(auto.Keys.VK_SPACE):
        print("到底了")
        for j in list1.GetChildren()[1:]:
            last_nickname = j.TextControl()

            if last_nickname not in a:
                print(b, '', last_nickname.Name)
                b += 1
                a.append(last_nickname)
                with open('name.txt', 'a', encoding='utf-8') as f:
                    f.write(last_nickname.Name)
                    f.write('\n')
        print(a)
        flag = False
        end_time = time.time()
        sum_time = end_time - start_time
        print("""运行时间:{}s""".format(sum_time))

讲解:①这里我采用的是while True类似的一直执行的代码,只不过我这里用flag控制代码是否继续运行,而flag由我们在滚轮滚到底部时,按空格键改变flag值,最终停止运行代码。 

②首先我们定位到每次显示的第一个联系人,判断其是否在列表a中,如果不在,就添加,并且保存到name.txt文件中;

    list1 = communication_administration.ListControl(Name="")
    nickname = list1.GetChildren()[0].TextControl()
    '''判断是不是在列表a中,如果列表中没有,则添加'''
    if nickname.Name not in a:
        print(b, '', nickname.Name)
        b += 1
        a.append(nickname.Name)
        with open('name.txt', 'a', encoding='utf-8') as f:
            f.write(nickname.Name)
            f.write('\n')

③不管该判断成不成立,都执行鼠标滚轮下滚的操作;

    auto.WheelDown(waitTime=0.01)

④滚到最底端的时候,由于笔者目前没有较好的方法判断其是否在最底端,因此采用人工按空格的方式来让代码知道滚轮到最底端了,然后在该页面遍历所有联系人元素,判断其是否存在列表中,不在则添加,并添加到name.txt文件中;

    # 手动实现滚轮滚动到底操作
    # 空格
    if auto.IsKeyPressed(auto.Keys.VK_SPACE):
        print("到底了")
        for j in list1.GetChildren()[1:]:
            last_nickname = j.TextControl()

            if last_nickname not in a:
                print(b, '', last_nickname.Name)
                b += 1
                a.append(last_nickname)
                with open('name.txt', 'a', encoding='utf-8') as f:
                    f.write(last_nickname.Name)
                    f.write('\n')
auto.IsKeyPressed(auto.Keys.VK_SPACE)表示键盘按空格

 

⑤最后打印列表a,更改flag,打印代码运行时间。

三、全部代码展示

# -*- coding: utf-8-*-
import subprocess
import uiautomation as auto
import time

# ToDo 这里需要更改微信所在地址,可通过桌面微信图标右键打开文件所在的位置查找到路径
subprocess.Popen('E:\微信\WeChat\WeChat.exe')

wechatWindow = auto.WindowControl(searchDepth=1, className='WeChatMainWndForPC', Name='微信')

# 点击通讯录
button = wechatWindow.ButtonControl(Name='通讯录')
button.Click()
# 点击通讯录管理
administration = wechatWindow.ButtonControl(Name="通讯录管理")
administration.Click()

communication_administration = auto.WindowControl(Name="通讯录管理", ClassName="ContactManagerWindow")
# 将鼠标放至内容的中心,滚轮对联系人列表才能生效
communication_administration.MoveCursorToMyCenter()
list1 = communication_administration.ListControl(Name="")
# a表示存储列表,b表示计数器,flag控制代码是否退出
a = []
b = 1

flag = True
start_time = time.time()
print("""开始时间:{}""".format(start_time))
while flag:
    list1 = communication_administration.ListControl(Name="")
    nickname = list1.GetChildren()[0].TextControl()
    '''判断是不是在列表a中,如果列表中没有,则添加'''
    if nickname.Name not in a:
        print(b, '', nickname.Name)
        b += 1
        a.append(nickname.Name)
        with open('name.txt', 'a', encoding='utf-8') as f:
            f.write(nickname.Name)
            f.write('\n')
    # 滚轮下滚
    auto.WheelDown(waitTime=0.01)


    # 手动实现滚轮滚动到底操作
    # 空格
    if auto.IsKeyPressed(auto.Keys.VK_SPACE):
        print("到底了")
        for j in list1.GetChildren()[1:]:
            last_nickname = j.TextControl()

            if last_nickname not in a:
                print(b, '', last_nickname.Name)
                b += 1
                a.append(last_nickname)
                with open('name.txt', 'a', encoding='utf-8') as f:
                    f.write(last_nickname.Name)
                    f.write('\n')
        print(a)
        flag = False
        end_time = time.time()
        sum_time = end_time - start_time
        print("""运行时间:{}s""".format(sum_time))



注意: 由于判断的是联系人名称是否已经存在在列表中,因此如果联系人名称如果相等,就不会添加进去,因此会导致少几个联系人。

因此大家可以采用下面的代码段,尝试一下,看结果是否一样。以下代码是通过判断新联系人是否与最近添加到列表的联系人名称是否一致,如果不一致,则添加。

# -*- coding: utf-8-*-
import subprocess
import uiautomation as auto
import time

# ToDo 这里需要更改微信所在地址,可通过桌面微信图标右键打开文件所在的位置查找到路径
subprocess.Popen('E:\微信\WeChat\WeChat.exe')

wechatWindow = auto.WindowControl(searchDepth=1, className='WeChatMainWndForPC', Name='微信')

# 点击通讯录
button = wechatWindow.ButtonControl(Name='通讯录')
button.Click()
# 点击通讯录管理
administration = wechatWindow.ButtonControl(Name="通讯录管理")
administration.Click()

communication_administration = auto.WindowControl(Name="通讯录管理", ClassName="ContactManagerWindow")
# 将鼠标放至内容的中心,滚轮对联系人列表才能生效
communication_administration.MoveCursorToMyCenter()
list1 = communication_administration.ListControl(Name="")
# a表示存储列表,b表示计数器,flag控制代码是否退出
a = []
b = 1

flag = True
start_time = time.time()
print("""开始时间:{}""".format(start_time))
while flag:
    list1 = communication_administration.ListControl(Name="")
    nickname = list1.GetChildren()[0].TextControl()
    '''判断是不是在列表a中,如果列表中没有,则添加'''
    if nickname.Name not in a:
        print(b, '', nickname.Name)
        b += 1
        a.append(nickname.Name)
        with open('name.txt', 'a', encoding='utf-8') as f:
            f.write(nickname.Name)
            f.write('\n')
    # 滚轮下滚
    auto.WheelDown(waitTime=0.01)


    # 手动实现滚轮滚动到底操作
    # 空格
    if auto.IsKeyPressed(auto.Keys.VK_SPACE):
        print("到底了")
        for j in list1.GetChildren()[1:]:
            last_nickname = j.TextControl()

            if last_nickname not in a:
                print(b, '', last_nickname.Name)
                b += 1
                a.append(last_nickname)
                with open('name.txt', 'a', encoding='utf-8') as f:
                    f.write(last_nickname.Name)
                    f.write('\n')
        print(a)
        flag = False
        end_time = time.time()
        sum_time = end_time - start_time
        print("""运行时间:{}s""".format(sum_time))



四、总结

       关于uiautomation获取微信联系人昵称就展示完了,如果接下来有时间,会更新获取备注、标签等等代码;

        为了让大家更加了解uiautomation,笔者会更新关于其比较常见的函数,供大家参考;

        ③希望对这方面感兴趣的,可以自己动手敲一下,不敲不知道,敲了bug停不了。如果觉得笔者写的不错的,希望支持一下!!❤️ ❤️ ❤️ 

 

### UIAutomation微信中无法捕获控件的解决方案 当使用UIAutomation工具尝试捕获微信中的控件时,可能会遇到某些控件未能被成功识别的情况。这通常是因为微信客户端为了保护用户隐私和数据安全,对自动化工具进行了限制[^1]。 #### 可能的原因 1. **权限限制**:微信可能通过特定的安全机制阻止外部程序对其界面元素的操作。 2. **技术架构差异**:微信的部分功能模块可能是基于自定义渲染引擎开发的,而非标准Windows控件,因此传统的UIAutomation方法难以适配这些非标准化组件[^3]。 #### 解决方案 以下是几种常见的解决策略: #### 方法一:借助Inspect.exe辅助定位 利用`Inspect.exe`这款微软官方提供的工具来分析目标窗口及其子控件的具体属性。由于`uiautomation`库支持与`Inspect.exe`一致或相似的表达方式,这种方法能够有效提升查找效率并精确定位所需控件的位置。 #### 方法二:调整运行模式 确保所使用的应用程序是以管理员身份启动,并且操作系统启用了必要的无障碍访问选项。这样可以提高兼容性和稳定性,减少因权限不足而导致的功能失效风险。 #### 方法三:切换至其他浏览器环境测试 如果当前项目允许的话,考虑将涉及的任务迁移到像Google Chrome这样的平台上执行。因为有现成成熟的框架如Selenium可以直接应用于此类环境中完成类似需求而不需做太多额外改动即可正常运作[^2]。 #### 示例代码片段展示如何初始化一个简单的UI Automation连接过程: ```python from uiautomation import WindowControl, ListControl def get_wechat_members(): weChatWindow = WindowControl(Name="WeChat") # 替换为实际名称 memberList = ListControl(searchFromControl=weChatWindow) membersInfo = [] for item in memberList.GetChildren(): name = item.Name status = item.ClassName membersInfo.append({"name": name, "status": status}) return membersInfo ``` 以上仅为示意性质的基础逻辑结构,请依据具体业务场景灵活调整参数设置等内容后再投入使用实践当中去验证效果最佳!
评论 87
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

knighthood2001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值