最近无聊做了个自动回复脚本
import openai
def chatgpt(question):
openai.api_key = "在这里填入你的API-key"
response = openai.Completion.create(
model="gpt-3.5-turbo-instruct",
prompt=question,
temperature=1, #模型回答的自由程度
max_tokens=2000, #一次能输出的最大字数,但并不一一对应
top_p=1,
frequency_penalty=0,
presence_penalty=0
)
#提取回答
answer = response.choices[0].text
return answer
这里先定义了一个chatgpt()函数用于调用官方api接口。这里使用的是3.5的模型。API-key可以在官网上获取。每注册一个账号官方会赠送5美元的api接口调度费(大概可以用几千次吧),api密钥在账号里可以找。
from uiautomation import WindowControl
def weixin_reply():
#绑定微信主窗口
wx = WindowControl(Name='微信',) # 窗口的名称被设置为'微信',表示该对象将尝试找到一个标题为'微信'的窗口
print("已绑定成功")
wx.SwitchToThisWindow() #使窗口 wx 切换到前台,显示在其他窗口之上
hw = wx.ListControl(Name='会话') # 该对象将尝试找到一个具有名称'会话'的列表控件,以供操作
# 什么是列表控件:列表控件(List Control)是一种常见的图形用户界面(GUI)元素,通常用于显示和管理一系列项目、数据、或选项。列表控件可以在各种桌面应用程序和操作系统中找到,用于展示信息、提供选择、或支持导航等功能。
# df = pd.read_csv('回复数据.csv', encoding='gb18030')
while True:
# TextControl 是 uiautomation 库中的一个类,用于表示文本控件,它可以用于获取或修改文本内容
we = hw.TextControl(searchDepth=4) #只读取左侧聊天会话框的前4个
# 死循环维持,没有超时报错
while not we.Exists(0):
pass
if we.Name: # 存在未读消息(Name表示消息的内容,不为None就继续运行)
we.Click(simulateMove=False) # 点击未读消息
print("点击成功")
last_msg = wx.ListControl(Name='消息').GetChildren()[-1].Name
# 创建了一个新的 ListControl 对象,用于查找名为'消息'的列表控件。
# .GetChildren() 方法获取'消息'列表控件的子控件,即消息列表中的各个消息项
# [-1] 表示选择最后一个消息项,然后通过 .Name 获取该消息项的名称,即最后一条消息
print('last_msg:',last_msg)
last_msg="请用中文回答:"+last_msg
print("last_msg",last_msg)
msg =chatgpt(last_msg)
wx.SendKeys(msg, waitTime=0)
print('成功输入')
wx.SendKeys('{Enter}', waitTime=0)
print('成功发送')
if __name__=="__main__":
weixin_reply()
接下来是用微软开发的uiautomation库进行模拟用户点击图形界面的操作。
整个脚本分成两个板块。一个函数用来调用GPT的API接口。另一个模块用来搜寻微信里联系人的未读取消息。然后把消息发给GPT处理。再把反馈回来的消息自动输入。 代码里的每一步都有print检测是否成功运行。
用的时候记得要一点魔法的哈。
1.0版本还不是很稳定,测试问题反馈如下:
1.在读取联系人未读消息方面存在bug,常常会读取非指定的联系人对话
2.出现多次读取同一条未读消息的bug,可能是GPT响应时间过久,频繁接受消息导致反应混乱
3.自己发的消息有时也会被当成未读消息
4.无法实现连续相关的回复
5.存在闪退概率
以上问题会在2.0版本里得到修复