震惊!用Python每天早上8点,我准时给女神发早安,只因这个脚本…

大家好,我是大力。

你是不是也曾经历过这些场景?

  • 每天早上要给对象/家人发一句早安,偶尔忘了还会引发"矛盾"?
  • 重要的工作提醒、项目节点,总是怕自己忙忘了?
  • 想给自己设定每日一句英语、天气提醒,却懒得每天复制粘贴?

今天,我就分享一个纯Python脚本 ,帮你彻底解决这个痛点!即使是完全不懂代码的小白,跟着我一步步操作,也能在30分钟内搞定一个专属的"微信定时提醒机器人"。

最终效果: 每天固定时间(比如早上9点),脚本自动打开微信,找到指定联系人,发送你提前设置好的当日消息。消息内容支持按日期定制,每天都不一样!

一、准备工作(仅需4步)

1. 安装Python环境

如果你电脑上还没有Python,请先安装(已安装可跳过)。

  • 访问Python官网下载最新版(建议3.10+)。
  • ❗关键一步: 安装时,务必勾选 "Add Python to PATH" ,然后一路"下一步"完成。

2. 下载脚本文件

  • 复制文章最下方的完整代码,粘贴到你的文本编辑器(记事本、PyCharm、VS Code均可)。
  • 保存为 auto_send_msg.py(文件名随意,后缀必须是 .py)。
  • 建议新建一个文件夹,比如 D:\wechat_auto,把脚本放进去,方便管理。

3. 创建每日消息配置

  • 在同一文件夹下,新建一个文本文件,重命名为 daily_messages.json
  • 用记事本打开,输入以下格式的内容:
json 复制代码
{
  "2026-03-10": "今天要完成项目报告!",
  "2026-03-11": "有内鬼,停止交易。",
  "2026-03-12": "英语每日一句:I have failed over and over again in my life. And that is why I succeed. 译文:我一生中失败了一次又一次,但正因如此,我才得以成功。",
  "2026-03-13": "今天是想你的106天。",
  "2026-03-14": "今天有时间吗?晚上一起吃饭吧。",
  "2026-03-15": "离世界杯开始还有90天。",
  "2026-03-16": "今日广州天气晴,25度,微风,穿个衬衫正好。",
  "2026-03-17": "今天离高考还剩XXX天,加油!"
}

⚠️ 注意:

  • 日期格式必须是 YYYY-MM-DD
  • JSON最后一项后面不要有逗号
  • 如果某天没配置,脚本会自动发送默认消息。

4. 安装Python依赖库

脚本需要几个第三方库,打开命令提示符(CMD),依次执行以下命令: bash

复制代码
pip install pyautogui pygetwindow psutil schedule pyperclip

💡 小技巧: 如果下载慢,可以加上清华镜像源:
pip install pyautogui -i https://pypi.tuna.tsinghua.edu.cn/simple

二、修改脚本配置(核心)

用记事本打开你的 auto_send_msg.py,找到开头的 配置区域,按你的实际情况修改:

python

ini 复制代码
# ========== 这里改成你的信息 ==========
CONTACT_NAME = "文件传输助手"  # 你要发送的联系人昵称
MESSAGE = "早上好,这是自动发送的消息。"  # 默认消息(当天无配置时发送)
SEND_TIME = "09:00"  # 每天发送时间(24小时制)
MESSAGE_JSON_PATH = "D:\wechat_auto\daily_messages.json"  # 你的json文件完整路径
# ===================================

注意: 路径中的反斜杠 `` 要写成双份 \,或者用正斜杠 /


三、测试运行

  1. 登录微信 ,保持窗口打开(可以最小化到任务栏,但不能关闭或缩放到托盘图标)。

  2. 打开命令提示符,切换到你的脚本目录:

    bash

    bash 复制代码
    cd /d D:\wechat_auto
  3. 执行以下命令进行测试:

    bash

    复制代码
    python auto_send_msg.py now

    如果一切正常,你会看到微信自动弹出,搜索联系人并发送消息。

  4. 测试成功后,直接运行(不加 now)即可让脚本后台运行,到点自动发送:

    bash

    复制代码
    python auto_send_msg.py

