告别手动提醒!用Python+PyAutoGUI实现微信定时消息(附完整源码)

每天重复发送相同的微信消息是否让你感到疲惫?无论是工作汇报、学习打卡还是节日祝福,手动操作既耗时又容易遗忘。本文将带你用Python和PyAutoGUI打造一个跨平台的微信定时消息发送工具,解放双手的同时确保消息准时送达。

1. 为什么选择PyAutoGUI实现微信自动化

在自动化领域,PyAutoGUI以其简单易用和跨平台特性脱颖而出。与传统的win32api方案相比,它不需要复杂的Windows API调用,代码更简洁直观。更重要的是,PyAutoGUI支持macOS和Linux系统,让自动化脚本真正实现跨平台运行。

PyAutoGUI的核心优势:

  • 纯Python实现,无需额外系统依赖
  • 支持图像识别定位界面元素
  • 提供完整的鼠标键盘模拟功能
  • 内置安全防护机制(如故障安全开关)

提示:虽然PyAutoGUI操作简单,但过度频繁的自动化操作可能被微信检测为异常行为。建议合理设置操作间隔时间。

2. 环境准备与基础配置

开始前,我们需要搭建Python开发环境并安装必要的库。建议使用Python 3.6+版本以获得最佳兼容性。

2.1 安装依赖库

打开终端或命令提示符,执行以下安装命令:

pip install pyautogui schedule pyperclip pillow

各库的作用说明:

库名称 用途 必选
pyautogui 图形界面自动化核心
schedule 定时任务调度
pyperclip 剪贴板操作
pillow 图像处理支持 可选

2.2 开发环境配置

为确保脚本稳定运行,建议进行以下配置调整:

  1. 降低PyAutoGUI的操作速度(默认太快可能导致操作丢失)

    import pyautogui
    pyautogui.PAUSE = 0.5  # 每个操作后暂停0.5秒
    
  2. 启用故障安全开关

    pyautogui.FAILSAFE = True  # 鼠标移到左上角可紧急停止
    

3. 核心功能实现步骤

下面我们将分步骤构建完整的定时消息发送功能。为便于理解,每个功能模块都配有详细代码说明。

3.1 微信窗口定位与激活

精准定位微信窗口是自动化的第一步。我们提供两种可靠的定位方式:

方法一:通过窗口标题定位(推荐)

def activate_wechat():
    try:
        # 获取微信窗口
        wechat = pyautogui.getWindowsWithTitle("微信")[0]
        wechat.activate()
        time.sleep(1)  # 等待窗口激活
        return True
    except Exception as e:
        print(f"微信窗口激活失败: {e}")
        return False

方法二:通过图像识别定位(备用方案)

def locate_by_image(image_path):
    try:
        position = pyautogui.locateOnScreen(image_path, confidence=0.8)
        if position:
            pyautogui.click(position)
            return True
    except:
        return False

3.2 消息发送流程分解

完整的消息发送包含多个关键步骤,每个步骤都需要合理的时间间隔:

  1. 打开微信搜索框(Ctrl+F)
  2. 输入联系人/群聊名称
  3. 选择目标会话
  4. 输入消息内容
  5. 发送消息

对应的代码实现:

def send_message(contact, message):
    # 激活微信窗口
    if not activate_wechat():
        return False
    
    try:
        # 打开搜索框
        pyautogui.hotkey('ctrl', 'f')
        time.sleep(0.5)
        
        # 输入联系人
        pyautogui.write(contact)
        time.sleep(1)
        
        # 选择第一个结果
        pyautogui.press('enter')
        time.sleep(1)
        
        # 输入并发送消息
        pyautogui.write(message)
        pyautogui.press('enter')
        return True
    except Exception as e:
        print(f"消息发送失败: {e}")
        return False

3.3 定时任务调度实现

使用schedule库可以轻松实现各种定时规则:

import schedule
import time

def job():
    send_message("工作群", "每日报告已提交,请查收")

# 设置每天9:30执行
schedule.every().day.at("09:30").do(job)

while True:
    schedule.run_pending()
    time.sleep(60)  # 每分钟检查一次

常用定时规则示例:

规则 代码示例
每天固定时间 every().day.at("10:30")
每小时执行 every().hour.do(job)
每周特定日 every().monday.at("08:00")
间隔分钟数 every(15).minutes.do(job)

4. 高级功能与异常处理

基础功能实现后,我们需要增强脚本的健壮性和实用性。

