目录

前言

一、uiautomation是什么?

二、openai怎么使用?

三、使用步骤

1.前期准备

2.引入库

3.主程序

4.演示效果

总结


前言

人工ai对话技术最近火热,相信很多人会想到做一款微信聊天机器人,让自己那些对程序不是很了解的亲朋好友使用体验一下。

目前大多数的微信聊天机器人,都是基于itchat或者wxautoapi 来操作微信,原理是监听和操作微信的网页版端口,来达到短信收发的目的。但腾讯官方对于这种办法卡得很严,很多微信账号(包括我的)已经不能使用了,就算使用也会面临封禁的风险。

也有用pyautogui来实现的,不过这种基于图像识别的技术的可移植性不是太好,也很难去实现某些功能。

在本文中,利用uiautomation去操作PC端微信,利用官方的openai库获得AI自动回复,实现微信聊天机器人的功能。

此微信聊天机器人的具有以下功能:

1.可以回复多名好友,能自动检测未读消息并回复。

2.配置上下文联系数量和每天问题字数限制,并且每天凌晨可以刷新字数限制。

3.可以给好友配置VIP权限,具有更多的上下文联系数量和问题限制。

4.可以回复群消息,只有当群友@聊天机器人的时候,才会回复。


一、uiautomation是什么?

uiautomation是python的一个模块,封装了微软UIAutomation API,可以对windows的桌面进行控件的搜索、点击等一些列操作,因为完全是桌面级操作,不涉及API接口问题,所以不容易被针对封禁——至少在微信操作上是这样。

uiautomation的原github地址链接

中文说明链接

二、openai怎么使用?

openai是官方提供的python库,通过API接口就可以去获取ChatGPT的回答,值得注意的是如何去实现上下文功能,下面是一段演示代码:

