仅用30多行代码实现一个微信AI聊天机器人

前言

本文章将介绍如何使用Pythonwxautolangchain一个免费的api-key实现一个微信AI聊天机器人,自动回复消息

准备

本文章使用Python3.13

编辑器使用的是PyCharm

使用wxauto实现微信消息的自动发送以及langchain调用智谱AI大模型(免费),当然你也可以切换为其他服务商的

开始之前先使用pip安装几个需要用到的软件包

python 复制代码
# 安装wxauto
pip install wxauto

# 安装 langchain 
pip install langchain_core
pip install langchain_openai

# 安装 dotenv 加载环境变量
pip install dotenv

点击进入智谱AI大模型注册一个账号

注册成功之后点击页面右上角的API秘钥

这个就是等会要使用的key

wxauto

介绍

没安装的话先安装一下:

python 复制代码
pip install wxauto

wxauto是一个基于UIAutomation的开源的Python为四年自动化库,使用方式简单,即使是Python初学者也可以简单上手自动化微信操作

比如向文件传输助手发送消息:

python 复制代码
from wxauto import *
# 初始化微信duixinag
wx = WeChat()
# 向文件助手发送 Hello World!
wx.SendMsg("Hello World!","文件传输助手")

以上代码就简单实现了一个发送消息的功能,第一个参数是消息内容,第二个参数是发送对象

此时点击▶️运行,就会自动打开微信文件传输助手的聊天窗口发送Hello World!的消息,当然前提是你先登录你的微信先

使用<font style="color:rgb(31, 35, 41);">wxauto</font>,许多的日常微信操作均可实现自动化,比如自动向指定的联系人或群组发送消息、自动添加好友、智能设定自动回复规则、高效自动获取包括聊天记录、图片、文件等在内的各类信息资源,为微信使用场景带来便捷高效的自动化体验。

好啦!到这你可以直接跳到实现步骤那里,接下来我将详细介绍一下<font style="color:rgb(31, 35, 41);">wxauto</font>的使用

wxauto的基本使用

1.发送文字消息
python 复制代码
from wxauto import *
# 创建微信窗口对象
wx = WxChat()

# 消息内容
msg = "Hello World!"
# 要发送给谁
who = "世界"
# 是否清除原本聊天框的消息内容
clear = True
# 要@的人可以是一个列表 "世界" 或 ["世界","你好"]
at = ["世界","你好"]

wx.SendMsg(msg=msg,who=who,clear=clear,at=at) # @世界 @你好 Hello World!
2.发送图片
python 复制代码
# 发送的文件列表
files = [
    r'C:\Users\user\Desktop\XXX架构图.jpg',   # 图片
    r'C:\Users\user\Desktop\netty-demo.txt',   # 文件
    r'C:\Users\user\Desktop\在现在这个环境下如何进大厂.mp4'    # 视频
]
# 要发送给谁
who = '文件传输助手'
wx.SendFiles(filepath=files, who=who)
3.获取消息
python 复制代码
# 获取当前聊天窗口消息
msgs = wx.GetAllMessage()
# ['世界', 'hello'], ['SYS', '11:06'], ['SYS', '"世界" 撤回了一条消息'], ['SYS', '11:16'], ['Self', '你好']]

通过typecontent可以获取是谁发送的消息以及消息内容

python 复制代码
for msg in msgs:
    print("type:"+ msg.type + ",content:" + msg.content)
# type:sys,content:昨天 20:28
# type:friend,content:[图片]
# type:sys,content:昨天 20:43
# type:friend,content:ok 
# type:self,content:嗯

sys系统消息

self自己发送的消息

friend朋友发送的消息

time时间消息

recall撤回消息

msg.sender可以获取发送者的名称

使用LoadMoreMessage9()可以加载更多历史消息

python 复制代码
# 加载更多历史消息
wx.LoadMoreMessage()

# 获取当前聊天窗口消息
msgs = wx.GetAllMessage()
4.保存图片、文件、语音转文字等内容

savepic:是否保存聊天图片

savefile:是否保存聊天文件

savevoice:是否保存聊天语音转文字内容

默认都为false

python 复制代码
# 获取当前聊天窗口消息
msgs = wx.GetAllMessage(
    savepic   = True,   # 保存图片
    savefile  = True,   # 保存文件
    savevoice = True    # 保存语音转文字内容
)
5.监听消息
python 复制代码
# 监听的消息列表 好友 或 群
listen_list = [
    '张三',
    '李四',
    '王五',
    '赵六'
]

