小张的学习笔记

如何使用python做一个微信群聊机器人 - 测试

    测试时间: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')