四、注意事项(必看!)

常见问题 解决方案
微信不能完全隐藏 脚本需要模拟鼠标操作,微信窗口必须可见(最小化到任务栏OK,但托盘退出不行)。
运行期间别动鼠标键盘 脚本执行那几秒钟,请勿操作电脑,否则会干扰鼠标点击导致失败。
联系人名称要准确 支持模糊匹配,但建议用完整昵称或备注名,避免找错人。
JSON格式务必正确 最后一项不要有逗号,所有符号用英文半角。

五、完整代码(直接复制)

python 复制代码
import time
import pygetwindow as gw
import pyautogui
import psutil
import schedule
import sys
import pyperclip
import json
from datetime import datetime
import os

# ========== 配置区域(请根据实际情况修改)==========
# 注意:不能将微信界面最小化,否则消息无法发送
CONTACT_NAME = "张三"  # 要发送的联系人昵称
MESSAGE = "早上好,这是自动发送的消息。"  # 默认消息(当JSON中无当日配置时使用)
SEND_TIME = "11:11"  # 每天发送时间(24小时制,如 "09:00")
MESSAGE_JSON_PATH = "F:\python_work\daily_message.json"  # 存放每日消息的JSON文件路径
INPUT_BOX_Y_OFFSET = 80  # 输入框距离窗口底部的像素偏移量(可根据屏幕调整)


# ===============================================

def is_process_running(process_name):
    """检查指定进程是否在运行"""
for proc in psutil.process_iter(['name']):
        try:
            if proc.info['name'] == process_name:
                return True
        except (psutil.NoSuchProcess, psutil.AccessDenied):
            continue
    return False


def launch_wechat_if_needed():
    """如果微信未运行则启动,返回主窗口对象"""
# 等待微信主窗口出现(标题为"微信")
    wechat_window = None
    for _ in range(30):  # 最多等待30秒
        windows = gw.getWindowsWithTitle('微信')
        if windows:
            # 取第一个匹配的窗口(通常就是主窗口)
            wechat_window = windows[0]
            break
        time.sleep(1)
    if not wechat_window:
        raise Exception("未找到微信主窗口,请检查微信是否已登录")
    return wechat_window


def ensure_window_active(window):
    """确保窗口处于激活状态(如果最小化则还原)"""
if window.isMinimized:
        window.restore()
    window.activate()
    time.sleep(1)  # 等待窗口获得焦点


def search_and_open_chat(contact_name):
    """
在微信主界面搜索联系人并打开聊天窗口
使用剪贴板粘贴联系人名称,避免输入法干扰
"""
# 1. 聚焦搜索框 (Ctrl+F)
    pyautogui.hotkey('ctrl', 'f')
    time.sleep(1)

    # 2. 清空搜索框(全选+删除)
    pyautogui.hotkey('ctrl', 'a')
    time.sleep(0.2)
    pyautogui.press('backspace')
    time.sleep(0.2)

    # 3. 将要搜索的联系人名称复制到剪贴板
    pyperclip.copy(contact_name)
    time.sleep(0.2)
    print("联系人已粘贴")

    # 4. 粘贴到搜索框 (Ctrl+V)
    pyautogui.hotkey('ctrl', 'v')
    time.sleep(2)  # 等待搜索结果加载

    print("已粘贴联系人名称,等待搜索结果...")
    # 5. 按两次回车:第一次选中第一个结果,第二次进入聊天窗口
    pyautogui.press('enter')
    print("确认联系人已选择,准备发送消息...")
    time.sleep(2)


def send_message(wechat_win, message):
    print("进入到发消息了。。")
    """在当前激活的聊天窗口输入消息并发送"""
    # 同样使用剪贴板粘贴消息,避免输入法问题(如果需要发送中文)
    # 计算输入框的估算坐标(窗口底部向上偏移一定像素,水平居中)
    input_x = wechat_win.left + wechat_win.width // 2
    input_y = wechat_win.bottom - INPUT_BOX_Y_OFFSET
    pyautogui.click(input_x, input_y)
    time.sleep(0.5)

    # 粘贴消息
    pyperclip.copy(message)
    pyautogui.hotkey('ctrl', 'v')
    time.sleep(0.5)
    pyautogui.press('enter')
    time.sleep(1)
    print("消息已发送")