# 调用AddListenChat添加监听对象
for i in listen_list:
    wx.AddListenChat(who=i)
    
# 获取监听消息
msgs = wx.GetListenMessage()
for chat in msgs:
    one_msgs = msgs.get(chat)   # 获取消息内容
    
6.添加好友
python 复制代码
from wxauto import WeChat

wx = WeChat()

keywords = '18500000000'      # 微信号、手机号、QQ号
addmsg = '你好,我是小Q'      # 添加好友的消息
remark = '备注名字'            # 备注名,没有则不用设置
tags = ['人机', '朋友']        # 标签列表

# 发起好友申请
wx.AddNewFriend(keywords, addmsg=addmsg, remark=remark, tags=tags)
7.接受好友请求
python 复制代码
from wxauto import WeChat

wx = WeChat()

new = wx.GetNewFriends()
# [<wxauto New Friends Element at 0x1e95fced080 (张三: 你好,我是xxx群的张三)>,
# <wxauto New Friends Element at 0x1e95fced081 (李四: 你好,我是xxx群的李四)>]


# 获取第一个可接受的新好友对象
new_friend1 = new[0]

print(new_friend1.name)  # 获取好友申请昵称
# 张三

print(new_friend1.msg)  # 获取好友申请信息
# 你好,我是xxx群的张三

# 接受好友请求,并且添加备注"备注张三"、添加标签wxauto
new_friend1.Accept(remark='备注世界', tags=['world'])

# 切换回聊天页面
wx.SwitchToChat()
8.切换到聊天框
python 复制代码
# 切换到指定好友的聊天框
who="hello"
wx.ChatWith(who=who)

# 切换到聊天页面
wx.SwitchToChat()'

# 切换到通讯录页面
wx.SwithcToContact()
9.获取好友信息
python 复制代码
# 获取粗略信息
friend_infos = wx.GetAllFriends()
# [{'nickname': '世界', 'remark': 'world', 'tags': None},
#  {'nickname': '你好', 'remark': None, 'tags': ['同事', '朋友']},


# 获取详情信息
friend_details = wx.GetAllFriendsDetail()
# [{'微信号:': 'abc123456',
#   '地区:': '上海 浦东新区',
#   '备注': '',
#   '标签': 'wxauto',
#   '共同群聊': '1个',
#   '来源': '通过扫一扫添加',
#   '昵称': '张三'},
# {'备注': '',
#  '企业': '广州融创文旅城',
#  '实名': '***',
#  '官方商城': '🎫购滑雪票入口🎫',
#  '通知': '回复时间为工作日9点-18点',
#  '会员商城': '🏂热雪值兑换雪票🏂',
#  '冰箱赞滑': '👬申请冰箱主理人👭',
#  '全民滑雪': '购票赢黄金会籍',
#  '共同群聊': '1个',
#  '昵称': '广州大冰箱'},...]

对象说明我就不介绍了,同学们可以点击进入wxauto官方文档进行了解

好啦就简单介绍到这里,是不是很简单调用一下API就可以实现了,接下来我们实现一个AI微信聊天机器人

实现步骤

1.准备

如果没有安装软件包我们先安装一下

python 复制代码
# 安装wxauto
pip install wxauto

# 安装 langchain 
pip install langchain_core
pip install langchain_openai

# 安装 dotenv 加载环境变量
pip install dotenv

新建一个目录命名wechat-bot(随便英文就行)

2.添加环境变量

在目录下一个main.py文件还有一个.env文件,.env文件用于添加环境变量,使用PyCharm打开

.env添加ZHIPUAI_API_KEY,值为你在智谱AI控制台获取的api_key

python 复制代码
ZHIPUAI_API_KEY = xxxxxxxxxxxxxxxxx  # 替换为你自己的api_key

main.py中加载环境变量

python 复制代码
from dotenv import load_dotenv
# 使用load_dotenv 加载环境变量
load_dotenv()
# 测试一下
print(os.environ.get("ZHIPUAI_API_KEY")) 

右键点击▶️运行,如果控制台打印出正确的值则证明

3.测试使用wxauto

我们将main.py文件的内容替换为以下代码:

python 复制代码
import os
from wxauto import WeChat
from dotenv import load_dotenv
# 加载环境变量
load_dotenv()
# 创建微信对象
wx = WeChat()
# 发送消息
wx.SendMsg("你好", "文件传输助手")

如果成功自动打开微信,并发送"你好"消息给文件传输助手,则是成功的

如果他报错"无效的窗口句柄",你需要打开并登录PC端微信

