Python pywinauto 打造属于自己的微信小客服

由于要以微信作一个某学习网站的登陆途径,用小程序就又有一些额外的花费,所以想以微信聊天窗口做些文章,就在网上找了很多关于微信机器人的方法,大多数都是用的老旧并且已经失效的wxpy,没办法了,放弃吗?不可能的,作为一个秃顶男,放弃吧
有任何疑问请发送邮件至 coming_for_you@163.com

整体思路:利用自动化测试库达到预期效果。
运行环境:PyCharm Python

获取微信的PID

这里用到了psutil库,大概意思是获取所有的进程,遍历挑选出微信的进程ID

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:smart_num_1
# Blog:https://blog.youkuaiyun.com/smart_num_1
from psutil import process_iter
def get_pid():
    PID = process_iter()
    name = ''
    pid_num = 0
    for pid_temp in PID:
        pid_dic = pid_temp.as_dict(attrs = ['pid','name'])
        if pid_dic ['name'] == 'WeChat.exe':
            name = pid_dic ['name']
            pid_num = pid_dic ['pid']
            break
    if name =='WeChat.exe':
        return pid_num
    else :
        return False

连接到微信

# 创建一个实例对象,Pywinauto中backend有两种:win32和uia,默认为win32。可使用spy++和Inspect工具判断backend适合写哪种。在这里微信为'uia'
self.app = Application(backend = 'uia')

# 将 app 连接到已经登陆成功的微信,这里可以用进程ID、句柄、以及程序路径进行连接,此处采用PID
self.app.connect(process = PID )

# 定位到微信窗口
self.win = app[u'微信']

微信的一些基本功能

获取用户发来的消息

def get_text(self):
    data = ''
    try:
        data = self.win.Edit2.get_value()
        with open('./temporary_text','w',encoding = 'utf-8') as f:
            f.write(data)
    except:
        pass
    return data #line:4

获取聊天信息用户

def get_users(self):
    user_lis = []
    try:
    	# 定位到信息列表,获取这个对象
        conunacation = self.win.child_window(title = "会话",control_type = "List")
        # 定位到这个位置
        position = conunacation.rectangle()
        mouse.click(button = 'left',coords = (position.left + 100 ,position.top + 10 ))
        
        # 定位到列表的位置,取他的子控件,至于为何,列表是一个总的容器,而每个用户都存在这个容器中,固取子控件
        users = conunacation.children()
        for user in users:
            user_lis.append(user.window_text())
    except:
        pass
    return user_lis

在聊天界面找到某个用户

def find_user (self ,user = ''):
	# 找到指定名称用户的按钮
    user = self.win.child_window(title = user, control_type = 'Text')
    
    # 定位到该按钮,获取它的相对位置
    position = user .rectangle()
    
    # 模拟点击,coords 是点击的位置
    mouse.click (button = 'left',coords = (position.left ,position.top))
    sleep(0.3)

搜索某个用户

def search_ueser (self ,user_name = ''):
	# 找控件的方法如上个函数中介绍,此处不再继续介绍
    search = self.win.child_window(title = "搜索", control_type = "Edit")
    position = search.rectangle()
    mouse.click(button = 'left', coords = (position.left + 100 ,position.top + 10))
    sleep(0.1)
    mouse.click(button = 'left', coords = (position.left + 100 ,position.top + 10))
    
    # 自带的模块,输入该用户的名字
    self.win.type_keys(user_name)
    sleep(0.6)
    self.win.type_keys('{ENTER}')

向某个用户发送文本信息

def send_message (self ,texts =''):#line:64
    for text in texts .split ('\n'):#line:65
    	# 这里用到了另外的一个库,因为用pywinauto 自带的输入模块,表情,空格等是自动略过或者识别不出,达不到按原有缩进样式缩进的效果
        if text.isalnum():
            copy(text.strip())
            hotkey ('ctrl', 'v')
        else:
            self.win.type_keys(text)
        sleep(0.1)
        hotkey ('ctrl', 'enter')#line:67
    hotkey ('enter')#line:68

删除某个用户

def delete_user(self ,user =''):
    user = self.win.child_window(title = user, control_type = 'Text')
    position = user.rectangle()
    mouse.click(button = 'right', coords = (position.left - 40 ,position.top))
    # 这里右键会弹出菜单,直接点击该菜单中的删除聊天选项
    self.app.Menu ['删除聊天'].click_input('left')

微信的一些额外功能

由于此程序的使用原因,牵扯到项目的一些敏感内容,不方便将这些功能全部详细说出,只是大概写一下已经实现了哪些内容,如有人需要相关思路,可联系微信:Be_a_luck_dog

