Python实现微信自动回复收到

背景

        当下大部分人工作,都会有微信或者QQ上面接收通知,要求大家回复收到的经历,于是我写了一个自动化程序来完成这个功能。这个程序还不是那么的完美,可能会出现一定的问题,还希望大家能够帮我一起完善。

项目准备

        工具的准备可以借鉴我之前的文章

        然后这次我们需要的软件包:pandas、pyautogui、pyperclip、uiautomation

大家还是自行pip installl即可

项目实现

1、将软件包引入

        老规矩,先引入软件包

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import pyperclip
import pyautogui
from uiautomation import WindowControl

        这里还有个问题上次忘记说了,就是引入的方式不同

        import导入就是只能用导入的这一级,比如这里导入的pyperclip,后面写的就只能是pyperlip.巴拉巴拉。

        from imprt,相对来说更灵活一点,比如这里导入的uiautomation,我们既可以导入uiautomation本身,写成uiautomation.巴拉巴拉,也可以直接导入它里面的变量和函数,写成WindowControl.巴拉巴拉

        import as,比如import A as B,就是直接拿B替换A,写成B.巴拉巴拉

2、打开微信窗口


# 绑定微信主窗口
wx = WindowControl(Name='微信')

# 切换窗口
wx.SwitchToThisWindow()

# 寻找会话控件绑定
hw = wx.ListControl(Name='会话')

这里用的是和之前文章不同的方法。

之前的是通过托盘,打开微信窗口。大家也可以自行把这个代码改成之前的那种

这里我是直接通过SwitchToThisWindow切换窗口。简单来讲就是,我们已经点开了微信窗口,但是被其他窗口覆盖,这个就可以直接把微信窗口放到最前面

一定要像这样把微信窗口点开一次。

 3、设置死循环不停运行程序

# 死循环接受消息
while True:
    # 从查找未读消息
    we = hw.TextControl(searchDepth=4)

    # 死循环维持,没有超时报错
    while not we.Exists(0):
        pass

这里不多说,就是死循环让程序不报错,还有一个就是查找未读消息(查找深度就是4,可自行修改)

4、 读取未读消息及联系人

 # 存在未读消息
    if we.Name:
        # 点击未读消息
        we.Click(simulateMove=False)

        # 读取最后一条消息
        last_msg = wx.ListControl(Name='消息').GetChildren()[-1].Name
        # 选择联系人(小瓜改为相应的联系人)
        select_user = wx.ListControl(Name='消息').GetChildren()[-1].ButtonControl().Name

        if select_user == '自行修改':
            flag = 1
        else:
            flag = 0

如果存在未读消息,则点击窗口。

读取的方法

我们还是用inspect查找,读取窗口类型以及属性。这里一定要多理解一下,一个地方通了,就会发现,其实这个挺简单的,就是找窗口太麻烦了。

判断

第一个判断是判断是否有未读消息

第二个判断就是如果这个人是领导,则flag标记为1

5、回复收到


        # 能够匹配到数据时
        if last_msg == '收到' and flag == 1:
            flag = 0
            # 发送收到
            pyperclip.copy(last_msg)  # 使用pyperclip将消息复制到剪贴板
            pyautogui.hotkey('ctrl', 'v')  # 使用快捷键粘贴消息
            wx.SendKeys('{Enter}', waitTime=0)
            # 点击上面的窗口,以备下一次循环
            pyautogui.press('up')
        # 没有匹配到数据时
        else:
            # 点击上面的窗口,以备下一次循环
            pyautogui.press('up')

判断,如果最后一条消息是“收到”并且领导说过话。

我们则把flag标记改回0,并且将“收到”复制到剪切板使用快捷健发出

如果不满足则把聊天窗口选到上面的联系人。

完整代码

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import pyperclip
import pyautogui
from uiautomation import WindowControl

# 绑定微信主窗口
wx = WindowControl(Name='微信')

# 切换窗口
wx.SwitchToThisWindow()

# 寻找会话控件绑定
hw = wx.ListControl(Name='会话')


# 死循环接受消息
while True:
    # 从查找未读消息
    we = hw.TextControl(searchDepth=4)

    # 死循环维持,没有超时报错
    while not we.Exists(0):
        pass

    # 存在未读消息
    if we.Name:
        # 点击未读消息
        we.Click(simulateMove=False)

        # 读取最后一条消息
        last_msg = wx.ListControl(Name='消息').GetChildren()[-1].Name
        # 选择联系人(小瓜改为相应的联系人)
        select_user = wx.ListControl(Name='消息').GetChildren()[-1].ButtonControl().Name

        if select_user == '小瓜':
            flag = 1
        else:
            flag = 0

        # 能够匹配到数据时
        if last_msg == '收到' and flag == 1:
            flag = 0
            # 发送收到
            pyperclip.copy(last_msg)  # 使用pyperclip将消息复制到剪贴板
            pyautogui.hotkey('ctrl', 'v')  # 使用快捷键粘贴消息
            wx.SendKeys('{Enter}', waitTime=0)
            # 点击上面的窗口,以备下一次循环
            pyautogui.press('up')
        # 没有匹配到数据时
        else:
            # 点击上面的窗口,以备下一次循环
            pyautogui.press('up')

不足之处

  1. 需要将微信聊天窗口点开(可以通过修改为之前文章的方法解决这个问题)
  2. 存在BUG

比如:

张三是领导,李四、王五是员工

张三:明天开会

李四:收到

我:收到                                  此时程序也将回复收到

张三:辛苦了

王五:收到

我:收到                                此时程序又会回复一次收到

        这个问题其实我也想了很久,也想了很多解决办法,主要的目的就是为了区分收到以及领导发出的消息。我想过几个解决办法:

1、再添加一个时间板块,根据时间来区分每次回复的收到,避免重复回复

缺点:如果有人回复晚了,也会出现问题

2、添加一个特殊人,领导发完通知后,他回复了收到,我们再回复收到

缺点:如果他忘记了回复,那我们也不会回复。如果他正好跟领导在群内单独沟通,他再回复一个收到,那我们又会回复一个收到。

3、添加多个特殊人

缺点:我们不会回复的概率减小,但是多回复的概率增加

4、通过消息类型判断

缺点:应用范围小,只适用于领导每次都会发送一个文件,然后员工再回复收到的情况

5、利用BUG

原理:第一次领导发消息,有人回复收到时,我们就回复收到。假设有N个人要回复收到。那我们就每存在N-1个收到(不包含第一个收到,不包含自己),我们就回复收到。

运气好的话,每个人都按正常回复收到,我们程序就能正常运行

运气不好的话,如果有极少数人没有回复,那我们也能在一定范围内正常运行,能正常运行的次数有限

6、另一种利用BUG

原理:每N/2+1个人回复收到,我们就回复收到。同样也能在一定范围内正常运行。

        最后两种办法大家可以自己推推看,什么情况能正常运行,什么情况不能正常运行,我觉得是很有意思的一个数学题。

        总而言之,因为情况太多,不太好制定通用的方法。大家根据自己的需要修改代码即可。如果有大佬,希望也能帮我一起完善这个程序。

总结

        希望大家能够共同学习,共同交流,欢迎指出问题。

  • 28
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值