4.1 防干扰机制设计

自动化操作可能被系统通知或用户操作打断,需要特别处理:

  1. 操作重试机制

    def safe_click(x, y, retry=3):
        for i in range(retry):
            try:
                pyautogui.click(x, y)
                return True
            except:
                time.sleep(1)
        return False
    
  2. 异常状态检测

    def check_wechat_active():
        try:
            active = pyautogui.getActiveWindowTitle() == "微信"
            return active
        except:
            return False
    

4.2 多联系人批量发送

通过配置文件实现多联系人消息群发:

import json

def batch_send(config_file):
    with open(config_file) as f:
        contacts = json.load(f)
    
    for contact in contacts:
        send_message(contact["name"], contact["message"])
        time.sleep(2)  # 间隔防止过快

示例配置文件格式:

[
    {"name": "工作群", "message": "今日工作汇报"},
    {"name": "家人群", "message": "记得吃晚饭"}
]

4.3 日志记录与通知

添加日志功能便于问题排查:

import logging

logging.basicConfig(
    filename='wechat_auto.log',
    level=logging.INFO,
    format='%(asctime)s - %(message)s'
)

def log_message(status, contact, message):
    if status:
        logging.info(f"发送成功 - {contact}: {message}")
    else:
        logging.error(f"发送失败 - {contact}: {message}")

5. 完整源码与使用指南

整合所有功能模块后的完整实现:

import pyautogui
import time
import schedule
import logging
from datetime import datetime

# 基础配置
pyautogui.PAUSE = 0.5
logging.basicConfig(
    filename='wechat_auto.log',
    level=logging.INFO,
    format='%(asctime)s - %(message)s'
)

def activate_wechat():
    """激活微信窗口"""
    try:
        wechat = pyautogui.getWindowsWithTitle("微信")[0]
        wechat.activate()
        time.sleep(1)
        return True
    except Exception as e:
        logging.error(f"窗口激活失败: {e}")
        return False

def send_message(contact, message, retry=2):
    """发送微信消息"""
    for attempt in range(retry):
        try:
            if not activate_wechat():
                continue
                
            pyautogui.hotkey('ctrl', 'f')
            time.sleep(0.5)
            
            pyautogui.write(contact)
            time.sleep(1)
            
            pyautogui.press('enter')
            time.sleep(1)
            
            pyautogui.write(message)
            pyautogui.press('enter')
            
            logging.info(f"发送成功 - {contact}")
            return True
            
        except Exception as e:
            logging.error(f"尝试{attempt+1}失败: {e}")
            time.sleep(2)
    
    return False

def daily_task():
    """每日定时任务"""
    contacts = [
        {"name": "项目组", "message": f"每日进度报告 {datetime.now().date()}"},
        {"name": "家人", "message": "记得按时吃饭"}
    ]
    
    for contact in contacts:
        send_message(contact["name"], contact["message"])

# 设置定时任务
schedule.every().day.at("09:00").do(daily_task)

if __name__ == "__main__":
    print("微信定时消息服务已启动...")
    while True:
        schedule.run_pending()
        time.sleep(60)

使用说明:

  1. 确保微信PC版已登录并保持运行
  2. 根据实际需求修改contacts列表中的联系人信息
  3. 调整schedule定时规则
  4. 运行脚本后不要移动微信窗口位置

6. 常见问题解决方案

在实际使用中可能会遇到以下典型问题:

Q1:脚本找不到微信窗口怎么办?

  • 检查微信窗口标题是否与代码中一致
  • 尝试使用图像识别替代方案
  • 确保微信窗口没有被最小化

Q2:消息发送不完整或乱序?

  • 增加pyautogui.PAUSE的值
  • 在每个关键操作后添加适当的time.sleep
  • 关闭其他可能干扰的应用程序

Q3:如何实现更复杂的定时规则?

  • 结合APScheduler替代schedule
  • 使用cron表达式定义复杂规则
  • 考虑添加节假日判断逻辑

Q4:脚本在macOS上运行异常?

  • 确保授予终端辅助功能权限
  • 调整系统偏好设置中的安全性与隐私选项
  • 可能需要调整部分快捷键组合

对于需要长时间运行的脚本,建议将其部署到云服务器或树莓派等设备上,确保网络连接稳定。我在实际使用中发现,将脚本设置为系统服务可以显著提高可靠性,特别是在电脑休眠唤醒后仍能正常工作。

更多推荐