修改备注

添加指定申请好友

一键添加所有申请好友

发送图片至指定用户

接收超级用户指令,处理相关任务

接收普通用户指令,回复相关内容

一键删除所有好友

掉线通知超级用户

掉线自动重登

对接其他接口,完成相关任务

收藏信息

自动收款判断金额并通知超级用户

对接数据库,判断用户是否在使用该功能的期限内

一键通知信息至好友

指定好友消息免打扰

群踢出成员

转发信息

发送收藏中的内容至用户

发送本地文件至用户

### 使用 pywinauto 实现与微信的自动化交互 #### 工具简介 `pywinauto` 是一种强大的 Windows 桌面应用程序自动化工具,适用于各种 Windows GUI 应用程序的自动化操作[^3]。通过该库可以模拟鼠标点击、键盘输入以及窗口控件的操作,非常适合用来实现与微信这样的桌面客户端进行交互。 --- #### 准备工作 在开始之前,需要安装 `pywinauto` 和其他可能需要用到的相关依赖项。可以通过以下命令完成环境搭建: ```bash pip install pywinauto ``` 如果涉及 OCR 文字识别功能,则还需要额外安装 `pytesseract` 和 Tesseract-OCR 引擎: ```bash pip install pytesseract pillow sudo apt-get install tesseract-ocr # Linux 用户 brew install tesseract # macOS 用户 choco install tesseract # Windows 用户 (需先安装 Chocolatey) ``` 确保 Tesseract 的路径已正确配置到系统的 PATH 环境变量中。 --- #### 基础代码示例:启动并连接微信客户端 以下是使用 `pywinauto` 启动微信并尝试与其界面交互的基础代码框架: ```python from pywinauto import Application, Desktop # 初始化应用实例 app = Application(backend="uia").start(r"C:\Program Files (x86)\Tencent\WeChat\WeChat.exe") # 替换为实际路径 # 连接到已经运行的应用程序(可选) if not app.window(title_re=".*微信.*").exists(): app.connect(path=r"C:\Program Files (x86)\Tencent\WeChat\WeChat.exe") # 获取主窗口对象 main_window = app.window(title_re=".*微信.*") main_window.wait('ready', timeout=20) # 打印当前窗口内的所有控件树结构(调试用途) print(main_window.print_control_identifiers()) # 示例:定位搜索框并输入内容 search_box = main_window.child_window(auto_id="SearchInput", control_type="Edit") search_box.type_keys("目标联系人名称{ENTER}", with_spaces=True) # 示例:发送消息给指定联系人 message_input = main_window.child_window(auto_id="InputBar.EditBox", control_type="Edit") message_input.type_keys("你好,这是一条来自脚本的消息!{ENTER}") ``` 以上代码展示了如何启动微信客户端,并向特定联系人发送一条消息。需要注意的是,具体的 `auto_id` 或者控件属性可能会因不同版本的微信而有所变化,因此建议在每次开发前打印出最新的控件树以便确认。 --- #### 处理复杂场景:结合 OCR 技术 对于某些情况下无法直接通过 `pywinauto` 控制的部分(例如弹窗验证码或其他动态生成的内容),可以引入 OCR 技术来辅助解析屏幕上的信息。下面是一个简单的例子展示如何结合 `pytesseract` 来读取屏幕上显示的文字: ```python import cv2 import numpy as np from PIL import ImageGrab import pytesseract # 截图区域定义 bbox = (100, 100, 500, 500) # 设置截图范围 (左, 上, 右, 下) # 屏幕截图 img = ImageGrab.grab(bbox=bbox) cv_image = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR) # 转换图像至灰度模式以提高识别率 gray_img = cv2.cvtColor(cv_image, cv2.COLOR_BGR2GRAY) # 使用 pytesseract 提取文字 text = pytesseract.image_to_string(gray_img, lang='chi_sim') # 'chi_sim' 表示中文简体 print(f"提取到的文字: {text.strip()}") ``` 此部分可用于捕获验证码或者从界面上抓取重要提示信息后再继续后续流程。 --- #### 注意事项 1. **权限问题** 如果遇到权限不足的情况,请以管理员身份运行 Python 脚本。 2. **兼容性问题** 不同操作系统或微信版本可能导致控件 ID 发生改变,务必定期验证控件树是否一致[^3]。 3. **性能优化** 对于频繁调用的任务,考虑缓存常用控件位置减少查找时间;同时注意合理设置等待超时参数以免阻塞进程过久。 4. **法律合规** 自动化操作应遵循相关法律法规和服务条款规定,不得滥用技术手段干扰他人正常使用服务。 ---
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值