微信文章自动采集软件(微信PC端为例子,演示UIAutomation库的使用。。(二))
优采云 发布时间: 2021-10-27 23:23微信文章自动采集软件(微信PC端为例子,演示UIAutomation库的使用。。(二))
我们可以通过 pip 直接安装来使用这个库:
pip install uiautomation
今天以微信PC端为例,演示UIAutomation库的使用。
首先,我们的目标是从当前微信聊天窗口中提取聊天文本:
提取当前微信聊天窗口的聊天记录
首先,我们打开inspect.exe工具,定位到微信窗口:
inspect.exe是windows系统自带的工具,文件位置可以通过一切搜索。在我的电脑上搜索到的位置是:C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64\inspect 。可执行程序
Name和可以查询的名字在微信上启动自动控制:
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个随机表情:
嘿嘿,测试成功。您可以自动发送消息,但不要在群聊中乱七八糟。退出群聊后,本文作者概不负责~
瞬间爬行
最后,我们将执行最后一个示例。如何查找节点元素,本次不演示。我们直接看代码。
首先,我们获取 Moments 按钮并打开 Moments:
button = wechatWindow.ButtonControl(Name='朋友圈')
button.Click()
获取当前 Moments 窗口的数据:
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("------------------")
可以看到Moments当前窗口中的数据也是完整获取的:
这时候我们只需要添加一个代码,自动滑动Moments窗口,批量抓取Moments。
如何批量抓取Moments?这是给各位童鞋们的功课,期待你们的童鞋们大显身手,拿出好的解决方案。
后面我自己给个参考答案,敬请期待~