当前位置:网站首页>【uiautomation】微信好友列表获取(存储到txt中)
【uiautomation】微信好友列表获取(存储到txt中)
2022-08-04 21:09:00 【嗯嗯嗯吧】
???
??系列专栏:uiautomation
?? 欢迎点赞??评论??
热爱python,期待与大家一同进步成长!!
目的:使用uiautomation进行微信好友的获取,并存储到txt文件中。
目录
一、前言
实现过程:如下图
打开通讯录管理,通过不断滚动鼠标,获取新的联系人列表,将他们逐个添加到列表与txt文件中。
当鼠标滚动到底时,按空格键,爬取最后的联系人列表。并打印代码运行时间。
二、具体步骤
模块导入
import subprocess
import uiautomation as auto
import time
打开微信
# ToDo 这里需要更改微信所在地址,可通过桌面微信图标右键打开文件所在的位置查找到路径
subprocess.Popen('E:微信WeChatWeChat.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('
')
# 滚轮下滚
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('
')
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('
')
③不管该判断成不成立,都执行鼠标滚轮下滚的操作;
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('
')
auto.IsKeyPressed(auto.Keys.VK_SPACE)表示键盘按空格
⑤最后打印列表a,更改flag,打印代码运行时间。
三、全部代码展示
# -*- coding: utf-8-*-
import subprocess
import uiautomation as auto
import time
# ToDo 这里需要更改微信所在地址,可通过桌面微信图标右键打开文件所在的位置查找到路径
subprocess.Popen('E:微信WeChatWeChat.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('
')
# 滚轮下滚
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('
')
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:微信WeChatWeChat.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('
')
# 滚轮下滚
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('
')
print(a)
flag = False
end_time = time.time()
sum_time = end_time - start_time
print("""运行时间:{}s""".format(sum_time))
四、总结
①关于uiautomation获取微信联系人昵称就展示完了,如果接下来有时间,会更新获取备注、标签等等代码;
②为了让大家更加了解uiautomation,笔者会更新关于其比较常见的函数,供大家参考;
③希望对这方面感兴趣的,可以自己动手敲一下,**不敲不知道,敲了bug停不了。**如果觉得笔者写的不错的,希望支持一下!!
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
- visual studio 2015 warning MSB3246
- dotnet 启动 JIT 多核心编译提升启动性能
- C#之app.config、exe.config和vshost.exe.config作用区别
- proe和creo的区别有哪些
- matlab drawing
- buu web
- Re24:读论文 IOT-Match Explainable Legal Case Matching via Inverse Optimal Transport-based Rationale Ext
- 简述@RequestParam与@RequestBody参数注解
- jekyll 在博客添加流程图
- SPSS-unary regression practice
猜你喜欢
【数据挖掘】搜狐公司数据挖掘工程师笔试题
IPV6地址
Interviewer: How is the expired key in Redis deleted?
[2022 Hangzhou Electric Power Multi-School 5 1012 Questions Buy Figurines] Application of STL
JWT actively checks whether the Token has expired
Uniapp微信雪糕刺客单页小程序源码
数电快速入门(四)(组合逻辑电路的分析以及设计的介绍)
Spss-系统聚类软件实操
文章复现:超分辨率网络-VDSR
Oreo域名授权验证系统v1.0.6公益开源版本网站源码
随机推荐
jekyll adds a flowchart to the blog
buu web
LayaBox---TypeScript---结构
机器学习_02
链栈的应用
数字IC设计中基本运算的粗略的延时估计
bracket matching
项目难管理?先学会用好甘特图(内附操作方法及实用模板)
嵌入式分享合集28
Dotnet using WMI software acquisition system installation
三种方式设置特定设备UWP XAML view
PRIMAL: Pathfinding via Reinforcement and Imitation Multi-Agent Learning Code Analysis
命名路由、组件中name的作用
链队
Cryptography Series: PEM and PKCS7, PKCS8, PKCS12
LINQ to SQL (Group By/Having/Count/Sum/Min/Max/Avg操作符)
How to make good use of builder mode
[2022 Hangzhou Electric Multi-School 5 1003 Slipper] Multiple Super Source Points + Shortest Path
后缀式的计算
Some problems with passing parameters of meta and params in routing (can be passed but not passed, empty, collocation, click to pass multiple parameters to report an error)