微信电脑版聊天记录监听器最新版微信适配4.1.7.30
# -*- coding: utf-8 -*-
# pip install pyqt5 uiautomation
import sys
import re
import uiautomation as auto
from PyQt5 import QtCore, QtGui, QtWidgets
TARGET_DEPTH = 14
def is_time_line(text: str):
text = text.strip()
return bool(re.match(r'^d{1,2}:d{2}$', text) or re.match(r'^d{2}/d{2}$', text))
def parse_session(name_block: str):
lines = [l.strip() for l in name_block.splitlines()]
lines = [l for l in lines if l]
if not lines:
return None
session_name = lines[0]
time_text = None
for l in reversed(lines):
if is_time_line(l):
time_text = l
break
ignore_keywords = ['已置顶', '消息免打扰', '撤销']
message_line = None
for l in lines[1:]:
if l == time_text:
continue
if any(k in l for k in ignore_keywords):
continue
message_line = l
if not message_line:
return None
msg_type = "文本"
if ':' in message_line:
sender, content = message_line.split(':', 1)
return {
"group_name": session_name,
"sender": sender.strip().strip('"'),
"content": content.strip(),
"time": time_text,
"msg_type": msg_type
}
return {
"group_name": session_name,
"sender": "我",
"content": message_line,
"time": time_text,
"msg_type": msg_type
}
class FetchThread(QtCore.QThread):
data_signal = QtCore.pyqtSignal(list)
def __init__(self, interval=1.5):
super().__init__()
self.interval = interval
self._running = False
auto.SetGlobalSearchTimeout(10)
def run(self):
self._running = True
while self._running:
try:
results = self.fetch_data()
self.data_signal.emit(results)
except:
pass
self.msleep(int(self.interval * 1000))
def stop(self):
self._running = False
def set_interval(self, interval):
self.interval = interval
def fetch_data(self):
result_list = []
root = auto.GetRootControl()
target = root.Control(searchDepth=5, ClassName='mmui::MainWindow')
if not target.Exists(2):
return result_list
def dump(control, depth=0):
if depth == TARGET_DEPTH:
try:
if control.ClassName == 'mmui::ChatSessionCell' and control.Name:
result = parse_session(control.Name)
if result:
result_list.append(result)
except:
pass
return
for child in control.GetChildren():
dump(child, depth + 1)
dump(target)
return result_list
class MainWindow(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.resize(1300, 800)
self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
self.main_layout = QtWidgets.QVBoxLayout(self)
self.main_layout.setContentsMargins(8, 8, 8, 8)
self.container = QtWidgets.QFrame()
self.container.setObjectName("container")
self.container_layout = QtWidgets.QVBoxLayout(self.container)
self.container_layout.setContentsMargins(20, 20, 20, 20)
self.main_layout.addWidget(self.container)
# ===== 顶部栏 =====
title_bar = QtWidgets.QHBoxLayout()
self.container_layout.addLayout(title_bar)
self.title = QtWidgets.QLabel("微信电脑版聊天记录监听器")
self.title.setStyleSheet("font-size:18px;font-weight:bold;")
self.close_btn = QtWidgets.QPushButton("✕")
self.close_btn.setFixedSize(36, 32)
self.close_btn.clicked.connect(self.close)
title_bar.addWidget(self.title)
title_bar.addStretch()
title_bar.addWidget(self.close_btn)
# ===== 切换按钮 =====
self.toggle_btn = QtWidgets.QPushButton()
self.toggle_btn.setFixedSize(120, 60)
self.toggle_btn.setStyleSheet("font-size:18px;font-weight:bold;")
self.container_layout.addWidget(self.toggle_btn, alignment=QtCore.Qt.AlignLeft)
# ===== 表格 =====
self.table = QtWidgets.QTableWidget()
self.table.setColumnCount(5)
self.table.setHorizontalHeaderLabels(
["群名", "发送者", "消息类型", "内容", "时间"]
)
self.table.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
self.table.verticalHeader().setVisible(False)
self.table.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
self.table.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
self.table.setWordWrap(True)
self.container_layout.addWidget(self.table)
# ===== 线程 =====
self.thread = FetchThread(interval=1.5)
self.thread.data_signal.connect(self.update_table)
self.toggle_btn.clicked.connect(self.toggle_listen)
self.setStyleSheet("""
QWidget {
font-family: "Microsoft YaHei";
color: #e6e6e6;
}
#container {
background-color: #1e1f26;
border-radius: 14px;
}
QPushButton {
border-radius: 10px;
font-size:18px;
font-weight:bold;
}
QTableWidget {
background-color: #232530;
gridline-color: #2f3240;
}
QHeaderView::section {
background-color: #2d2f3a;
border: none;
padding: 6px;
}
""")
self._drag_pos = None
self.listening = False
# ===== 默认启动监听 =====
self.start_listen()
# ===== 拖动 =====
def mousePressEvent(self, event):
if event.button() == QtCore.Qt.LeftButton:
self._drag_pos = event.globalPos() - self.frameGeometry().topLeft()
event.accept()
def mouseMoveEvent(self, event):
if self._drag_pos and event.buttons() == QtCore.Qt.LeftButton:
self.move(event.globalPos() - self._drag_pos)
event.accept()
def mouseReleaseEvent(self, event):
self._drag_pos = None
# ===== 监听控制 =====
def toggle_listen(self):
if self.listening:
self.stop_listen()
else:
self.start_listen()
def start_listen(self):
if not self.thread.isRunning():
self.thread.start()
self.listening = True
self.toggle_btn.setText("停止监听")
self.toggle_btn.setStyleSheet("""
QPushButton {
background-color: #c0392b;
border-radius: 10px;
font-size:18px;
font-weight:bold;
}
QPushButton:hover {
background-color: #e74c3c;
}
""")
def stop_listen(self):
self.thread.stop()
self.listening = False
self.toggle_btn.setText("开始监听")
self.toggle_btn.setStyleSheet("""
QPushButton {
background-color: #27ae60;
border-radius: 10px;
font-size:18px;
font-weight:bold;
}
QPushButton:hover {
background-color: #2ecc71;
}
""")
# ===== 表格更新 =====
def add_center_item(self, row, col, text):
item = QtWidgets.QTableWidgetItem(text)
item.setTextAlignment(QtCore.Qt.AlignCenter)
self.table.setItem(row, col, item)
def update_table(self, data):
self.table.setRowCount(len(data))
for row, item in enumerate(data):
self.add_center_item(row, 0, item["group_name"])
self.add_center_item(row, 1, item["sender"])
self.add_center_item(row, 2, item["msg_type"])
content_item = QtWidgets.QTableWidgetItem(item["content"])
content_item.setTextAlignment(QtCore.Qt.AlignCenter)
content_item.setToolTip(item["content"])
self.table.setItem(row, 3, content_item)
self.add_center_item(row, 4, item["time"] or "")
self.table.setRowHeight(row, 60)
self.table.setColumnWidth(3, 300)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别
TP源码网 » 微信电脑版聊天记录监听器最新版微信适配4.1.7.30
TP源码网 » 微信电脑版聊天记录监听器最新版微信适配4.1.7.30
