步骤一:安装PyInstaller
在命令行中执行以下命令安装(建议使用清华镜像加速下载):
Bash
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller
步骤二:打包微信群发脚本
-
创建打包命令
假设你的脚本文件名为wechat_bot.py
,在脚本目录下打开命令行,输入以下命令:Bash
pyinstaller -F -w --icon=wechat.ico wechat_bot.py
-F
:生成单个exe文件-w
:隐藏命令行窗口(避免微信操作时弹出黑框)--icon=wechat.ico
:可选参数,自定义exe图标(需准备ico文件)
-
获取打包结果
打包完成后,生成的exe文件位于dist
文件夹内,双击即可运行。
常见问题处理(参考
1
3
)
-
依赖缺失
- 若exe运行时闪退,尝试打包时保留控制台以查看报错:
Bash
pyinstaller -F wechat_bot.py # 去掉 -w
- 确保代码中所有第三方库(如
pyautogui
)已正确安装。
- 若exe运行时闪退,尝试打包时保留控制台以查看报错:
-
文件体积过大
使用以下方式优化:Bash
pyinstaller -F -w --upx-dir=upx_folder wechat_bot.py
- 需提前下载UPX压缩工具,解压后指定路径
--upx-dir
。
- 需提前下载UPX压缩工具,解压后指定路径
-
图标不显示
确认图标文件为.ico
格式,建议使用在线转换工具生成:http://www.bitbug.net/
高级需求(参考
6
7
)
若需要图形化操作,可使用 auto-py-to-exe:
- 安装:
Bash
pip install auto-py-to-exe
- 启动:
Bash
auto-py-to-exe
- 通过网页界面选择脚本、设置参数(如单文件/隐藏窗口等)。
注意事项
- 打包前务必在PC版微信中测试脚本功能正常。
- 若脚本涉及外部文件(如配置文件),需手动复制到exe同目录
4
。 - 群发频率建议≥15秒/条,避免被微信限制
1
import sys import pyautogui import pyperclip import time from PySide6.QtWidgets import (QApplication, QMainWindow, QPushButton, QTextEdit, QListWidget, QFileDialog, QProgressBar) from PySide6.QtCore import Qt, QThread, Signal class WechatBotThread(QThread): progress = Signal(int) message = Signal(str) def __init__(self, contacts, messages, files=None): super().__init__() self.contacts = contacts self.messages = messages self.files = files or [] self._is_running = True def locate_wechat_window(self): try: win = pyautogui.getWindowsWithTitle('微信')[0] win.activate() return win.left, win.top, win.width, win.height except IndexError: self.message.emit("错误:未找到微信窗口") return None def search_contact(self, name): pyautogui.hotkey('ctrl', 'f') time.sleep(0.5) pyperclip.copy(name) pyautogui.hotkey('ctrl', 'v') time.sleep(0.5) pyautogui.press('enter') time.sleep(1) def send_files(self): # 文件发送功能(参考) pyautogui.hotkey('ctrl', 'alt', 'f') time.sleep(1) for file in self.files: pyperclip.copy(file) pyautogui.hotkey('ctrl', 'v') time.sleep(1) pyautogui.press('enter') time.sleep(2) def run(self): try: win_pos = self.locate_wechat_window() if not win_pos: return total = len(self.contacts) for i, contact in enumerate(self.contacts): if not self._is_running: break self.search_contact(contact) time.sleep(1) # 发送文本消息 for msg in self.messages: pyperclip.copy(msg.replace("{name}", contact)) pyautogui.hotkey('ctrl', 'v') pyautogui.press('enter') time.sleep(2) # 发送文件(参考) if self.files: self.send_files() self.progress.emit(int((i+1)/total*100)) self.message.emit(f"已发送给:{contact}") except Exception as e: self.message.emit(f"错误:{str(e)}") def stop(self): self._is_running = False class WechatMassSender(QMainWindow): def __init__(self): super().__init__() self.initUI() self.contacts = [] self.messages = [] self.files = [] def initUI(self): self.setWindowTitle("微信智能群发助手 v2.0") self.setGeometry(300, 300, 800, 600) # 联系人列表控件 self.btn_load_contacts = QPushButton("导入联系人", self) self.btn_load_contacts.move(20, 20) self.btn_load_contacts.clicked.connect(self.load_contacts) self.list_contacts = QListWidget(self) self.list_contacts.setGeometry(20, 60, 200, 400) # 消息编辑控件 self.btn_edit_msg = QPushButton("编辑消息", self) self.btn_edit_msg.move(240, 20) self.btn_edit_msg.clicked.connect(self.edit_message) self.txt_message = QTextEdit(self) self.txt_message.setGeometry(240, 60, 400, 200) self.txt_message.setPlaceholderText("支持使用{name}作为姓名占位符\n每行一条消息") # 文件选择控件 self.btn_add_files = QPushButton("添加附件", self) self.btn_add_files.move(240, 270) self.btn_add_files.clicked.connect(self.add_files) # 进度条 self.progress = QProgressBar(self) self.progress.setGeometry(20, 480, 760, 30) # 控制按钮 self.btn_start = QPushButton("开始发送", self) self.btn_start.move(240, 320) self.btn_start.clicked.connect(self.start_sending) self.btn_stop = QPushButton("停止", self) self.btn_stop.move(400, 320) self.btn_stop.clicked.connect(self.stop_sending) def load_contacts(self): # 联系人导入功能(参考) path, _ = QFileDialog.getOpenFileName(self, "选择联系人文件", "", "Text Files (*.txt)") if path: with open(path, 'r', encoding='utf-8') as f: self.contacts = [line.strip() for line in f if line.strip()] self.list_contacts.addItems(self.contacts) def edit_message(self): self.messages = self.txt_message.toPlainText().split('\n') def add_files(self): files, _ = QFileDialog.getOpenFileNames(self, "选择附件") if files: self.files = files def start_sending(self): if not self.contacts: self.show_message("请先导入联系人") return if not self.messages: self.show_message("请先编辑消息内容") return self.thread = WechatBotThread(self.contacts, self.messages, self.files) self.thread.progress.connect(self.update_progress) self.thread.message.connect(self.show_message) self.thread.start() def stop_sending(self): if hasattr(self, 'thread'): self.thread.stop() def update_progress(self, value): self.progress.setValue(value) def show_message(self, msg): self.statusBar().showMessage(msg) if __name__ == "__main__": app = QApplication(sys.argv) window = WechatMassSender() window.show() sys.exit(app.exec())