前段时间发现LP经常要通过微信给同事发送通知类消息,并且为了友好,每条信息还要加上称呼,什么张哥,李姐啥的,每次一条条发实在费劲,我就网上搜了下,看有没有现成的工具可以直接用,发现都不尽如人意,干脆自己整一个。
思路是这样,将要发送的人员名单(包括称呼)以及发送内容都维护到Excel里,程序运行时读取Excel里内容,自动搜索人员姓名(微信昵称或备注名),填入要发送的内容,拼接上称呼(如果需要的话)自动点击发送,这样轮巡直至名单人员全部发送完成。
使用到的库有:uiautomation,xlrd
uiautomation是一个可以用来做窗口程序自动化的库,通过它可以模拟鼠标点击和键盘输入来控制窗口程序。
xlrd用来读取Excel数据
首先需要安装 需要的库:
pip install uiautomation
pip install xlrd
Excel配置如下:
Excel文件名:微信批量发送消息配置表.xlsx
sheet页名称:联系人,发送内容
联系人sheet页格式:
昵称或备注名一定要写全,并且确保和你微信里的是一致的,否则容易误发,切记。
发送内容sheet页格式:
发送内容填在A1列,根据实际情况修改。支持微信自带表情,格式为英文半角中括号[]加表情名称,如[玫瑰] [抱拳]
如果选择带称呼发送,实际发送内容为:张哥,这是一条....
!!!!!!!!注意:昵称或备注一定要和你微信里的一致,如果微信改了Excel里也要同步修改哦!到时候发错人了别怪我没提醒你哦。!!!!!!!!
!!!!!!!!开始前请把你的PC端的微信打开,不要最小化,至少在任务栏上能看到微信图标,这样程序才能唤起微信发送信息的哦。!!!!!!!!
完整代码如下:
#!python3
# -*- coding:utf-8 -*-
import uiautomation as auto
import xlrd
logFile='wx_sndmsg.log'
# 定义发送消息的方法,入参为wx:微信;name:要给谁发送;msg:发送内容;wt:每次操作暂停时间
def snd_msg(wx,friend_name,message,waite_time: int=0.2):
#获取微信聊天窗口
wx.SwitchToThisWindow()
wx.ButtonControl(Name="聊天").Click() # 切换到聊天窗口
#搜索好友名称
wx.SendKeys(text='{Ctrl}f', waitTime=waite_time)
wx.SendKeys(text='{Ctrl}a', waitTime=waite_time)
wx.SendKey(key=auto.SpecialKeyNames['DELETE'],waitTime=waite_time)
auto.SetClipboardText(friend_name)
wx.SendKeys('{Ctrl}v',waitTime=waite_time)
wx.SendKey(key=auto.SpecialKeyNames['ENTER'], waitTime=waite_time)
#wx.SendKeys(message, waitTime=waite_time)
auto.SetClipboardText(message)
wx.SendKeys('{Ctrl}v',waitTime=waite_time*2)
wx.SendKey(key=auto.SpecialKeyNames['ENTER'], waitTime=waite_time*4)
def data_check(wb,with_call):
checkCmd=True
#校验发送人名单
try:
sheet1 = wb.sheet_by_name("联系人")
except Exception as e:
auto.Logger.Log('没有"联系人"这个sheet页啊,你看都报错了:\n{}'.format(e), logFile=logFile)
checkCmd = False
try:
sheet2 = wb.sheet_by_name("发送内容")
except Exception as e:
auto.Logger.Log('没有"发送内容"这个sheet页啊,你看都报错了:\n{}'.format(e), logFile=logFile)
checkCmd = False
if checkCmd == False:
return checkCmd
if sheet1.nrows<2:
auto.Logger.Log('联系人sheet页没数据啊亲',logFile=logFile)
checkCmd=False
# 每行数据检查
i = 1
while i < sheet1.nrows:
# 第1列 微信备注名称或昵称检查
friendName = sheet1.row(i)[0].value
if len(friendName.strip())==0:
auto.Logger.Log('联系人sheet页第{}行微信昵称或备注名为空啊亲'.format(i+1), logFile=logFile)
checkCmd=False
callName=sheet1.row(i)[1].value
if len(callName.strip())==0 and with_call:
auto.Logger.Log('联系人sheet页第{}行称呼为空啊亲'.format(i+1),logFile=logFile)
i += 1
#校验发送内容
if len(sheet2.cell_value(0,0))==0:
auto.Logger.Log('发送内容sheet页A1单元格没有内容啊',logFile=logFile)
checkCmd = False
return checkCmd
#主函数,执行取姓名和发送操作
def main_work(wb,with_call):
#获取联系人信息
sheet1=wb.sheet_by_name('联系人')
sheet2=wb.sheet_by_name('发送内容')
message=sheet2.cell_value(0,0)
#获取微信聊天窗口
try:
wx = auto.WindowControl(Name="微信", ClassName='WeChatMainWndForPC')
wx.SwitchToThisWindow()
wx.ButtonControl(Name="聊天").Click() # 切换到聊天窗口
except Exception as e:
auto.Logger.Log('亲,微信没打开啊,请把微信打开好吗,至少在任务栏上能看到微信图标好吧,你看都报错了:\n{}'.format(e),logFile=logFile)
return
auto.Logger.Log('开始发送消息啦',logFile=logFile)
i = 1
while i < sheet1.nrows:
contact=sheet1.row(i)[0].value
call=sheet1.row(i)[1].value
if with_call:
snd_msg(wx,contact,call+','+message)
auto.Logger.Log('发送人:{},发送内容:{}'.format(contact, call + ',' + message), logFile=logFile)
else:
snd_msg(wx, contact, message)
auto.Logger.Log('发送人:{},发送内容:{}'.format(contact, message), logFile=logFile)
i+=1
auto.Logger.Log('发送完成,此次总共发送{}条信息'.format(i-1), logFile=logFile)
if __name__=='__main__':
key = input('选择发送方式: 1.每条信息都带称呼 2.不带称呼 \n')
#通过Excel文件获取发送人名单
file = '微信批量发送消息配置表.xlsx'
try:
wb = xlrd.open_workbook(filename=file)
except Exception as e:
auto.Logger.Log('找不到"{}"这个文件啊亲'.format(file), logFile=logFile)
input('请按回车键退出')
if key=='1':
with_call=True
elif key=='2':
with_call=False
checkCmd = data_check(wb,with_call)
if checkCmd:
main_work(wb,with_call)
input('发送结束,请按回车键退出')