2
头图

简介

微信自动回复其实有很多实现的办法,例如ipad协议、Hook微信是比较常见的,ipad协议价格昂贵不适合个人使用,Hook微信因为是拦截内存,具有封号的风险,虽然风险比较小,但这个问题仍然存在,而且Hook微信依赖版本,一旦版本上升级又得重新去写,除非你自己一直保持这个版本的使用。

最近在学习自动化,于是想拿微信来练练手,所以这边就做了一个自动回复的小功能,不过这个还是有一定的问题的:

1、需要windows保持开机
2、需要微信保持在前台显示

代码

wxautoreply.py

import pandas as pd
import numpy as np
import pyautogui
import win32gui
import win32con
import time
import logging
from uiautomation import WindowControl

# 设置日志记录
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

def getHwnd():
    try:
        hwnd = win32gui.FindWindow('WeChatMainWndForPC', '微信')
        win32gui.ShowWindow(hwnd, win32con.SW_SHOWNORMAL)
        win32gui.SetForegroundWindow(hwnd)
        return hwnd
    except Exception as e:
        logging.error(f"获取窗口句柄时出错: {e}")
        return None

def fuwei(hwnd):
    try:
        if hwnd:
            left, top, right, bottom = win32gui.GetWindowRect(hwnd)
            leftpoint = left + 155
            toppoint = top + 150
            pyautogui.moveTo(leftpoint, toppoint)
            pyautogui.click()
            logging.info('复位操作完成')
        else:
            logging.warning('窗口句柄无效,无法执行复位操作')
    except Exception as e:
        logging.error(f"执行复位时出错: {e}")

def main():
    hwnd = getHwnd()
    if hwnd is None:
        logging.error('无法找到微信窗口,脚本退出')
        return

    wx = WindowControl(Name="微信")
    wx.SwitchToThisWindow()
    hw = wx.ListControl(Name="会话")

    while True:
        try:
            we = hw.TextControl(searchDepth=4)
            if we.Name:
                we.Click(simulateMove=False)
                last_msg = wx.ListControl(Name='消息').GetChildren()[-1].Name
                response = '自动回复:无法匹配该关键词~'
                print(last_msg)
                if last_msg == '你好':
                    response = '你好,这条消息是通过autoreply程序进行自动回复!'
                    print(last_msg)
                elif last_msg == '123':
                    response = '你发送了123'
                    print(last_msg)
                elif last_msg == '测试':
                    response = '测试成功'
                    print(last_msg)
                
                wx.SendKeys(f'{response}' + '{ENTER}')
                fuwei(hwnd)
            time.sleep(1)  # 避免CPU占用过高
        except Exception as e:
            logging.error(f"待机中...: {e}")
            time.sleep(5)  # 发生错误时稍作停顿

if __name__ == "__main__":
    main()

实现思路

实现起来也是极其容易的,使用uiautomation这个库来识别微信电脑版的控件内容,通过持续循环来检测消息列表是否存在未读消息,如果存在未读消息,那么就自动点击进入这个消息的窗口,然后检索窗口最后一条消息,检索自动回复的关键词库是否有这个关键词,如果存在此关键词,则直接回复。

视频演示

https://share.weiyun.com/A3lxVd8B

比较粗糙,主要是分享一下实现原理,以后在自动化学习这一块熟练了我再做个有界面的比较稳定的工具出来~

作者

TANKING

Blog

https://www.likeyunba.com

WeChat

sansure2016


TANKING
4.8k 声望493 粉丝

热爱分享,热爱创作,热爱研究。