4.使用LangChain调用大模型

Langchain通过API调用大模型

python 复制代码
import os

from langchain_core.messages import HumanMessage, SystemMessage
from langchain_openai import ChatOpenAI
from wxauto import WeChat
from dotenv import load_dotenv

load_dotenv()

# 模型名称
model = 'glm-4'
# 从环境变量中获取api-key
api_key = os.environ.get('ZHIPUAI_API_KEY')
# 初始化ChatOpenAI对象
llm = ChatOpenAI(
        openai_api_key = api_key,  # api-key
        openai_api_base = "https://open.bigmodel.cn/api/paas/v4",  # 请求地址
        model_name = model,  # 模型名称
        # stream: true
        )

messages = [
    # 人类的消息
    HumanMessage(content = "如何让自己快乐?")
    ]

# 执行
response = llm.invoke(messages)

print(response.content)

这些是LangChain的基本使用如果想要深入学习同学们可以自行上网学习,这里就不说这么详细了

我们右键点击▶️运行,控制台打印以下内容

我们成功的使用Langchain调用的AI大模型

5.实现

我们删除main.py文件的测试代码,替换为以下代码:

python 复制代码
import os
from time import sleep

from dotenv import load_dotenv
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_openai import ChatOpenAI
from wxauto import *

# 加载环境遍历那个
load_dotenv()

# 使用 wxauto 自动发送消息
wx = WeChat()
# 使用的模型名称
model = 'glm-4'
# 从环境变量中获取api-key
api_key = os.environ.get("ZHIPUAI_API_KEY")
# 初始化ChatOpenAI对象
llm = ChatOpenAI(
        openai_api_key = api_key, # api-key
        openai_api_base = "https://open.bigmodel.cn/api/paas/v4/", # 请求地址
        model_name = model, # 模型名称
        )

添加需要监听的用户列表或群列表

python 复制代码
# 定义需要监听联系人或群的列表
listen_list = [
    "xxx"
    ]

# 给每一个列表联系人添加监听设置
for i in listen_list:
    wx.AddListenChat(who = i)

我们再添加主要的逻辑

python 复制代码
# 定义需要监听联系人或群的列表
listen_list = [
    "xxx"
    ]

# 给每一个列表联系人添加监听设置
for i in listen_list:
    wx.AddListenChat(who = i, savepic = True)

# 无线循环 持续监听和处理微信消息
while True:
    # 获取监听到的消息
    msgs = wx.GetListenMessage()
    for chat in msgs:
        # 获取聊天窗口名(人或群名)
        who = chat.who
        # 获取特定聊天窗口的消息列表
        one_megs = msgs.get(chat)
        # 遍历聊天窗口中的每条消息列表
        for msg in one_megs:
            # 获取消息类型
            msg_type = msg.type
            # 获取消息内容
            content = msg.content
            # 如果消息类型是"friend"即是来自好友的消息
            if msg_type == "friend":
                # 调用大模型
                message = llm.predict(content)
                # 发送消息给当前窗口的好友
                chat.SendMsg(message)

listen_list为需要监听的好友名称列表,然后我们通过循环给每一个好友添加监听,当有列表中有好友发送消息时就会触发然后获取消息内容,在判断是不是好友发送的消息,如果是好友发送的消息则调用AI大模型,获取大模型返回的答案,发送给当前的好友

我们右键▶️运行启动,自动打开微信窗口然后打开listen_list列表中存在好友窗口,进行监听

当有listen_list的好友发送消息过来的时候就会调用大模型自动回复消息

6.优化

当前的没有上下文记忆,这怎么能行?我们给他简单添加一下,我们在main.py文件中添加以下代码:

python 复制代码
# 存储不同用户的上下文
user_contexts = {}

在判断是否是好友发送消息那个判断语句替换成这个逻辑

python 复制代码
 if msg_type == "friend":
                # 检查当前用户是否已经在user_contexts字典中有记录
                if who not in user_contexts:
                    # 如果没有则为当前用户创建一个空的消息列表
                    user_contexts[who] = []

                # 给当前用户给的上下文添加消息
                user_contexts[who].append(HumanMessage(content = content))

                #  使用当前用户的上下文调用模型,并获取模型的回复
                response = llm.invoke(user_contexts[who])

                # 将模型回复的消息添加的当前用户的上下文列表
                user_contexts[who].append(SystemMessage(response.content))

                # 将模型的回复发送给当前好友所在的聊天窗口
                chat.SendMsg(response.content)

