• 用python实现给女朋友自动发微信


    女朋友说上班都不回她微信,于是给她安排一个定时自动发微信的功能。
    【效果预览】



    一、启动微信进程

    正常情况下微信是最小化的,我们需要先打开在桌面显示聊天窗口。
    subprocess 模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。
    启动之后需要sleep一会儿,等窗口完全显示之后再去获取聊天窗口坐标,否则窗口还没完全显示获取到的坐标为None。

    subprocess.Popen([r"F:\WeChat\WeChat.exe"]) #微信安装路径
    time.sleep(0.1) #等窗口显示完毕
    
    • 1
    • 2

    二、获取微信窗口在桌面的坐标

    EnumWindows对屏幕上所有的顶层窗口依次进行枚举,将每个顶层窗口的窗口句柄依次传递给回调函数。
    在回调函数callback判断是窗口、可用窗口、可见窗口,则存到字典hwnd_title中。
    最后遍历所有的窗口hwnd_title,如果是微信聊天窗口则返回窗口坐标(x,y,x2,y2)

    #回调函数,将所有句柄存入字典hwnd_title
    def callback(self,hwnd,mouse):
       if win32gui.IsWindow(hwnd) and win32gui.IsWindowEnabled(hwnd) and win32gui.IsWindowVisible(hwnd):
           self.hwnd_title.update({hwnd: win32gui.GetWindowText(hwnd)})
    
    #获取窗口位置
    def location(self):
        win32gui.EnumWindows(self.callback, None)
        for hwnd, title in self.hwnd_title.items():
            if title is not "" and '微信' in title:
                return win32gui.GetWindowRect(hwnd)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    三、发送消息

    获取到窗口坐标后,可以计算出点击【微信通讯录、第一个标星好友、发消息、发送】四个点的坐标。四点的坐标跟屏幕分辨率大小是有关系的,通常分辨率都是1920X1080

    1.鼠标依次点击打开聊天框

    def send(self,location):
        list = [(location[0]+30,  location[1]+150),#点击微信通讯录
                (location[0]+280, location[1]+285),#点击标星好友
                (location[0]+575, location[1]+405)]#点击发送消息
    
        #鼠标点击系列操作
        for v in list:
            self.mouse.position = v
            self.mouse.click(pynput.mouse.Button.left, 1)
    
        time.sleep(0.1)#等窗口完全打开
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.输入发送内容

    定义列表存放要发送的信息,使用random.randrange()随机获取一条信息

    self.mouse = pynput.mouse.Controller()#鼠标控制器
    self.keyboard = pynput.keyboard.Controller()#键盘控制器
    
    content=[
        '吃饭了吗',
        '吃的什么',
        '好不好吃',
        '喝奶茶吗',
        '下班了吗',]
    self.keyboard.type(content[random.randrange(0,len(content))])#输入内容
    self.mouse.position = (location[0]+820, location[1]+605)#发送按钮坐标
    self.mouse.click(pynput.mouse.Button.left, 1)#点击发送(S)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    四、设置定时任务

    APScheduler基于Quartz的一个Python定时任务框架,实现了Quartz的所有功能,使用起来十分方便。提供了基于日期、固定时间间隔以及crontab类型的任务,并且可以持久化任务。基于这些功能,我们可以很方便的实现一个python定时任务系统。

    if __name__ == '__main__':
        def job():
            subprocess.Popen([r"F:\WeChat\WeChat.exe"])
            time.sleep(0.1)  # 等窗口显示完毕
            main = WeChat()
            location = main.location()
            main.send(location)
    
        scheduler = BlockingScheduler()
        scheduler.add_job(job,'interval', minutes=60)#‘seconds’, ‘minutes’, ‘hours’
        scheduler.start()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    gitee 完整代码链接

    在这里插入图片描述

  • 相关阅读:
    .NET混合开发解决方案14 WebView2的基本身份验证
    面试题-5
    阿里Java面试参考指南
    【熬了一宿,为大家整理出来Flink on Yarn的三种部署方式,详细介绍,不仅仅皮毛哦】
    此文带你详细了解MySQL数据库的事务知识
    Python 基于 TCP 传输协议的网络通信实现
    wpf中EventHandler的使用
    matlab如何从信号中去除60 Hz Hum电源线噪声
    redis之Bitmap
    文本处理之xml
  • 原文地址:https://blog.csdn.net/weixin_46105038/article/details/119819627