大神论坛

找回密码
快速注册
查看: 177 | 回复: 0

[原创] 用Python实现获取全部微信聊天内容和聊天列表 附成品软件

主题

帖子

0

积分

初入江湖

UID
642
积分
0
精华
威望
0 点
违规
大神币
68 枚
注册时间
2023-10-14 10:40
发表于 2023-11-18 16:51
本帖最后由 llhongfeng 于 2023-11-18 16:51 编辑

Python uiautomation 是一个用于自动化 GUI 测试和操作的库,它可以模拟用户操作来执行各种任务。
通过这个库,可以使用Python脚本模拟人工点击,人工操作界面。本文使用 Python uiautomation 进行微信电脑版的操作。

以下是本次实验的版本号。

你需要安装 uiautomation

pip install uiautomation

示例代码

import time
import uiautomation as auto
import re
from plyer import notification

notification_history = {} # 历史消息

def check_wechat_messages():

# 获取微信窗口
wechat_win = auto.WindowControl(Name="微信", ClassName="WeChatMainWndForPC")

shoukuanWin = wechat_win.ListControl(Name="会话")
bbb = shoukuanWin.GetChildren()

for chatMsg in bbb:
if "条新消息" in chatMsg.Name:

# 计算消息条数
match = re.match(r'([a-zA-Z0-9]+)(\d+)条新消息', chatMsg.Name)

if match:
nickname = match.group(1)
message_count = int(match.group(2))

printInfo = f"{nickname} 给你发送了 {message_count} 条消息"
print(printInfo)
print("------------")

# 获取消息列表控件
xiaoxis = wechat_win.ListControl(Name="消息")

# 获取消息列表控件的子控件
xiaoxi_children = xiaoxis.GetChildren()

# 获取最后一个子控件
last_xiaoxi = xiaoxi_children[-1]

# 打印最后一条消息的内容
print(last_xiaoxi.Name)

# 在指定时间内不重发
last_notification_time = notification_history.get((nickname, message_count), 0)
current_time = time.time()

if current_time - last_notification_time > 15:

# 依次发送
notification_title = f"来自 {nickname} 的 {message_count} 条消息"
notification_message = f"{last_xiaoxi.Name}"

notification.notify(
title=notification_title,
message=notification_message,
app_name="WeChat"
)

# 更新日志
notification_history[(nickname, message_count)] = current_time

if __name__ == "__main__":
try:
while True:
check_wechat_messages()
time.sleep(2) #2秒检测一次UI组件
except KeyboardInterrupt:
print("程序退出~")
except Exception as e:
print(f"程序执行出现了问题: {str(e)}")

代码解析:

以上代码使用 uiautomation 实时获取微信聊天列表的消息状态,一旦有消息发过来,就会获取到发送人的微信昵称以及发送的消息内容、消息个数。


每2秒获取一次UI控件的内容,实测挂在后台对CPU和内存占用并无明显影响,结合Python uiautomation的各种用法,可以做成自动回复的功能。使用这款软件,可以获取到微信电脑版大部分控件的内容。例如:微信聊天列表、群名称、好友微信昵称、群人数、微信号等。

还可以获取到群内的每一条聊天内容,获取到你跟好友的聊天记录。

只要 UISpy.exe 可获取到的控件内容,那么你用 Python就可以获取到。

拓展

还可以用来做收款监控。将【微信收款助手】这个公众号单独窗口出来,然后监控这个窗口。

妥妥的实现了一个PC收款监控。可以用来做收款码的支付回调。

import uiautomation as auto
import re
import time

def get_children_at_depth(control, target_depth, current_depth=0):
children = control.GetChildren()
result = []

for child in children:
if current_depth == target_depth:
result.append(child)
else:
result.extend(get_children_at_depth(child, target_depth, current_depth + 1))

return result

def process_last_child_information(previous_info):
weixin = auto.WindowControl(Name="微信收款助手", ClassName="ChatWnd")
xiaoxi = weixin.ListControl(Name="消息")

target_depth = 5
depth_5_children = get_children_at_depth(xiaoxi, target_depth)

# 正则表达式模式
pattern = r'收款到账通知(\d+月\d+日 \d+:\d+)收款金额¥([0-9.]+)汇总'

last_child = None

for child in depth_5_children:
match = re.search(pattern, child.Name)
if match:
last_child = child # 保存最后一条子控件的引用

# 在循环结束后,提取最后一条子控件的信息
if last_child:
match = re.search(pattern, last_child.Name)
if match:
date_time = match.group(1)
amount = match.group(2)

# 监听下一笔
if (date_time, amount) != previous_info:
print("收款回调:")
print(date_time)
print("金额:", amount)
print("正在等待下一笔...")
print("----------")

previous_info = (date_time, amount)

return previous_info

# 循环
previous_info = None

while True:
previous_info = process_last_child_information(previous_info)
# 每2秒执行一次循环
time.sleep(2)

请勿使用这种技术用于非法行为,仅供大家开发一写小工具自己用。如果使用这种技术来进行违法行为所带来的责任自行负责,与工具、教程作者、发布的平台无关。


下方隐藏内容为本帖所有文件或源码下载链接:

游客你好,如果您要查看本帖隐藏链接需要登录才能查看, 请先登录

返回顶部