我们添加了一个user_contexts对象用户存储不同用户的上下文,在用户发送消息时,将用户发送的消息添加到用户对应的上下文列表,如果没有则创建,然后再使用当前用户的上下文调用模型,获取回复,然后将回复的消息再添加到当前用户的上下文列表,最后将回复的消息发送给用户

这样就简单实现的上下文记忆了,重启之后还是会消失的

7.最终代码

python 复制代码
import os
from langchain_core.messages import HumanMessage, SystemMessage
from wxauto import *
from time import sleep
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
load_dotenv()
# 使用 wxauto 自动发送消息
wx = WeChat()
model = 'glm-4'
api_key = os.environ.get("ZHIPUAI_API_KEY")
# 初始化ChatOpenAI对象
llm = ChatOpenAI(openai_api_key = api_key,openai_api_base = "https://open.bigmodel.cn/api/paas/v4/",model_name = model,)
# 存储不同用户的上下文
user_contexts = {}
# 定义需要监听联系人或群的列表
listen_list = [ "李小康"]
# 给每一个列表联系人添加监听设置
for i in listen_list:
    wx.AddListenChat(who = i,savepic = True)
# 设置每次循环的等待时间
wait = 1
# 无线循环 持续监听和处理微信消息
while True:
    # 获取监听到的消息
    msgs = wx.GetListenMessage()
    for chat in msgs:
        # 获取聊天窗口名(人或群名)
        who = chat.who
        # 获取特定聊天窗口的消息列表
        one_megs = msgs.get(chat)
        # 遍历聊天窗口中的每条消息列表
        for msg in one_megs:
            # 获取消息类型
            msg_type = msg.type
            # 获取消息内容
            content = msg.content
            # 如果消息类型是"friend"即是来自好友的消息
            if msg_type == "friend":
                # 检查当前用户是否已经在user_contexts字典中有记录
                if who not in user_contexts:
                    # 如果没有则为当前用户创建一个空的消息列表
                    user_contexts[who] = []
                # 给当前用户给的上下文添加消息
                user_contexts[who].append(HumanMessage(content = content))
                #  使用当前用户的上下文调用模型,并获取模型的回复
                response = llm.invoke(user_contexts[who])
                # 将模型回复的消息添加的当前用户的上下文列表
                user_contexts[who].append(SystemMessage(response.content))
                # 将模型的回复发送给当前好友所在的聊天窗口
                chat.SendMsg(response.content)
    # 暂停指定的事件,然后继续下一次的循环,检查新的消息
    sleep(wait)

测试一下吧

去掉注释不就三十多行代码了吗😏

怎么样是不是 So Easy😉

总结

好啦!最后我们总结一下

我们成功的使用Pythonwxauto自动化库,实现了微信的自动化

我详细的介绍了wxauto微信自动化库的使用

最后我们简单实现了一个微信聊天机器人的案例

通过langchain调用AI大模型实现聊天的智能回复,最后再添加上下文记忆功能,从而提供更好的聊天体验

那有的同学会问每次都要这样登录微信然后运行py文件,多麻烦呀,当然同学们可以买一个服务器在上面上运行可以点击进入官方文档进行了解

欢迎关注我的公众号: 小Q的编程笔记

相关推荐
爱写代码的小朋友几秒前
使用 Python 和 OpenCV 实现摄像头人脸检测并截图
人工智能·python·opencv
爱技术的小伙子38 分钟前
【ChatGPT】通过Prompt技巧优化ChatGPT的营销文案输出
人工智能·chatgpt·prompt
Srlua39 分钟前
基于标签相关性的多标签学习
python
AI大模型-王哥1 小时前
产业科普 | 什么是人工智能和大模型?大模型入门到精通 看完你就明白了
人工智能·学习·langchain·大模型·大模型学习·大模型入门·大模型教程
qhqlnannan1 小时前
机器学习——多重共线性问题
人工智能·机器学习
拓端研究室TRL1 小时前
Python注意力机制Attention下CNN-LSTM-ARIMA混合模型预测中国银行股票价格|附数据代码...
开发语言·人工智能·python·cnn·lstm
橘子在努力1 小时前
CompletableFuture的那些事儿
开发语言·python
AnFany1 小时前
LeetCode【0051】N皇后
python·算法·leetcode·回溯法·n皇后
lanboAI1 小时前
基于yolov5的番茄成熟度检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】
python·yolo·智能手机
可别是个可爱鬼1 小时前
代码随想录 -- 动态规划 -- 完全平方数
数据结构·python·算法·leetcode·动态规划