基于python的微信特定消息回复,例如拜年信息
遇到问题
- 新年伊始,相信会收到很多的拜年信息,而我们又不想一一回复,这时就该python登场了,它可以挂在电脑上,而你就可以自由的去做自己想做的事。
环境
- 一台电脑、vscode、python
解决方案
解决步骤
- 找到微信并绑定会话控件
- 读取回复信息文件
- 找到未回复消息
- 分别回复特定消息与未设置消息
具体实施
###导入所需python库
- pandas与numpy是python所常用的库,而uiautomation是适用于 Windows 的辅助功能框架。 它提供对桌面上大多数 UI 元素的编程访问。 它使辅助技术产品(如屏幕阅读器)能够向最终用户提供有关 UI 的信息,并通过标准输入以外的方式操作 UI。 UI 自动化还使自动测试脚本能够与 UI 交互。
import pandas as pd
import numpy as np
from uiautomation import WindowControl
找到微信并绑定微信会话控件
#找到微信
wx = WindowControl(Name = "微信")
print(wx)
#调出微信窗口
wx.SwitchToThisWindow()
#找到并绑定控件
hw = wx.ListControl(Name = "会话")
print("找到会话控件" , hw)
编写并读取回复消息文件
- 编写csv文件,CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。通常都是纯文本文件。建议使用WORDPAD或是记事本来开启,再则先另存新档后用EXCEL开启,也是方法之一。以下是csv文件内容:
序号,关键词,回复内容
1,新年快乐,福启新岁,龍年顺遂,岁岁平安~
2,哈哈哈,别笑了
3,告辞,再见
4,世界上最好的语言,python
5,最难懂的语言,Java
6,生日快乐,多谢您的生日祝福
- 在python文件中读取csv文件
#读取csv文件
df = pd.read_csv("回复数据.csv")
找出未回复消息
- 找出前四个未回复的对话栏
#找会话框的前四个
we = hw.TextControl(searchDepth=4)
while not we.Exists(0) :
pass
print("未回复消息",we)
读取最新消息,并制作回复列表
- 使用click方法选到对话栏,并使用Listcontrol来读取最新消息。apply用来通配消息,并根据csv文件来制作回复列表
#点击未读信息
we.Click(simulateMove=False)
#读取最后一条
last_msg = wx.ListControl(Name = "消息").GetChildren()[-1].Name
print("最后一条消息",last_msg)
#判断关键字
msg = df.apply(lambda x:x["回复内容"] if x["关键词"] in last_msg else None,axis=1)
msg.dropna(axis=0, how="any",inplace=True)
#形成列表
ar = np.array(msg).tolist()
print("ar",ar)
回复消息
- 找到对话框,首先输入所回复的信息,并按下回车,最后清除列表
wx.SendKeys(ar[0], waitTime=0)
wx.SendKeys('{Enter}', waitTime=0)
wx.TextControl(SubName = ar[0][:5]).RightClick()
例子
完整代码
import pandas as pd
import numpy as np
from uiautomation import WindowControl
#可以一直挂到后台,实施回复信息,但不能跳转到其他页面
#找到微信
wx = WindowControl(Name = "微信")
print(wx)
#调出微信窗口
wx.SwitchToThisWindow()
#找到并绑定控件
hw = wx.ListControl(Name = "会话")
print("找到会话控件" , hw)
#读取csv文件
df = pd.read_csv("回复数据.csv")
while True :
#找会话框的前四个
we = hw.TextControl(searchDepth=4)
while not we.Exists(0) :
pass
print("未回复消息",we)
#存在未读信息
if we.Name :
#点击未读信息
we.Click(simulateMove=False)
#读取最后一条
last_msg = wx.ListControl(Name = "消息").GetChildren()[-1].Name
print("最后一条消息",last_msg)
#判断关键字
msg = df.apply(lambda x:x["回复内容"] if x["关键词"] in last_msg else None,axis=1)
msg.dropna(axis=0, how="any",inplace=True)
#形成列表
ar = np.array(msg).tolist()
print("ar",ar)
#找到匹配的数据
if ar :
print("进入到 if" ,ar[0])
wx.SendKeys(ar[0], waitTime=0)
wx.SendKeys('{Enter}', waitTime=0)
wx.TextControl(SubName = ar[0][:5]).RightClick()
else :
print("进入到 else")
wx.SendKeys("我没有理解",waitTime=0)
wx.SendKeys("{Enter}",waitTime=0)
wx.TextControl(SubName = "我没有理解").RightClick()