当前位置:   article > 正文

Python实现微信自动回复收到_python autogui 自动回复消息

python autogui 自动回复消息

背景

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

项目准备

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

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

大家还是自行pip installl即可

项目实现

1、将软件包引入

        老规矩,先引入软件包

  1. #!/usr/bin/python3
  2. # -*- coding: utf-8 -*-
  3. import pyperclip
  4. import pyautogui
  5. from uiautomation import WindowControl

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

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

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

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

2、打开微信窗口

  1. # 绑定微信主窗口
  2. wx = WindowControl(Name='微信')
  3. # 切换窗口
  4. wx.SwitchToThisWindow()
  5. # 寻找会话控件绑定
  6. hw = wx.ListControl(Name='会话')

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

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

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

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

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

  1. # 死循环接受消息
  2. while True:
  3. # 从查找未读消息
  4. we = hw.TextControl(searchDepth=4)
  5. # 死循环维持,没有超时报错
  6. while not we.Exists(0):
  7. pass

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

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

  1. # 存在未读消息
  2. if we.Name:
  3. # 点击未读消息
  4. we.Click(simulateMove=False)
  5. # 读取最后一条消息
  6. last_msg = wx.ListControl(Name='消息').GetChildren()[-1].Name
  7. # 选择联系人(小瓜改为相应的联系人)
  8. select_user = wx.ListControl(Name='消息').GetChildren()[-1].ButtonControl().Name
  9. if select_user == '自行修改':
  10. flag = 1
  11. else:
  12. flag = 0

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

读取的方法

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

判断

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

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

5、回复收到

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

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

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

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

完整代码

  1. #!/usr/bin/python3
  2. # -*- coding: utf-8 -*-
  3. import pyperclip
  4. import pyautogui
  5. from uiautomation import WindowControl
  6. # 绑定微信主窗口
  7. wx = WindowControl(Name='微信')
  8. # 切换窗口
  9. wx.SwitchToThisWindow()
  10. # 寻找会话控件绑定
  11. hw = wx.ListControl(Name='会话')
  12. # 死循环接受消息
  13. while True:
  14. # 从查找未读消息
  15. we = hw.TextControl(searchDepth=4)
  16. # 死循环维持,没有超时报错
  17. while not we.Exists(0):
  18. pass
  19. # 存在未读消息
  20. if we.Name:
  21. # 点击未读消息
  22. we.Click(simulateMove=False)
  23. # 读取最后一条消息
  24. last_msg = wx.ListControl(Name='消息').GetChildren()[-1].Name
  25. # 选择联系人(小瓜改为相应的联系人)
  26. select_user = wx.ListControl(Name='消息').GetChildren()[-1].ButtonControl().Name
  27. if select_user == '小瓜':
  28. flag = 1
  29. else:
  30. flag = 0
  31. # 能够匹配到数据时
  32. if last_msg == '收到' and flag == 1:
  33. flag = 0
  34. # 发送收到
  35. pyperclip.copy(last_msg) # 使用pyperclip将消息复制到剪贴板
  36. pyautogui.hotkey('ctrl', 'v') # 使用快捷键粘贴消息
  37. wx.SendKeys('{Enter}', waitTime=0)
  38. # 点击上面的窗口,以备下一次循环
  39. pyautogui.press('up')
  40. # 没有匹配到数据时
  41. else:
  42. # 点击上面的窗口,以备下一次循环
  43. pyautogui.press('up')

不足之处

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

比如:

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

张三:明天开会

李四:收到

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

张三:辛苦了

王五:收到

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

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

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

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

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

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

3、添加多个特殊人

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

4、通过消息类型判断

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

5、利用BUG

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

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

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

6、另一种利用BUG

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

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

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

总结

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/515443
推荐阅读
相关标签
  

闽ICP备14008679号