测试时间:2023年10月
项目:微信群聊机器人
微信版本:3.9.6.33
系统:Windows 10、Windows 11。Mac和Linux无法使用此种方法解决。
工具:inspect.exe或者Accessibility Insights
实现原理:通过python的pywinauto库获取电脑端微信群聊的消息记录最后一条,回复别人@的消息记录。
直接贴代码
首先打开电脑端微信,登录自己计划做机器人的微信号
### 通过任务管理器获取打开的微信进程ID
app = Application(backend='uia').connect(process=8508)
### 或者自动获取,首先确定你电脑微信的名称,如果为WeChat.exe,直接使用下方代码即可
import psutil
def get_process_id(process_name):
for proc in psutil.process_iter(['pid', 'name']):
if proc.info['name'] == process_name:
return proc.info['pid']
return None
# 调用函数获取进程ID
process_id = get_process_id('WeChat.exe')
if process_id:
print(f"进程ID为:{process_id}")
else:
print("未找到该软件的进程")
app = Application(backend='uia').connect(process=process_id )
# 打印节点目录,使用inspect查看也可以
app['微信'].print_control_identifiers()
# 获取会话列表,排名第一的始终会是存在最新消息的群聊或朋友(除非有置顶群聊)
group_list = app['微信'].child_window(title="会话", control_type="List").children_texts()
group_list
# 把软件置于顶层,方便点击事件
def bring_window_to_top(window_title):
app = Application(backend="uia").connect(title=window_title)
window = app.window(title=window_title)
window.set_focus()
# 调用函数将指定软件窗口置于顶层
bring_window_to_top("微信")
app['微信'].child_window(title=group_list[0], control_type="Button").click_input()
#光标锁定的群聊所有展示的信息内容,这里一定要注意,取的消息是你微信群聊中光标选定的聊天记录,而不是最新消息
app['微信']['消息'].children_texts()
# 最后一条消息必须定义在前面
last_message = ""
time.sleep(3)
print("current group: ",app['微信'].child_window(title="会话", ontrol_type="List").children_texts()[0])
while True:
time.sleep(1)
x = app['微信']['消息'].children_texts()
me = "@Smith"
mess_list = []
for i in x:
if me in i:
mess_list.append(i.replace(me,"").strip())
will_pop_data = mess_list.pop()
if last_message != will_pop_data:
input_text = will_pop_data
send_msg = WechatResponse(input_text)
last_message = will_pop_data
# 只有不等于最后一条时才发送
# 点击指定的群聊,有可能光标在别的群聊上
wx_chat_win = app['微信'].child_window(title="测试非常1", control_type="ListItem")
wx_chat_win.click_input()
wx_msg_input = app['微信'].child_window(title="测试非常1", control_type="Edit")
# 聚焦到文本框
wx_msg_input.click_input()
# 输入发送信息
wx_msg_input.type_keys(send_msg)
# 点击发送按钮
wx_send_btn = app['微信'].child_window(title="发送(S)", control_type="Button")
wx_send_btn.click_input()
else:
print(f"最后一条消息last_message未有变化:{last_message}")
接入百度文心一言模型测试
# 文心一言API
import requests
import json
API_KEY = "API_KEY "
SECRET_KEY = "SECRET_KEY "
def get_access_token():
"""
使用 AK,SK 生成鉴权签名(Access Token)
:return: access_token,或是None(如果错误)
"""
url = "https://aip.baidubce.com/oauth/2.0/token"
params = {"grant_type": "client_credentials", "client_id": API_KEY, "client_secret": SECRET_KEY}
return str(requests.post(url, params=params).json().get("access_token"))
def WechatResponse(input_text):
url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant?access_token=" + get_access_token()
payload = json.dumps({
"messages": [
{
"role": "user",
"content": "你是Kevin的人工智能秘书,可以回答各种问题"
},
{
"role": "assistant",
"content": "好的。"
},
{
"role": "user",
"content": f"{input_text}"
}
]
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
return json.loads(response.text).get('result')