SelfLove 发表于 2024-7-22 23:30

一个简单的基于pywinauto的微信AI对话机器人

本帖最后由 SelfLove 于 2024-7-22 23:35 编辑

后续会增加群管理、公众号内容爬取之类的,以下源码:
```
import win32gui
import win32con
import win32process
import time
import Qwen# 导入自定义AI请求模型
from threading import Thread
from pywinauto.application import Application


def get_hwnd():
    try:
      hwnd = win32gui.FindWindow("WeChatMainWndForPC", "微信")# 根据类名或窗口名找到主窗口句柄
      return hwnd
    except Exception as e:
      print(e)


def get_process(hwnd):
    try:
      thr, proc = win32process.GetWindowThreadProcessId(hwnd)# 获取当前窗口进程id
      # print(proc)
      return proc
    except Exception as e:
      print(e)


def set_top(hwnd):
    try:
      win32gui.ShowWindow(hwnd, win32con.SW_RESTORE)# 若窗口最小化或被遮挡则显示
      win32gui.SetForegroundWindow(hwnd)# 将窗口设为顶层
    except Exception as e:
      print(e)


def sear_target(proc, name):
    try:
      # title对应inspect中name control_type对应inspect中LocalizedControlType的英文
      app = Application(backend='uia').connect(process=proc)# 根据进程号连接到应用
      search_lable = app.top_window().child_window(title="搜索")
      search_lable.click_input()
      search_lable.type_keys(name)
      # 找到搜索结果列表 该title可能存在一定的局限性
      target = app.top_window().child_window(title="@str:IDS_FAV_SEARCH_RESULT:3780", control_type="List")
      target.child_window(title=name, control_type="Button").click_input()
      return app# 返回应用对象
    except Exception as e:
      print(e)


def get_message(app, target):
    front_message =
    last_message =
    while True:
      try:
            message_list = app.top_window().child_window(title="消息", control_type="List")
            item_last = message_list.get_item(-1)# 获得列表项最后一项
            # iter_children()返回生成器
            name = next(item_last.iter_children(control_type="Button")).window_text()
            if name == target:# 比较最新的一条消息是否是目标对象发送的
                print(item_last.window_text())
                front_message = item_last.window_text()# 更新前消息列表
            if front_message != last_message:# 比较前消息列表是否与后消息列表一致
                last_message = front_message
                edit_lable = app.top_window().child_window(title=target, control_type="Edit")# 获取当前目标的编辑控件
                req_message = last_message
                resp_message = ai_reply(req_message)# 发送ai请求
                edit_lable.click_input()
                edit_lable.type_keys(resp_message)
                edit_lable.type_keys("{ENTER}")
            time.sleep(1)# 休眠避免过度轮询
      except Exception as e:
            print(e)


def ai_reply(message):
    resp = Qwen.generate_response(message)
    return resp


if __name__ == '__main__':
    target = "对话目标"# 需要完整的目标名
    hwnd = get_hwnd()
    proc = get_process(hwnd)
    set_top(hwnd)
    app = sear_target(proc, target)
    Thread(target=get_message, args=(app, target)).start()# 新开一个线程用于轮询获取消息和ai回复

    while True:
      time.sleep(1)
      set_top(hwnd)# 保持微信窗口在最顶层

```

这是我本地部署的Qwen2:7b的模型,原谅我的AMD显卡打上Ollama的补丁也不能跑Qwen3
```
from openai import OpenAI

def generate_response(message, times=3):
    try:
      client = OpenAI(
            base_url='http://localhost:11434/v1/',

            # required but ignored
            api_key='ollama',
      )

      chat_completion = client.chat.completions.create(
            messages=[
                {
                  'role': 'user',
                  'content': message,
                }
            ],
            model='qwen:7b',
      )
      return chat_completion.choices.message.content
    except:
      times -= 1
      if times > 0:
            return generate_response(message, times)
      else:
            return '错误:请求异常,请检查您的网络和API地址与Key是否正确'

```

SelfLove 发表于 2024-7-23 08:56

似水流年2015 发表于 2024-7-23 02:35
我想学一下那个部署本地AI,哈哈

挺简单的,PC端下载Ollama的客户端(国内可直连访问,无需魔法),然后在网页model处查看自己想运行的模型,复制下载(一般为“ollama pull 你要的模型”)命令,在终端处粘贴,等待下载;完成后ollama run 模型名即可,AMD显卡6800以上是能直接跑的,以下的需要打补丁,NVIDIA显卡都行,没显卡的CPU也能跑,速度也能接受

似水流年2015 发表于 2024-7-23 02:35

我想学一下那个部署本地AI,哈哈

52pojie210748 发表于 2024-7-23 05:58

6666 一直想要一个机器人

50lovelace 发表于 2024-7-23 08:02

哪位大佬详细介绍一下怎么用,一直想有个微信机器人 自动回复信息用

侃遍天下无二人 发表于 2024-7-23 09:27

本地部署的AI受道德约束吗,能否关掉约束

SelfLove 发表于 2024-7-23 09:30

50lovelace 发表于 2024-7-23 08:02
哪位大佬详细介绍一下怎么用,一直想有个微信机器人 自动回复信息用

这个是基于ai模型的,意思是你的有本地部署的ai和网络ai的api请求接口,才能实现对话
使用方法是将target的文字改成你要对话的目标

SelfLove 发表于 2024-7-23 09:37

侃遍天下无二人 发表于 2024-7-23 09:27
本地部署的AI受道德约束吗,能否关掉约束

本地部署ai都没有思想钢印,但如果是国内训练的ai模型可能会屏蔽掉一些敏感信息,国外的模型则没有例如llama3之类的,但国外模型对中文的处理不是很好,你可以下中文微调版

Xiaosesi 发表于 2024-7-23 09:56

这个需要python几运行

SelfLove 发表于 2024-7-23 10:16

Xiaosesi 发表于 2024-7-23 09:56
这个需要python几运行

建议3.10.x,我是这个版本
页: [1] 2
查看完整版本: 一个简单的基于pywinauto的微信AI对话机器人