用 Python 和 uiautomation 实现微信批量发送

前段时间发现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('发送结束,请按回车键退出')









 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值