???
??系列专栏: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开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