# Note: you need to be using OpenAI Python v0.27.0 for the code below to work
import openaiopenai.ChatCompletion.create(model="gpt-3.5-turbo",messages=[{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": "Who won the world series in 2020?"},{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},{"role": "user", "content": "Where was it played?"}]
)

在messages中,{"role": "system", "content": "You are a helpful assistant."}算是表头,系统消息有助于设置助手的行为。在上面的例子中,助手被指示“你是一个有帮助的助手”。通常,对话首先使用系统消息格式化,然后是交替的用户和助理消息。

{"role": "user", "content": "Who won the world series in 2020?"}就是第一次对话,"role": "user"表示是用户发起的,问的问题是"Who won the world series in 2020?"。

而{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."}就是第一次的回答,"role": "assistant"表示是AI的,回答内容是"The Los Angeles Dodgers won the World Series in 2020."

{"role": "user", "content": "Where was it played?"}就是第二次回答了,这样往复就能实现上下文的联系。

需要注意的是,message的发送也占用token数量,openai的chat-3.5模型收费价格是0.002美元/K token,虽然每个账号有18美元的免费额度,但是不限制上下文数量,估计没多久你的额度就爆了。

三、使用步骤

1.前期准备

首先推荐一个pytharm的插件,可以使用中文变量,像我这种英文不好的,最讨厌的就是去想变量名了,有了这个插件会方便好多,还减少了注释。直接在插件搜索Chinese就行:

其次,需要你把urllib3的版本回退到1.25.11,因为使用openai需要挂代理,但是1.26版以上会报错,而1.25.11版本就没有这个问题了。打开cmd,输入以下命令:

pip uninstall urllib3
pip install urllib3==1.25.11

2.引入库

import time
from datetime import datetime
import uiautomation as ui  # 导入控件控制库
import pyperclip  # 导入剪切板相关库
import pyautogui  # 导入自动操作库
import openai

3.主程序

openai.api_key = ""  # 这里填入你自己的OpenAi的API
ui.SetGlobalSearchTimeout(0)  # 设置全局搜索超时
info = {}
'''
用户配置,范例:
{'张':{'更新时间': '2023-04-01', '是否VIP': '是”,'最大Token数': 5000,'已使用Token数': 0,'上下文联系数量': 5,'messages':[{'role': 'system', 'content': '张的对话'}]}
}
'''
VipList = ['赵某', '王某', '智障']  # vip名单# 对用户创建一个专门的配置文件,用于存放权限以及对话上下文
def 用户配置(name, group=False):global info# 第一步:检索配置中是否存在该人if name in info:  # 如果在配置列表中if info[name]['更新时间'] != datetime.now().strftime('%y-%m-%d'):  # 如果当前日期和更新时间不同,更新频率为1天info[name]['更新时间'] = datetime.now().strftime('%y-%m-%d')  # 刷新更新时间info[name]['已使用Token数'] = 0  # 重置已使用Token数info[name]['messages'] = [{'role': 'system', 'content': name + '的对话'}]  # 重置messageselse:  # 不在配置列表中info[name] = {}  # 以用户名创建配置列表info[name]['更新时间'] = datetime.now().strftime('%y-%m-%d')info[name]['messages'] = [{'role': 'system', 'content': name + '的对话'}]info[name]['已使用Token数'] = 0# 第二步:判断一下用户是否为vipif name in VipList:  # 如果用户为vip用户info[name]['是否VIP'] = '是'info[name]['最大Token数'] = 5000info[name]['上下文联系数量'] = 10else:  # 如果用户非vip用户info[name]['是否VIP'] = '否'info[name]['最大Token数'] = 1000info[name]['上下文联系数量'] = 1# 第三步:判断一下用户是否为群聊用户if group:info[name]['是否VIP'] = '否'info[name]['最大Token数'] = 100000  # 因为是在群聊中所有人一起使用,可以设适当设置大一些,谨慎使用!info[name]['上下文联系数量'] = 1  # 因为是在群聊中所有人一起使用,所以最好就设置成不联系上下文了def getOpenAiMsg(name, question):"""此函数这是向OpenAi发送对话,并返回AI的回答Args:name:用户的名称,用于读写对应的用户配置,str格式question:对话的具体内容,str格式Returns:answer:AI的回答,str格式"""global infoif question == "权限":  # 如果用户输入“权限”,answer = name + "\n" \+ "更新时间: " + info[name]['更新时间'] + "\n" \+ "是否VIP: " + info[name]['是否VIP'] + "\n" \+ "上下文联系数量: " + str(info[name]['上下文联系数量']) + "\n" \+ "最大Token数: " + str(info[name]['最大Token数']) + "\n" \+ "已使用Token数: " + str(info[name]['已使用Token数'])return answer  # 则返回用户配置信息,不会触发后续的OpenAi自动回复if info[name]['已使用Token数'] >= info[name]['最大Token数']:  # 查询是否超出配额answer = '很抱歉,你今天使用量超出最大配额,发送“权限”查看您的账号情况'return answerelse:if len(info[name]['messages']) >= 2 * info[name]['上下文联系数量'] + 1:  # 如果上下文数量超出预设# 删除第一组对话info[name]['messages'].pop(1)info[name]['messages'].pop(1)if info[name]['上下文联系数量'] <= 1:  # 如果上下文数量设置为1info[name]['messages'] = [{'role': 'user', 'content': question}]  # 直接设置一条即可else:info[name]['messages'].append({'role': 'user', 'content': question})  # 增添对话信息try:response = openai.ChatCompletion.create(model='gpt-3.5-turbo',messages=info[name]['messages'],temperature=0.2)answer = response.choices[0].message.content  # 从返回值中提取回答# 把回答添加到用户配置中的上下文,为了防止tokens爆炸,限制了字数info[name]['messages'].append({'role': 'assistant', 'content': answer[:100]})info[name]['已使用Token数'] = info[name]['已使用Token数'] + response.usage.total_tokensreturn answerexcept:answer = '很抱歉,服务器出错,请重试'return answerdef 普通用户回复():"""普通用户的回复"""wx = ui.WindowControl(Name="微信", searchDepth=1)  # 绑定名为微信的主窗口控件wx.SwitchToThisWindow()  # 主窗口置前显示hw = wx.ListControl(Name="会话")  # 绑定对话列表we = hw.EditControl(searchDepth=3)  # 查找新对话if we.Exists(0):好友 = we.GetParentControl().GetParentControl()姓名 = 好友.Nameprint("聊天对象:" + 姓名)we.Click(simulateMove=False)last_msg = wx.ListControl(Name="消息").GetChildren()[-1].Name  # 获取最新消息print("获得消息:" + last_msg)用户配置(姓名)response = getOpenAiMsg(姓名, last_msg)  # 将收到的信息转发给OpenAiprint("你的回复:\n" + response)# print(info[姓名])     # 调试用,查看下用户配置print('已消耗标记:' + str(info[姓名]['已使用Token数']) + "\n--------------------------------------------------\n")# 输入回复信息pyperclip.copy(response)  # 复制信息pyautogui.hotkey('ctrl', 'v')  # 粘贴pyautogui.press('enter')  # 回车# 隐藏对话好友.RightClick()右键菜单 = ui.MenuControl(ClassName="CMenuWnd")if 右键菜单.Exists(3, 0.1):右键菜单.TextControl(Name="不显示聊天").Click()def 群聊用户回复():"""群聊用户的回复,请将群消息接收设置为消息免打扰"""wx = ui.WindowControl(Name="微信", searchDepth=1)  # 绑定名为微信的主窗口控件wx.SwitchToThisWindow()  # 主窗口置前显示hw = wx.ListControl(Name="会话")  # 绑定名为对话列表we = hw.EditControl(SubName="有人@我", searchDepth=5)  # 查找新对话if we.Exists(0):群对象 = we.GetParentControl().GetParentControl().GetParentControl().GetParentControl()群名 = 群对象.Nameprint("聊天群对象:" + 群名)we.Click(simulateMove=False)last_msg = wx.ListControl(Name="消息").GetChildren()[-1].Name  # 获取最新消息last_msg = last_msg[7:len(last_msg)]  # 将@信息删除,注意这里要和你自身的微信名相匹配,尤其注意微信被@后会多一个‘\u2005’的字符# print(wx.ListControl(Name="消息").GetChildren()[-1]) # 感兴趣的可以用这行命令去看下原始消息文本# print(last_msg == '权限')  # 建议先在群里发送”权限“两个字,用这行命令比对一下print("获得群消息:" + last_msg)用户配置(群名, True)response = getOpenAiMsg(群名, last_msg)  # 将收到的信息转发给OpenAiprint("你的回复:\n" + response)print('已消耗标记:' + str(info[群名]['已使用Token数']) + "\n--------------------------------------------------\n")# 输入回复信息pyperclip.copy(response)  # 复制信息pyautogui.hotkey('ctrl', 'v')  # 粘贴pyautogui.press('enter')  # 回车# 隐藏对话群对象.RightClick()  # 隐藏权限右键菜单 = ui.MenuControl(ClassName="CMenuWnd")if 右键菜单.Exists(3, 0.1):右键菜单.TextControl(Name="不显示聊天").Click()print("======================================\n开始\n======================================\n")
while True:普通用户回复()群聊用户回复()  # 记得把群消息接收设置为消息免打扰time.sleep(0.2)

4.演示效果

好友对话,发送”权限“时不会触发chatgpt,而是查看用户对应权限

好友对话,可以看到能正确触发上下文联系

群聊,从成本考虑,群聊一般不设置上下文联系。


总结

本文仅仅简单介绍了uiautomation和openai的一些相关知识,以及相应的实现代码,后续考虑把这个程序直接部署在服务器上长期运行,可惜在阿里云、腾讯云等国内厂家产品中,可部署的境外云服务器并不便宜,境内服务器又需要挂代理,实际体验下来还是挺受网络波动影响,快的时候可以秒回,慢的时候要等十几秒钟。

最后,编程不易,文章也写的幸苦,为了踩坑颇花了一些钱,这里求个捐助,随便大家给多少~

赞助二维码

【Python】uiautomation+openai构建基于chatGPT的微信聊天机器人相关推荐

  1. 基于ChatGPT实现微信聊天机器人

    ChatGPT近期以强大的对话和信息整合能力风靡全网,可以写代码.改论文.讲故事,几乎无所不能,这让人不禁有个大胆的想法,能否用他的对话模型把我们的微信打造成一个智能机器人,可以在与好友对话中给出意想 ...

  2. 搭建属于自己的基于ChatGPT的微信聊天机器人(方法)

    文章目录 1. GitHub开源项目 2. 前期准备 (1) 获取openAI API key 3. 准备部署环境 (1) 配置代理 (2) 配置python环境 4. 部署 (1) 修改配置文件 ( ...

  3. 部署一个基于ChatGPT的微信聊天机器人以及产生的思考

    文章目录 前言 功能 反响 思考 这篇文章主要展示了基于ChatGPT的微信聊天机器人的效果,以及在部署过程中我产生的一些思考.部署一个这样的机器人的具体方法我过两天会单独写一篇文章. 前言 最近几个 ...

  4. 10分钟搭建ChatGPT API微信聊天机器人

    引言:今天看到ChatGPT开放了API,就顺便找了一个开源项目,把微信聊天机器人搭起来了.1. 注册ChatGPT 这个网上都有很多的教程,我这里就不赘述了 2. 获取ChatGPT API Key ...

  5. 基于“机器学习”的智能聊天机器人---python实现(1)

    本博文以自己课程设计为依托,介绍如何利用python语言编程实现基于"机器学习"的智能聊天机器人.由于本项目是自己首次接触python以及利用计算机编程实现小型项目,中途遇到诸多问 ...

  6. 基于python以及AIUI WebSocket,WeChatPYAPI实现的微信聊天机器人

    基于python以及AIUI WebSocket,WeChatPYAPI实现的微信聊天机器人 做此文的目的首先是学习Markdown的用法哈哈哈哈,其实也是记录自己学习的一个过程. 以后我也会将自己在 ...

  7. 如何使用 ChatGPT API 构建您自己的 AI 聊天机器人:分步教程

    在一个突破性的公告中,OpenAI 最近向开发人员和公众介绍了ChatGPT API.特别是,为ChatGPT Plus 提供支持的新"gpt-3.5-turbo"型号已经以便宜 ...

  8. ChatGPT新玩法来了,微信聊天机器人

    前言 上一篇文章中说了ChatGPT是什么,然后怎么注册使用. 传送门:花了1块钱体验一把最近很火的ChatGPT 但是实际操作下来还是有不少小伙伴跟我一样遇到各种坑. 没有科学上网工具 OpenAI ...

  9. 毕业设计 : 基于stm32的微信天气机器人 - 天气检测 环境监测 微信机器人

    0 简介 Hi,大家好,这里是三文工作室,今天向大家介绍一个 单片机项目 基于stm32的微信天气机器人 - 天气检测 环境监测 微信机器人 大家可用于 课程设计 或 毕业设计 print(" ...

最新文章

  1. Struts 2框架结构图
  2. 从FTP建立连接模式想到的TCP SYNFlood防御
  3. Elasticsearch原理与调优
  4. pthread_cancel、pthread_equal函数
  5. python参考文献_[zotero/python]库中参考文献条目删除后,清除残留PDF的脚本
  6. html点击图片放大_vue 插件之picture-markert图片标注
  7. shopex安装Zend Optimizer - 3.3.0后依然乱码
  8. 【UOJ348】【WC2018】州区划分 状压DP FWT
  9. Tensorflow 之 name/variable_scope 变量管理
  10. 几何修复_*ST海润:实施终止退市 光伏产业修复成几何?
  11. Web开发中,使用表格来展示每个角色对应的权限
  12. Hadoop大数据生态组件环境安装
  13. ALTRUN 工具使用笔记
  14. TeamViewer远程访问打开软件黑屏
  15. 前端用到的单词(读音+意思)
  16. win10怎么显示文件后缀名,2个步骤,不到1分钟学会
  17. Auditbeat日志审计方案
  18. 英语口语九十九之每日十句口语
  19. Windows必备软件,大而全|2022版
  20. linux bios密码设置时间,linux忘记root密码及时间设定

热门文章

  1. 自己做量化交易软件(19)通达信公式转Python代码的程序
  2. 将Excel2003的xls格式文件转换为kml及gpx文件(ExcelToKml)
  3. MYSQL收获及体会_我的MYSQL学习心得(一) 简单语法
  4. 联合概率、边缘概率、条件概率之间的关系贝叶斯公式
  5. 【虚幻引擎】UE4 Spline(样条线)
  6. 18_lede_固件
  7. cadence SPB17.4 - allegro - 将板子的外形和接口作为一个整体做成封装
  8. html注册表单用户体验,入口的用户体验!注册表单的设计技巧
  9. 国标平台视频流抓取及rtp包解析
  10. maven命令指定打包模块