赞
踩
当下大部分人工作,都会有微信或者QQ上面接收通知,要求大家回复收到的经历,于是我写了一个自动化程序来完成这个功能。这个程序还不是那么的完美,可能会出现一定的问题,还希望大家能够帮我一起完善。
工具的准备可以借鉴我之前的文章
然后这次我们需要的软件包:pandas、pyautogui、pyperclip、uiautomation
大家还是自行pip installl即可
老规矩,先引入软件包
- #!/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.巴拉巴拉
-
- # 绑定微信主窗口
- wx = WindowControl(Name='微信')
-
- # 切换窗口
- wx.SwitchToThisWindow()
-
- # 寻找会话控件绑定
- hw = wx.ListControl(Name='会话')
这里用的是和之前文章不同的方法。
之前的是通过托盘,打开微信窗口。大家也可以自行把这个代码改成之前的那种
这里我是直接通过SwitchToThisWindow切换窗口。简单来讲就是,我们已经点开了微信窗口,但是被其他窗口覆盖,这个就可以直接把微信窗口放到最前面
一定要像这样把微信窗口点开一次。
- # 死循环接受消息
- while True:
- # 从查找未读消息
- we = hw.TextControl(searchDepth=4)
-
- # 死循环维持,没有超时报错
- while not we.Exists(0):
- pass
这里不多说,就是死循环让程序不报错,还有一个就是查找未读消息(查找深度就是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
-
- # 能够匹配到数据时
- 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、添加一个特殊人,领导发完通知后,他回复了收到,我们再回复收到
缺点:如果他忘记了回复,那我们也不会回复。如果他正好跟领导在群内单独沟通,他再回复一个收到,那我们又会回复一个收到。
3、添加多个特殊人
缺点:我们不会回复的概率减小,但是多回复的概率增加
4、通过消息类型判断
缺点:应用范围小,只适用于领导每次都会发送一个文件,然后员工再回复收到的情况
5、利用BUG
原理:第一次领导发消息,有人回复收到时,我们就回复收到。假设有N个人要回复收到。那我们就每存在N-1个收到(不包含第一个收到,不包含自己),我们就回复收到。
运气好的话,每个人都按正常回复收到,我们程序就能正常运行
运气不好的话,如果有极少数人没有回复,那我们也能在一定范围内正常运行,能正常运行的次数有限
6、另一种利用BUG
原理:每N/2+1个人回复收到,我们就回复收到。同样也能在一定范围内正常运行。
最后两种办法大家可以自己推推看,什么情况能正常运行,什么情况不能正常运行,我觉得是很有意思的一个数学题。
总而言之,因为情况太多,不太好制定通用的方法。大家根据自己的需要修改代码即可。如果有大佬,希望也能帮我一起完善这个程序。
希望大家能够共同学习,共同交流,欢迎指出问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。