微信文章自动采集软件( UI自动化测试工具实现对桌面程序的自动化控制和数据采集)
优采云 发布时间: 2022-02-16 15:24微信文章自动采集软件(
UI自动化测试工具实现对桌面程序的自动化控制和数据采集)
大家好,我叫小明。
前段时间,两个大佬共享PyWinAuto或者WinAppDriver实现桌面程序的自动控制和数据采集。
而PyWinAuto实现了微信朋友圈采集,只是直接打印出树状结构。如果以后真的需要存储数据,不仅耗时,而且解析起来也极其复杂。它不太适合桌面数据采集。只能说用它来自动化控制桌面程序还是很不错的。
对于 WinAppDriver,它更易于使用。缺点是基于Appium,安装起来比较麻烦,但是对于已经熟悉Appium自动化测试工具的读者来说,并不难。
今天要和大家分享的是UI自动化测试工具UIAutomation,用于自动化桌面程序的控制和数据采集。使用它的前提是需要自动化的桌面程序是用微软提供的标准控件实现的,它实现了UI Automation Provider,见:
虽然基于 Vue 的 Electron 桌面应用程序默认不支持 UIAutomation,但它也可以通过在启动时启用参数 --force-renderer-accessibility 来支持 UIAutomation。
那么如何通过python调用这个Microsoft UIAutomation API,可以查看:
大佬空闲时开发了uiautomation模块,本来是自己用的,现在已经开源给大家了。我们可以通过 pip 安装直接使用这个库:
pip install uiautomation
今天我以微信PC为例,演示UIAutomation库的使用。
首先,我们的目标是实现微信当前聊天窗口的聊天文本提取:
当前微信聊天窗口聊天记录提取
首先,我们打开inspect.exe工具,定位到微信窗口:
inspect.exe是Windows系统自带的一个工具,你可以通过一切来搜索文件位置。在我的电脑上搜索到的位置是:C:Program Files (x86)Windows Kits10bin10.0.19041.0x64inspect.exe
可以查询微信名称并启动自动控制:
import uiautomation as auto
wechatWindow = auto.WindowControl(searchDepth=1, Name="微信", ClassName='WeChatMainWndForPC')
我们以黄渤的群为例,演示如何提取当前聊天窗口的数据。首先,我们需要分析ui节点的结构:
可以看到消息列表节点的Name为“message”,ControlType为UA_ListControlTypeId(0xC358),每条消息都是消息列表节点的子节点的名字,基于此我们编码:
messages = wechatWindow.ListControl(Name='消息')
for message in messages.GetChildren():
content = message.Name
print(content)
打印结果的后半部分:
2021年8月21日 20:26
8.25-26邀您观看百度BML线上课程,一起聊聊工业AI质检~
-单瑕疵、多瑕疵等复杂场景识别率如何提升
-采集样本质量保证,小样本数据量如何增强
-数据回流让模型持续优化,降低产品漏检率
-快速搭建AI质检模型进行效果验证
[红包][红包]看直播抽取小度真*敏*感*词*、小度智能音箱、飞桨定制鼠标垫……新用户参与2021万有引力计划即刻获️100元京东卡奖励!
报名链接:https://paddle.wjx.cn/vm/exDHIgz.aspx?udsid=340852
[图片]
2021年8月21日 22:16
[链接]
7个实用技巧总结[强]
昨天 11:53
【直播消息】8月25日我们特别邀请到凡泰极客创始人&CTO 杨涛先生进行线上直播分享,和大家聊聊移动应用如何利用小程序容器技术做转型升级,欢迎阅读文章了解详情~
[链接]
18:50
"xman" 撤回了一条消息
这种提取过于简单粗暴。如果我们也能知道发件人和链接内容就更好了。然后我们继续深入分析节点:
有相当多的嵌套层。以这种方式继续分析各种情况下的节点结构和类型,多次测试,最后编写如下代码:
import pandas as pd
wechatWindow.SetFocus()
messages = wechatWindow.ListControl(Name='消息')
result = []
time = pd.NA
for message in messages.GetChildren():
content = message.Name
if content in ["查看更多消息", "以下为新消息"]:
continue
details = message.GetChildren()[0].GetChildren()
if len(details) == 0:
time = content
continue
nickname, detail, me = details
name = nickname.Name
if me.Name:
name = me.Name
link_all = pd.NA
if not (content == "[图片]" or content.startswith("[语音]")):
details = detail.GetChildren()
if len(details) == 0:
continue
detail = details[-1].GetChildren()[0].GetChildren()[0].GetChildren()[0]
details = detail.GetChildren()
if len(details) != 0:
link_title = details[0].Name
link_content = details[1].Name
content += f"{link_title}n{link_content}"
# print(time, name, content)
result.append((time, name, content.strip()))
df = pd.DataFrame(result, columns=["时间", "昵称", "内容"])
df
结果:
目前我只能在测试2小时后才能提取出这个关卡。有兴趣的朋友可以继续研究提取文件的文件名。
找到一个有趣的组,你必须测试它(不能辜负你的阵型):
这很有趣。我们来实现微信群聊轰炸机:
自动发送微信消息
分别查看输入框和发送按钮的名称和类型:
然后编写如下代码进行测试:
edit = wechatWindow.EditControl(Name='输入')
edit.SendKeys('test')
sendButton = wechatWindow.ButtonControl(Name='发送(S)')
sendButton.Click()
运行后,我这里已经成功发送测试给自己了:
批量表情轰炸开始:
import random
emoji_faces = [
"[微笑]", "[撇嘴]", "[色]", "[发呆]", "[得意]", "[流泪]", "[害羞]", "[闭嘴]", "[睡]", "[大哭]", "[尴尬]",
"[发怒]", "[调皮]", "[呲牙]", "[惊讶]", "[难过]", "[囧]", "[抓狂]", "[吐]", "[偷笑]", "[愉快]", "[白眼]",
"[傲慢]", "[困]", "[惊恐]", "[憨笑]", "[悠闲]", "[咒骂]", "[疑问]", "[嘘]", "[晕]", "[衰]", "[骷髅]", "[猪头]",
"[敲打]", "[再见]", "[擦汗]", "[抠鼻]", "[鼓掌]", "[坏笑]", "[右哼哼]", "[鄙视]", "[委屈]", "[快哭了]",
"[阴险]", "[亲亲]", "[可怜]", "[笑脸]", "[生病]", "[脸红]", "[破涕为笑]", "[恐惧]", "[失望]", "[无语]",
"[嘿哈]", "[捂脸]", "[奸笑]", "[机智]", "[皱眉]", "[耶]", "[吃瓜]", "[加油]", "[汗]", "[天啊]", "[Emm]",
"[社会社会]", "[旺柴]", "[好的]", "[打脸]", "[哇]", "[翻白眼]", "[666]", "[让我看看]", "[叹气]", "[苦涩]",
"[裂开]", "[嘴唇]", "[爱心]", "[心碎]", "[拥抱]", "[强]", "[弱]", "[握手]", "[胜利]", "[抱拳]", "[勾引]",
"[拳头]", "[OK]", "[合十]", "[啤酒]", "[咖啡]", "[蛋糕]", "[玫瑰]", "[凋谢]", "[菜刀]", "[便便]", "[月亮]",
"[太阳]", "[礼物]", "[红包]", "[發]", "[福]", "[跳跳]", "[发抖]", "[转圈]", "[*敏*感*词*]", "[庆祝]", "[烟花]"
]
wechatWindow.SetFocus()
for _ in range(5):
emoji_face = random.choice(emoji_faces)
edit.SendKeys(emoji_face)
sendButton.Click()
让我们随机发送 5 个表情符号:
嘿嘿,测试成功了。可以自动发消息,但不要在群里乱搞,被T下群后本文作者不承担任何责任~
刷朋友圈
最后,我们来看最后一个例子。这次不演示如何查找节点元素。我们直接看代码。
首先,我们获取朋友圈按钮,打开朋友圈:
button = wechatWindow.ButtonControl(Name='朋友圈')
button.Click()
获取当前朋友圈窗口的数据:
friendWindow = auto.WindowControl(
searchDepth=1, Name="朋友圈", ClassName='SnsWnd')
friendWindow.SetFocus()
listControls = friendWindow.ListControl(Name='朋友圈')
for item in listControls.GetChildren():
if item.ControlTypeName != "ListItemControl":
continue
print(item.Name)
panes = item.GetChildren()[0].GetChildren()[
0].GetChildren()[1].GetChildren()
if len(panes) >= 5:
print("评论:")
comments = panes[4].ListControl(Name='评论')
for comment in comments.GetChildren():
print(comment.Name)
print("------------------")
可以看到,朋友圈当前窗口的数据也是完整获取的:
这时候我们只需要添加一段自动滑动朋友圈窗口的代码,就可以批量抓取朋友圈了。
如何批量爬取朋友圈?这是留给所有童鞋的功课,期待所有童鞋大显身手,拿出好的解决方案。