Python + wxauto + 智谱API:三步构建你的专属微信智能助理
你是否曾幻想过,在微信聊天时能有一个得力的AI助手,帮你处理那些重复性的回复,或者在你忙碌时分担一些简单的对话?对于很多Python初学者和自动化爱好者来说,这个想法听起来很酷,但一看到复杂的库依赖、繁琐的API配置和容易报错的代码,热情可能就凉了半截。别担心,今天我们就来打破这个门槛。
这篇文章不是一篇面面俱到的技术手册,而是一份开箱即用的实战指南。我们将聚焦于一个核心目标:用最少的代码、最清晰的步骤,快速搭建一个能真正跑起来的微信AI助理。我们会绕开那些容易让人卡壳的“坑”,比如环境配置冲突、API调用失败、消息监听失灵等常见问题,直接给你一条从零到一的清晰路径。
无论你是想为自己打造一个贴身的日程提醒机器人,还是想探索微信自动化的更多可能性,这篇指南都将为你提供一个坚实、可靠的起点。让我们开始吧。
1. 环境搭建:避开第一个“坑”
万事开头难,环境配置往往是新手遇到的第一个拦路虎。网上教程众多,但版本不匹配、依赖冲突等问题层出不穷。我们这里的目标是一次性成功,所以请严格遵循以下步骤。
1.1 核心工具选择与安装
我们的技术栈非常精简:wxauto 负责操控微信客户端,智谱AI 提供大脑,Python 作为粘合剂。首先,确保你的操作系统是 Windows 10 或 11,这是 wxauto 库稳定运行的前提。
接下来是Python环境。我强烈建议使用 Python 3.8 到 3.10 之间的版本。wxauto 对 Python 3.7.6 和 3.8.1 存在已知兼容性问题,而更高的版本(如 3.11+)有时也会出现意外的库依赖错误。为了省心,直接安装 Python 3.9 是一个稳妥的选择。
安装好 Python 后,打开你的命令行工具(CMD 或 PowerShell),我们开始安装核心库。为了避免从默认源下载缓慢或失败,我们使用国内的清华镜像源。
pip install wxauto==3.9.11.17 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install zhipuai -i https://pypi.tuna.tsinghua.edu.cn/simple
注意:这里我们锁定了
wxauto的版本为3.9.11.17。这个版本与当前主流的微信 PC 客户端(3.9.x)兼容性最好。盲目安装最新版有时会导致无法识别微信窗口等奇怪问题。
安装完成后,可以写一个简单的测试脚本 test_wxauto.py 来验证:
from wxauto import WeChat
wx = WeChat()
print("微信对象创建成功!")
运行这个脚本前,请务必先登录你的微信 PC 版客户端,并且不要最小化微信窗口,保持它在桌面可见。如果运行后没有报错,恭喜你,第一步成功了。
1.2 获取智谱AI的“钥匙”
要让机器人有“大脑”,我们需要一个AI模型。智谱AI的GLM系列模型对中文支持友好,且有免费的额度可供测试,非常适合我们。
- 访问智谱AI开放平台(
bigmodel.cn),注册并登录。 - 在控制台界面,找到“API密钥”或类似选项。
- 点击“创建新的API Key”,你会得到一串以
你的API_KEY形式显示的字符串。请立即妥善保存它,关闭页面后无法再次查看完整密钥。
为了安全且方便地使用这个密钥,我们不应该把它硬编码在代码里。最佳实践是使用环境变量。在项目根目录下创建一个名为 .env 的文件(注意文件名以点开头),内容如下:
ZHIPUAI_API_KEY=你的API_KEY
然后,在Python中安装 python-dotenv 库来读取它:
pip install python-dotenv -i https://pypi.tuna.tsinghua.edu.cn/simple
这样,我们的代码就能安全地获取密钥了。环境准备就绪,接下来我们进入核心逻辑的构建。
2. 核心代码:不到50行的智能体
很多教程会把一个简单的功能拆分成四五个文件,对于初学者来说增加了理解成本。我们反其道而行之,将所有核心逻辑浓缩在一个文件里,力求简洁、直观。
2.1 消息监听与获取
wxauto 监听消息的核心方法是 GetListenMessage()。它会返回一个字典,键是聊天对象,值是该聊天窗口的新消息列表。我们的第一步是能稳定地抓到这些消息。
下面是一个增强版的监听循环骨架,它包含了错误处理和状态提示:
import time
from wxauto import WeChat
def listen_wechat():
wx = WeChat()
# 指定要监听的联系人或群聊名称,放入列表
watch_list = ["文件传输助手", "某个群聊名"] # 请替换为实际名称
print(f"开始监听: {watch_list}")
print("确保微信窗口在前台且未最小化...")
for target in watch_list:
try:
wx.AddListenChat(who=target)
print(f" -> 已添加监听: {target}")
except Exception as e:
print(f" -> 监听 {target} 失败: {e}")
while True:
try:
# 获取所有被监听窗口的新消息
new_msgs = wx.GetListenMessage()
if new_msgs:
for chat, msg_list in new_msgs.items():
who = chat.who # 发送消息的聊天对象
print(f"\n[{who}] 有新消息!")
for msg in msg_list:
# msg 是一个列表,例如 ['好友昵称', '消息内容']
sender, content = msg[0], msg[1]
print(f" {sender}: {content}")
else:
# 没有新消息时,打印一个简单的等待提示,避免刷屏
print(".", end="", flush=True)
time.sleep(1) # 每秒检查一次,避免过高频率占用资源
except KeyboardInterrupt:
print("\n\n用户中断,监听结束。")
break
except Exception as e:
print(f"\n监听过程中出现错误: {e}")
time.sleep(5) # 出错后等待5秒再重试
if __name__ == "__main__":
listen_wechat()
运行这段代码,试着向你监听的“文件传输助手”发条消息,看看控制台是否能正确打印出来。这是所有后续功能的基础。
2.2 集成智谱AI:让消息“活”起来
抓到消息只是第一步,我们需要让AI来理解并回复。智谱AI的SDK调用非常简单。我们将上面代码中的消息处理部分升级,接入AI。
首先,我们创建一个AI工具函数:
from zhipuai import ZhipuAI
from dotenv import load_dotenv
import os
load_dotenv() # 加载 .env 文件中的环境变量
class ZhipuAIClient:
def __init__(self):
api_key = os.getenv("ZHIPUAI_API_KEY")
if not api_key:
raise ValueError("未找到 ZHIPUAI_API_KEY,请检查 .env 文件")
self.client = ZhipuAI(api_key=api_key)
def get_reply(self, prompt, history=[]):
"""根据提示词和历史对话生成回复"""
messages = []
# 如果有历史对话,先加入上下文
for h in history[-5:]: # 只保留最近5轮对话作为上下文,防止token超限
messages.append({"role": h["role"], "content": h["content"]})
# 加入最新的用户问题
messages.append({"role": "user", "content": prompt})
try:
response = self.client.chat.completions.create(
model="glm-4", # 使用 glm-4 模型,效果较好
messages=messages,
temperature=0.8, # 控制回复的随机性,0.8比较平衡
max_tokens=500
)
return response.choices[0].message.content.strip()
except Exception as e:
return f"AI调用出错: {str(e)}"
现在,我们把监听循环和AI回复结合起来。关键在于设计一个对话上下文管理器,为每个不同的聊天对象维护独立的对话历史,这样AI才能进行连贯的多轮对话。
# 在 listen_wechat 函数内部,初始化AI客户端和上下文字典
ai_client = ZhipuAIClient()
# 用于存储每个聊天对象的对话历史
conversation_memory = {}
while True:
# ... (获取 new_msgs 的代码不变) ...
if new_msgs:
for chat, msg_list in new_msgs.items():
who = chat.who
for msg in msg_list:
sender, content = msg[0], msg[1]
# 关键:只处理好友发来的消息,忽略系统消息和自己发的
if sender != 'Self' and sender != 'SYS':
print(f"处理来自 [{sender}] 的消息: {content}")
# 初始化或获取该聊天对象的对话历史
if who not in conversation_memory:
conversation_memory[who] = []
# 将用户消息加入历史
conversation_memory[who].append({"role": "user", "content": content})
# 调用AI生成回复
ai_reply = ai_client.get_reply(content, conversation_memory[who])
print(f"AI 回复: {ai_reply}")
# 将AI回复加入历史
conversation_memory[who].append({"role": "assistant", "content": ai_reply})
# 发送回复
try:
chat.SendMsg(ai_reply)
print(f"已发送回复给 [{who}]")
except Exception as e:
print(f"发送消息失败: {e}")
至此,一个具备基础对话能力的微信AI助理已经成型了。但它在实际使用中可能还有些“笨”,我们需要让它更聪明、更稳定。
3. 功能增强与实战调优
一个只会机械回复的机器人很快会让人失去兴趣。我们需要给它添加一些“个性”和“智慧”,同时确保它运行稳定。
3.1 赋予机器人“性格”与指令
我们可以通过设计系统提示词(System Prompt) 来塑造AI的回复风格。例如,你想让它扮演一个幽默的助手,或者一个严谨的客服。
修改 ZhipuAIClient 类的 get_reply 方法:
def get_reply(self, prompt, who="用户", history=[]):
"""根据提示词、对话者和历史生成回复"""
system_prompt = f"""
你是一个集成在微信中的智能助理,当前正在与【{who}】对话。
你的回复风格应亲切、自然、简洁,像朋友一样聊天。
如果对方询问你的身份,你可以说“我是你的微信小助手”。
请避免生成冗长、官方或带有敏感信息的回复。
"""
messages = [{"role": "system", "content": system_prompt}]
for h in history[-5:]:
messages.append({"role": h["role"], "content": h["content"]})
messages.append({"role": "user", "content": prompt})
# ... 后续调用API的代码不变 ...
更进一步,我们可以实现指令系统。比如,当用户发送“#清空记忆”时,机器人清空当前对话的历史;发送“#切换风格 正式”时,改变回复语气。
在消息处理逻辑中加入判断:
# 在收到消息 content 后,判断是否为指令
if content.startswith("#"):
if content == "#清空记忆":
if who in conversation_memory:
conversation_memory[who] = []
chat.SendMsg("好的,我已经忘记了我们之前的对话。")
continue # 跳过正常的AI回复流程
elif content.startswith("#切换风格"):
# 这里可以设计更复杂的风格切换逻辑
chat.SendMsg("指令已收到,功能开发中~")
continue
3.2 提升稳定性与健壮性
在实际长时间运行中,我们会遇到各种问题。下面这个表格总结了几种常见错误及其解决方案:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
报错 Invalid window handle | 微信窗口句柄丢失,可能因为微信卡死、重启或窗口状态改变。 | 在循环中增加异常捕获,尝试重新初始化 WeChat() 对象。可以设置一个重试机制。 |
| AI回复内容被微信拦截 | 回复内容触发了微信的安全机制(如包含链接、敏感词)。 | 对AI回复内容进行简单过滤,或让AI在回复中避免使用可能被拦截的词汇。提示用户“回复可能涉及敏感内容”。 |
| 程序运行一段时间后无响应 | 内存泄漏、网络波动或 wxauto 内部状态异常。 | 在主循环外层再套一个循环,定期(如每运行1000次循环)重新获取一次 wxauto 实例。增加 try...except 块,遇到严重错误时休眠后继续。 |
| 无法监听群聊@我的消息 | GetListenMessage 默认可能不解析群内具体的@对象。 | 需要更精细地解析消息内容。msg[0] 在群聊中可能是“群名”而非发送者,需要从 msg[1](内容)里判断是否包含@信息。 |
基于上表,我们可以编写一个更健壮的主循环框架:
import time
from wxauto import WeChat
def robust_listener():
max_retries = 3
retry_count = 0
while retry_count < max_retries:
try:
wx = WeChat() # 每次重试都新建对象
# ... 你的监听和AI回复逻辑 ...
# 在内部循环正常运行时,重置重试计数
retry_count = 0
except Exception as major_error:
print(f"\n*** 主循环发生严重错误: {major_error} ***")
retry_count += 1
if retry_count < max_retries:
wait_time = 10 * retry_count
print(f"等待 {wait_time} 秒后重试 ({retry_count}/{max_retries})...")
time.sleep(wait_time)
else:
print("已达到最大重试次数,程序退出。")
break
3.3 扩展想象:不止于聊天
基础对话稳定后,这个框架的潜力远不止于此。你可以轻松地为其添加各种插件化的功能。
场景一:信息查询与推送 你可以让AI连接网络搜索(通过其他API),当朋友问“今天天气怎么样?”时,机器人先调用天气API获取数据,再组织成自然语言回复。
场景二:自动化任务触发器 例如,当收到特定指令如“#提醒我晚上8点开会”时,机器人可以解析时间信息,并启动一个后台线程,在指定时间@你或发送提醒。
场景三:群聊管理助手 在群聊中,机器人可以监听特定关键词(如“签到”、“报名”),自动收集信息并整理成表格。或者当有人发布广告链接时,自动发出警告。
实现这些扩展功能的核心模式是“消息过滤器 + 动作执行器”。在主消息处理循环中,先对消息内容进行一系列匹配检查:
# 伪代码示例
def message_processor(who, sender, content):
# 1. 指令过滤
if content.startswith("#"):
handle_command(who, content)
return
# 2. 关键词触发过滤
if "天气" in content:
reply = fetch_weather(content)
send_reply(who, reply)
return
# 3. 默认AI对话
reply = ai_chat(who, content)
send_reply(who, reply)
这种架构使得功能模块之间耦合度低,添加新功能就像插拔积木一样简单。
4. 部署与长期运行建议
让一个Python脚本在个人电脑上7x24小时运行并不现实。你需要一个更稳定的环境。
方案一:云服务器(推荐) 购买一台入门级的云服务器(如腾讯云、阿里云的轻量应用服务器),安装Windows Server或带桌面环境的Linux。将你的脚本部署上去,并设置为开机自启动。这是最稳定、可靠的方式。
方案二:家用电脑配合任务计划
如果你只有家用电脑,可以使用Windows的“任务计划程序”或macOS/Linux的cron,设定在电脑启动时自动运行你的Python脚本。但请确保电脑不会自动休眠或关机。
方案三:容器化部署(进阶) 对于有一定经验的开发者,可以考虑使用Docker。你需要创建一个包含Windows基础镜像和微信客户端的Docker容器,但这步骤较为复杂,且微信的客户端环境在容器中可能不稳定。
无论选择哪种方案,日志记录都至关重要。不要再用简单的print了,使用Python内置的logging模块,将程序运行状态、收到的消息、发送的回复以及所有错误信息都记录到文件中。
import logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('wechat_assistant.log', encoding='utf-8'),
logging.StreamHandler() # 同时在控制台输出
]
)
logger = logging.getLogger(__name__)
# 在代码中替换 print
logger.info(f"开始监听微信...")
logger.error(f"发送消息失败: {e}")
定期查看日志文件,你就能知道你的机器人是否在正常工作,以及它都在“想”些什么。
最后,也是最重要的提醒:技术是一把双刃剑。请务必在合法、合规、尊重他人隐私的前提下使用这个工具。不要用于群发广告、骚扰他人或任何违反微信用户协议的行为。最好的使用场景,是将其作为一个提高个人效率、进行有趣互动的智能伙伴,而不是制造垃圾信息的机器。
687



被折叠的 条评论
为什么被折叠?