def send_wechat_message(contact, message):
    """主流程:确保微信打开、激活、搜索联系人、发送消息"""
try:
        print("开始执行微信自动发送任务...")
        wechat_win = launch_wechat_if_needed()
        ensure_window_active(wechat_win)
        search_and_open_chat(contact)
        send_message(wechat_win, message)
        print("消息发送成功!")
    except Exception as e:
        print(f"发送失败: {e}")


def get_today_message(json_path, default_msg):
    """
从JSON文件中读取今日消息
JSON格式示例:{"2026-03-10": "今天想说的话", "2026-03-11": "明天的话"}
如果文件不存在、格式错误或无当日记录,返回默认消息
"""
today = datetime.now().strftime("%Y-%m-%d")
    print("今天日期是:" + today)
    if not os.path.exists(json_path):
        print(f"消息文件 {json_path} 不存在,使用默认消息")
        return default_msg
    try:
        with open(json_path, 'r', encoding='utf-8') as f:
            data = json.load(f)
        if not isinstance(data, dict):
            print("JSON格式错误,应为字典,使用默认消息")
            return default_msg
        message = data.get(today)
        print(message)
        if message is None:
            print(f"今日 {today} 无配置消息,使用默认消息")
            return default_msg
        print(f"今日消息:{message}")
        return message
    except Exception as e:
        print(f"读取JSON文件出错: {e},使用默认消息")
        return default_msg


def job():
    """定时任务要执行的函数"""
message = get_today_message(MESSAGE_JSON_PATH, MESSAGE)
    send_wechat_message(CONTACT_NAME, message)


if __name__ == "__main__":
    # MESSAGE 我想读取json文件 根据
    # 如果命令行参数包含 "now",则立即执行一次(用于测试)
    if len(sys.argv) > 1 and sys.argv[1] == "now":
        message = get_today_message(MESSAGE_JSON_PATH, MESSAGE)
        send_wechat_message(CONTACT_NAME, message)
        sys.exit(0)

    # 设置定时任务
    schedule.every().day.at(SEND_TIME).do(job)
    print(f"定时任务已设置,每天 {SEND_TIME} 执行。")
    print("脚本将一直运行,按 Ctrl+C 退出。")

    # 持续运行调度器
    try:
        while True:
            schedule.run_pending()
            time.sleep(60)  # 每分钟检查一次
    except KeyboardInterrupt:
        print("脚本被用户中断。")

写在最后

这个脚本稍加改造,还能实现更多玩法:

  • 结合天气API,每天自动发送天气预报。
  • 对接 ChatGPT,每天生成一句暖心的话。
  • 定时给团队发送工作日报提醒。

如果觉得本篇教程对你有帮助,欢迎点赞、在看、转发支持!
有任何问题,欢迎在评论区留言交流。

相关推荐
渐儿1 小时前
Python 并行与并发:案例与实现
后端
m0_736439301 小时前
Workerman5.0协程实战:PHP高并发新标准
jvm·数据库·python
神奇小汤圆1 小时前
面试官问:让你设计一个消息队列,你会怎么答?
后端
2301_818008441 小时前
golang如何实现消息过滤路由_golang消息过滤路由实现要点
jvm·数据库·python
CHANG_THE_WORLD1 小时前
<Fluent Python > 2. 第二章:序列的数组
网络·windows·python
techdashen1 小时前
Cloudflare 如何用 Rust 构建一个高性能解释器
开发语言·后端·rust
sing~~1 小时前
SpringCloud的了解和使用
后端·spring·spring cloud
2401_831419441 小时前
Python分类汇总怎么做_Crosstab交叉表与多条件联合频数频率统计
jvm·数据库·python
LucaJu1 小时前
DeepAgents 人工介入实战|LangGraph 实现 Agent 高危工具人工审批
python·langchain·agent·langgraph·deepagents