用AI实现微信自动聊天应该已经屡见不鲜了,不过我用的是扣子里自己创建的智能体,不但可以写AI的人设,还可以设定成长期记忆。在技能上和限制上写好自己的要求,AI将会更像真人说的话。如果在知识区加入一些产品的文档的话,甚至可以担当AI客服。下面的代码会写上连接扣子智能体接口的代码。
连接扣子智能体API:
发起对话接口将会向指定智能体发起一次对话,扣子ai的响应方式分为两种:流式或非流式响应。我采用的是流式响应的接口方式。chat_content为向ai传送的消息,该消息由第二个代码检测微信新消息内容,自动发送内容的文本。
import requests
import json
def aiautodata(chat_content):
url = "https://api.coze.cn/v3/chat"
# 替换为你真实的授权令牌(示例中的已打码部分)
authorization_token = "pat_OVzZzsF7GNE5ORfPF_Your_token_XBnFdyieRmmkQUVNgfOT"
# 请求头信息
headers = {
"Authorization": f"Bearer {authorization_token}",
"Content-Type": "application/json"
}
# 请求体数据
data = {
"bot_id": "your_bot_id",
"user_id": "123456",
"stream": True,
"auto_save_history": True,
"additional_messages": [
{
"role": "user",
"content": chat_content,
"content_type": "text"
}
]
}
try:
# 发送POST请求
response = requests.post(url, headers=headers, data=json.dumps(data))
if response.status_code == 200:
# 按行读取响应内容,因为它是事件流格式
result = response.content
decoded_string = result.decode('UTF-8')
lines = decoded_string.split('\n\n')
for line in lines:
if "event:conversation.message.completed"in line and'"answer"' in line:
data_str=line.split('event:conversation.message.completed\ndata:')[1]
try:
event_obj = json.loads(data_str)
# print(event_obj["content"])
return(event_obj["content"])
except json.JSONDecodeError:
# print("出错了")
continue
else:
print(f"请求失败,状态码: {response.status_code}")
except requests.RequestException as e:
print(f"请求出现异常1: {e}")
实现微信自动回复:
这段代码的主要功能是监控微信会话列表中的新消息,当有新消息时,获取消息内容和发消息人的名称,调用自定义的 ai
模块生成回复内容,然后将回复内容发送到微信聊天窗口。如何找到控件、明确控件ControlType、以及searchDepth,可以用inspect.exe工具。
# -*- coding: utf-8 -*-
from uiautomation import WindowControl
import ai # 导入自定义的 ai 模块,连接扣子智能体
# 通过 WindowControl 类定位名为 '微信' 的窗口控件
wx = WindowControl(
Name='微信',
searchDepth=1
)
# 将微信窗口切换到当前活动窗口
wx.SwitchToThisWindow()
# 在微信窗口中定位名为 '会话' 的列表控件
hw = wx.ListControl(searchDepth=8,Name='会话')
# 进入一个无限循环,持续监控微信会话消息
while True:
#查找是否存在新消息
we = hw.TextControl(searchDepth=3)
# 死循环维持,没有超时报错
while not we.Exists(0):
pass
# 获取当前控件的前两个父控件,获取和你聊天的人的名字
current_control=we
for _ in range(2):
parent_control = current_control.GetParentControl()
if parent_control:
current_control = parent_control
parent_name = current_control.Name
# 使用切片去掉后n个字符
n = 5
userchat_name = parent_name[:-n]
# print(f"上二层父控件的名称是: {parent_name}")
if we.Name:
# 将微信窗口设置为活动窗口
wx.SetActive()
# 点击未读消息
we.Click()
# 获取当前会话的最后一条消息
last_msg = wx.ListControl(Name='消息').GetChildren()[-1].Name
print("你的亲朋好友——"+f"{userchat_name},"+"对Surke你说了:"+last_msg+" 现在请Surke你以你的身份回复")
# 调用 ai 模块中的 aiautodata 函数,传入消息提示,获取回复内容
chat_reply=ai.aiautodata("你的亲朋好友——"+f"{userchat_name},"+"对Surke你说了:"+last_msg+" 现在请Surke你以你的身份回复")
we.Click()
print("回复内容:",chat_reply)
# 然后使用 wx.SendKeys 方法将回复内容发送到微信输入框
wx.SendKeys(chat_reply.replace('{br}', '{Shift}{Enter}'), waitTime=0)
# 模拟按下回车键,发送回复消息
wx.SendKeys('{Enter}', waitTime=0)
我给自己的AI写的人设:
下面是我自己给自己创建的ai写的人设,可以给你们提供一些参考。(当然AI的人设也可以写成嘴毒之类的,形象应该会更鲜明)
# 角色
你是 Surke,一位积极向上的大学生。外表高冷,话语贴心,能敏锐感知他人情绪并恰当回应。兴趣爱好广泛,对二次元、音乐颇为了解,极会照顾人。热衷于信息技术与科技,数理成绩优异,实践和团队协作能力出众,始终保持奋进状态。
## 技能
### 技能 1: 日常简短聊天
1. 记录并牢记对话内容,面对日常话题,热情且简要地回应,并结合自身兴趣给出贴心观点。若遇到需承诺条件的情况,检查该条件被提出次数,若在三次及以内,回复“最近很忙,以后再说”;若超过三次,回复“那你这么急的话,就跟我打电话吧”。
2. 留意对方情绪,在其低落时简短安慰与鼓励。
3. 平均五次对话中,结合之前交流使用一次颜文字。
## 限制:
- 仅围绕日常交流进行简短回复,不回答无关话题。
- 回复简洁,语言温和,契合角色设定。
- 务必清晰记住对方上次所说内容,并在回复中适度体现关联。
- 回复在25字左右 。
- 尽量少在回复消息中使用颜文字 。