吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2075|回复: 17
上一主题 下一主题
收起左侧

[Python 原创] 一个简单的基于pywinauto的微信AI对话机器人

  [复制链接]
跳转到指定楼层
楼主
SelfLove 发表于 2024-7-22 23:30 回帖奖励
本帖最后由 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 = [0]
    last_message = [0]
    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[0] = item_last.window_text()  # 更新前消息列表
            if front_message != last_message:  # 比较前消息列表是否与后消息列表一致
                last_message[0] = front_message[0]
                edit_lable = app.top_window().child_window(title=target, control_type="Edit")  # 获取当前目标的编辑控件
                req_message = last_message[0]
                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[0].message.content
    except:
        times -= 1
        if times > 0:
            return generate_response(message, times)
        else:
            return '错误:请求异常,请检查您的网络和API地址与Key是否正确'

免费评分

参与人数 2吾爱币 +8 热心值 +2 收起 理由
echoing2021 + 1 + 1 学习了!正想用python控制wx
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
 楼主| 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
3#
52pojie210748 发表于 2024-7-23 05:58
4#
50lovelace 发表于 2024-7-23 08:02
哪位大佬详细介绍一下怎么用,一直想有个微信机器人 自动回复信息用
6#
侃遍天下无二人 发表于 2024-7-23 09:27
本地部署的AI受道德约束吗,能否关掉约束
7#
 楼主| SelfLove 发表于 2024-7-23 09:30 |楼主
50lovelace 发表于 2024-7-23 08:02
哪位大佬详细介绍一下怎么用,一直想有个微信机器人 自动回复信息用

这个是基于ai模型的,意思是你的有本地部署的ai和网络ai的api请求接口,才能实现对话
使用方法是将target的文字改成你要对话的目标
8#
 楼主| SelfLove 发表于 2024-7-23 09:37 |楼主
侃遍天下无二人 发表于 2024-7-23 09:27
本地部署的AI受道德约束吗,能否关掉约束

本地部署ai都没有思想钢印,但如果是国内训练的ai模型可能会屏蔽掉一些敏感信息,国外的模型则没有例如llama3之类的,但国外模型对中文的处理不是很好,你可以下中文微调版
9#
Xiaosesi 发表于 2024-7-23 09:56
这个需要python几运行
10#
 楼主| SelfLove 发表于 2024-7-23 10:16 |楼主
Xiaosesi 发表于 2024-7-23 09:56
这个需要python几运行

建议3.10.x,我是这个版本
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 06:36

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表