Python3.5+PyQt5多线程+itchat实现微信防撤回桌面版(一)

本项目使用itchat实现微信消息防撤回功能,能在消息被撤回后将其发送到个人文件传输助手并记录到日志。当前版本支持文本消息记录及文件、图片保存。

前几日在某乎看到有大神用itchat实现了微信防撤回功能,,觉得很有趣,看到下面评论很多人求桌面版,于是乎,手痒便利用清明节几天时间做了一个简陋的桌面程序。废话不多说,先上图位敬。

运行环境

win10专业版64位系统1703创造者更新

开发环境

  • win10专业版64位系统1703创造者更新
  • Python3.5.2
  • PyCharm 2016
  • PyQt5.7

程序演示图

简陋的程序界面

当有新消息撤回时,会把撤回的消息发送到个人的文件传输助手中,并在桌面程序运行日志中显示,日志可以保存在电脑上。

文件传输助手回送撤回消息

电脑运行日志显示撤回消息

目前只能能显示将消息以文字方式显示,图片和文件会保存在电脑上,可以在程序目录BackUp文件夹中查看。但是无法保存表情包,有时候会出现文件保存不及时的问题,不知道为什么。

下载地址

链接:网页链接 密码:e8bt

<think>好的,我现在需要解决用户的问题:使用Python3多线程PyQt5itchat库来实现微信登录过程以及发送文件的功能。首先,我需要理解用户的具体需求。用户希望有个图形界面,能够通过微信登录,并且在登录后可以发送文件。这涉及到几个关键点:PyQt5的界面设计、itchat微信API调用、多线程处理以避免界面卡顿,以及文件发送功能的实现。首先,我应该考虑如何将PyQt5itchat结合起来。itchat微信个人账号的API库,可以实现消息的收发、登录等功能。但itchat本身是同步的,如果在主线程中直接运行,会导致界面冻结,无法响应。因此,必须使用多线程来分离itchat的运行和PyQt5的界面更新。接下来,我需要设计个登录界面,用户扫描二维码后登录微信itchat提供了获取二维码的功能,可以在控制台显示,但用户需要的是图形界面中的显示。因此,需要将二维码图片显示在PyQt5的窗口中。可能需要使用QPixmap来加载二维码图片,并更新到QLabel上。然后,登录过程需要在个单独的线程中运行,以避免阻塞主界面。这里可以使用QThread来创建后台线程,处理itchat的登录和消息监听。同时,登录成功后,需要更新界面状态,比如显示已登录,并提供发送文件的功能。发送文件部分,用户可能需要选择文件,然后通过itchat的send_file方法发送给指定的用户。这里需要设计个文件选择对话框,以及接收方的输入框。同时,发送文件的操作也应该在后台线程中进行,避免界面卡顿。还需要考虑异常处理,比如网络问题导致的登录失败,或者文件发送失败的情况,需要在界面上给出提示。此外,itchat的回调函数需要与PyQt5的信号槽机制结合,以便在主线程中更新界面元素,比如收到消息时显示在界面上。可能遇到的问题包括多线程之间的通信、itchat在子线程中的运行问题、二维码的生成和显示、以及文件路径的处理。需要确保itchat在子线程中正确初始化,并且通过信号将状态更新传递到主线程。此外,二维码图片可能需要定期更新,因为微信的二维码有过期时间,需要重新生成。最后,测试各个功能是否正常,比如扫码登录后是否能保持会话,发送文件是否成功,以及多线程是否真正避免了界面卡顿。需要处理itchat的登录回调,在扫码成功后关闭二维码显示,并更新登录状态。同时,发送文件时可能需要指定好友的备注名或用户名,需要从itchat的联系人列表中获取正确的信息。 总结下来,步骤大致如下:1.使用PyQt5设计包含二维码显示、登录状态、文件选择和发送的界面。2.创建后台线程处理itchat的登录和消息监听。3.在子线程中生成二维码并传递给主线程显示。4.实现文件选择功能,并在发送时调用itchat的API。5.处理多线程间的通信和界面更新,确保线程安全。6.添加异常处理和用户提示,提升用户体验。</think>以下是基于PyQt5+itchat实现微信登录和文件发送的完整解决方案: ```python import sys import itchat import time from PyQt5.QtWidgets import (QApplication, QWidget, QLabel, QPushButton, QVBoxLayout, QFileDialog, QLineEdit, QMessageBox) from PyQt5.QtCore import Qt, QThread, pyqtSignal, QObject from PyQt5.QtGui import QPixmap class WeChatWorker(QObject): qr_signal = pyqtSignal(str) login_signal = pyqtSignal() status_signal = pyqtSignal(str) def __init__(self): super().__init__() self.running = True def run(self): @itchat.msg_register(itchat.content.TEXT) def text_reply(msg): self.status_signal.emit(f"收到消息: {msg.text}") itchat.auto_login( hotReload=True, qrCallback=self.qr_callback, loginCallback=self.login_callback ) self.login_signal.emit() while self.running: time.sleep(1) def qr_callback(self, uuid, status, qrcode): qr_image = f"https://login.weixin.qq.com/qrcode/{uuid}" self.qr_signal.emit(qr_image) def login_callback(self): self.status_signal.emit("登录成功!") def stop(self): self.running = False class WeChatGUI(QWidget): def __init__(self): super().__init__() self.init_ui() self.worker_thread = None def init_ui(self): self.setWindowTitle(&#39;微信客户端&#39;) self.setGeometry(300, 300, 400, 500) # 二维码显示区域 self.qr_label = QLabel() self.qr_label.setAlignment(Qt.AlignCenter) # 状态显示 self.status_label = QLabel("准备登录...") # 文件发送组件 self.file_btn = QPushButton("选择文件") self.file_btn.clicked.connect(self.select_file) self.target_input = QLineEdit() self.target_input.setPlaceholderText("输入好友备注") self.send_btn = QPushButton("发送文件") self.send_btn.clicked.connect(self.send_file) layout = QVBoxLayout() layout.addWidget(self.qr_label) layout.addWidget(self.status_label) layout.addWidget(QLabel("发送文件到:")) layout.addWidget(self.target_input) layout.addWidget(self.file_btn) layout.addWidget(self.send_btn) self.setLayout(layout) self.start_login() def start_login(self): self.worker = WeChatWorker() self.worker_thread = QThread() self.worker.moveToThread(self.worker_thread) self.worker.qr_signal.connect(self.show_qrcode) self.worker.login_signal.connect(self.on_login_success) self.worker.status_signal.connect(self.update_status) self.worker_thread.started.connect(self.worker.run) self.worker_thread.start() def show_qrcode(self, qr_url): self.status_label.setText("请扫描二维码登录") # 实际开发中需要下载二维码图片并显示 self.qr_label.setText("请访问: " + qr_url) def on_login_success(self): self.status_label.setText("登录成功!") self.qr_label.hide() def update_status(self, message): self.status_label.setText(message) def select_file(self): file_path, _ = QFileDialog.getOpenFileName(self, "选择文件", "", "All Files (*)") if file_path: self.selected_file = file_path self.status_label.setText(f"已选择文件: {file_path}") def send_file(self): if not hasattr(self, &#39;selected_file&#39;): QMessageBox.warning(self, "警告", "请先选择文件") return target = self.target_input.text() friend = itchat.search_friends(remarkName=target) if not friend: QMessageBox.critical(self, "错误", "未找到该好友") return def send_file_thread(): try: itchat.send_file(self.selected_file, toUserName=friend[0][&#39;UserName&#39;]) self.status_label.setText("文件发送成功!") except Exception as e: self.status_label.setText(f"发送失败: {str(e)}") QThread.create(send_file_thread).start() def closeEvent(self, event): if self.worker: self.worker.stop() event.accept() if __name__ == &#39;__main__&#39;: app = QApplication(sys.argv) ex = WeChatGUI() ex.show() sys.exit(app.exec_()) ``` 代码说明: 1. 使用QThread处理itchat的登录和消息接收,避免界面冻结 2. 通过信号机制实现线程间通信:QR码显示、状态更新等 3. 文件发送功能使用独立线程执行,确保界面响应 4. 集成itchat的自动登录和消息回调功能 5. 实现基本的文件选择对话框和好友搜索功能 功能扩展建议: 1. 添加二维码图片下载和显示功能 2. 实现好友列表选择功能 3. 添加消息历史记录界面 4. 支持大文件分片传输 5. 添加发送进度显示
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值