接到了一个需求:现微信有8000+好友,需要给所有好友发送一则一样的消息。网上搜索一番后,发现
uiautomation
可以解决该需求,遂有此文。这是第三篇,获取聊天窗口的所有记录。
代码在文章末尾,自取~
更多功能的微信群发消息代码链接 :https://github.com/Frica01/Wechat_mass_msg
知识点 | 链接 |
---|---|
Microsoft 的 uiautomation | https://docs.microsoft.com/zh-cn/dotnet/framework/ui-automation/ui-automation-overview |
Python 的 uiautomation | https://github.com/yinkaisheng/Python-UIAutomation-for-Windows |
微信群发消息 GitHub链接 | https://github.com/Frica01/Wechat_mass_msg |
该方法主要实现获取聊天窗口中的聊天记录。想获取多少传入对应的page的数量即可。
聊天记录输出的格式为:
[
{'type':'消息的类型', 'name':'发送消息的用户昵称', 'msg':'发送的内容'},
{'type':'消息的类型', 'name':'发送消息的用户昵称', 'msg':'发送的内容'},
...
]
代码如下:
运行效果如下动图所示:
截取聊天记录返回的片段,如下
{
"type": "Time",
"name": "System",
"msg": "2:21"
},
{
"type": "Other",
"name": "\"靓仔\"",
"msg": "撤回了一条消息"
},
{
"type": "RedEnvelope",
"name": "靓仔",
"msg": "微信转账 点击确认收款 ¥1.00"
},
{
"type": "RedEnvelope",
"name": "System",
"msg": "你收到了一次转账收款提醒,请在手机上查看"
},
{
"type": "System",
"name": "System",
"msg": "该类型文件可能存在安全风险,建议先检查文件安全性后再打开。"
},
{
"type": "File",
"name": "靓仔",
"msg": "size: 1M --- file_name: demo.exe"
},
{
"type": "Content",
"name": "靓仔",
"msg": "[动画表情]"
},
{
'type': 'Cited',
'name': '靓仔',
'msg': '🌿 是湖南长沙中国电信大楼吗\n引用 靓仔 的消息 : \n大楼着火'
},
由上数据可见,
type有多种,Time, Other, RedEnvelope, System, File, Content, Cited
,
分别代表
type | 释义 |
---|---|
Time | 时间 |
Other | 撤回等 |
RedEnvelope | 红包、转账 |
System | 系统提示 |
File | 文件 |
Cited | 引用 |
Content | 文本内容,表情包等 |
# -*- coding: utf-8 -*-
# @Author : Frica01
# @Time : 2022-09-10 15:39
# @Name : wechat_operation.py
import uiautomation as auto
wx_window = auto.WindowControl(Name='微信', ClassName='WeChatMainWndForPC')
def get_chat_records(page: int = 1) -> list:
"""
获取聊天列表的聊天记录.
Args:
page(int): 可选参数,如不指定,只获取1页聊天记录
Returns:
list
"""
chat_records = list()
def extract_msg() -> None:
all_msgs = wx_window.ListControl(Name="消息").GetChildren()
for msg_node in all_msgs:
msg = msg_node.Name
if not msg:
continue
if msg_node.PaneControl().Name:
chat_records.append({'type': 'Time', 'name': 'System', 'msg': msg_node.PaneControl().Name})
continue
if msg in ['以下为新消息', '查看更多消息', '该类型文件可能存在安全风险,建议先检查文件安全性后再打开。', '已撤回']:
chat_records.append({'type': 'System', 'name': 'System', 'msg': msg})
continue
if '撤回了一条消息' in msg or '尝试撤回上一条消息' in msg:
chat_records.append(
{'type': 'Other', 'name': ''.join(msg.split(' ')[:-1]), 'msg': msg.split(' ')[-1]})
continue
if msg in ['发出红包,请在手机上查看', '收到红包,请在手机上查看', '你发送了一次转账收款提醒,请在手机上查看', '你收到了一次转账收款提醒,请在手机上查看']:
chat_records.append({'type': 'RedEnvelope', 'name': 'System', 'msg': msg})
continue
if '领取了你的红包' in msg:
_ = msg.split('领取了你的红包')
chat_records.append({'type': 'RedEnvelope', 'name': _[0], 'msg': _[1]})
continue
name = msg_node.ButtonControl(foundIndex=1).Name
if msg == '[文件]':
file_name = msg_node.PaneControl().TextControl(foundIndex=1).Name
size = msg_node.PaneControl().TextControl(foundIndex=2).Name
chat_records.append(
{'type': 'File', 'name': name, 'msg': f'size: {size} --- file_name: {file_name}'})
continue
if msg == '微信转账':
operation = msg_node.PaneControl().TextControl(foundIndex=2).Name
amount = msg_node.PaneControl().TextControl(foundIndex=3).Name
chat_records.append(
{'type': 'RedEnvelope', 'name': name, 'msg': msg + f' {operation} ' + amount})
continue
if '引用' in msg and '的消息' in msg:
_msg = msg_node.PaneControl().PaneControl().EditControl(foundIndex=1).Name
be_cited = msg_node.PaneControl().PaneControl().EditControl(foundIndex=2).Name
chat_records.append({'type': 'Cited', 'name': name, 'msg': _msg + ' 引用 ' + be_cited})
continue
if msg == '[聊天记录]':
if not name:
name = msg_node.ButtonControl(foundIndex=2).Name
chat_records.append({'type': 'Content', 'name': name, 'msg': msg})
for _ in range(page):
wx_window.WheelUp(wheelTimes=15)
extract_msg()
return chat_records
如果看不懂代码,可以在下方留言~
see you.🎈🎈