微信电脑版消息定时发送

最近需要微信群里定时发送消息,于是让Gemmin 2.5pro大模型写了一个python脚本,经过几次测试修改,最终成功达到定时发送。

以下是从零开始安装Python,到最终运行我们全功能脚本的每一个细节。


第一步:Python 环境安装 (只需做一次)

  1. 安装 Python 本体

    • 前往 Python 官网下载最新稳定版:https://www.python.org/downloads/
    • 在安装过程中,务必、务必、务必勾选 “Add Python to PATH” 这个选项。这能让你在系统的任何地方都能轻松运行Python命令。
  2. 安装所有依赖库 (使用国内镜像)

    • 我们的脚本一共需要 pywinauto, pyperclip, pyautogui, requests 这四个库。
    • 打开“命令提示符(cmd)”或“PowerShell”,复制并运行下面这一条命令,它会使用清华大学的国内镜像源,一次性高速安装好所有需要的库:
      1
      pip install pywinauto pyperclip pyautogui requests -i https://pypi.tuna.tsinghua.edu.cn/simple

完成以上两步,你的电脑环境就永久配置好了。


第二步:保存最终脚本代码

将下面的“微信定时发送 - v3.1 心跳诊断最终版”代码,完整地复制并保存到一个文件中,命名为 wechat_sender.py,建议直接保存在桌面上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# ====================================================================
# 微信定时发送消息 - v3.1 心跳诊断最终版
#
# - [最终方案] 心跳日志:在等待时,每分钟打印一次日志,
# 这是一种更强的防休眠/防挂起机制,并能让我们实时监控脚本状态。
# ====================================================================

import requests
import time
from datetime import datetime, timedelta

import pyperclip
import pyautogui
from pywinauto import Desktop

# --- 用户配置区 ---
TARGET_CONTACT_NAME = 'A.哥'
MESSAGE_TO_SEND = '这是v3.1心跳诊断版的最终测试。'
TARGET_TIME_STR = '20:30:00'

# --- 程序核心逻辑 ---

def get_server_time():
try:
response = requests.head("http://www.qq.com", timeout=1)
gmt_time_str = response.headers['Date']
gmt_time = datetime.strptime(gmt_time_str, '%a, %d %b %Y %H:%M:%S GMT')
return gmt_time + timedelta(hours=8)
except Exception:
return datetime.now()

def main():
try:
now = datetime.now()
hour, minute, second = map(int, TARGET_TIME_STR.split(':'))
target_today = now.replace(hour=hour, minute=minute, second=second, microsecond=0)
target_dt = target_today + timedelta(days=1) if now > target_today else target_today

print("="*50 + "\n 微信定时发送脚本 v3.1 心跳诊断版已启动\n" + "="*50)
print(f"目标窗口: '{TARGET_CONTACT_NAME}'\n预定发送时间: 每天 {TARGET_TIME_STR}\n下一次执行: {target_dt.strftime('%Y-%m-%d %H:%M:%S')}\n" + "-"*50)

print("正在寻找目标窗口...")
desktop = Desktop(backend="win32")
main_window = desktop.window(title=TARGET_CONTACT_NAME)

if not main_window.exists():
print(f"错误: 未找到名为 '{TARGET_CONTACT_NAME}' 的独立聊天窗口。")
return

print("成功找到窗口!脚本进入心跳等待状态...")

# --- 等待时间到达 ---
# 第一阶段:粗略等待,并在此期间打印心跳日志以防系统挂起
while datetime.now() < target_dt - timedelta(seconds=10):
# 每隔60秒,打印一次心跳日志
current_time_str = datetime.now().strftime('%H:%M:%S')
print(f"[{current_time_str}] 脚本仍在运行,等待中...")
time.sleep(60)

print("即将到达预定时间,切换至服务器时间进行精确校准...")

# 第二阶段:精准等待
while get_server_time() < target_dt:
time.sleep(0.05)

server_time_final = get_server_time()
print(f"服务器时间到达!于 {server_time_final.strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]} 执行发送...")

# --- 执行发送操作 ---
main_window.set_focus()
pyperclip.copy(MESSAGE_TO_SEND)
pyautogui.hotkey('ctrl', 'v')
pyautogui.press('enter')

print("--------------------------------------------------")
print("消息已成功发送!任务完成。")

except Exception as e:
print(f"程序发生严重错误: {e}")

if __name__ == '__main__':
main()

第三步:核心使用流程

每次要设置一个新的定时任务时,请遵循以下步骤:

  1. 准备微信窗口:在PC微信上,把你要发送消息的群聊或联系人拖拽成一个独立的窗口

  2. **确定准确标题 (关键步骤)**:

    • 观察这个独立窗口的标题。注意:程序能识别的标题,可能和你肉眼看到的不完全一样!(例如:“黄土高坡 (4)” 的真实标题是 “黄土高坡”)。
    • 如果不确定或运行失败,请使用附录中的“诊断脚本”来查找最准确的标题。
  3. 修改脚本配置

    • 打开 wechat_sender.py 文件。
    • 只修改最上方的“用户配置区”的三个变量:TARGET_CONTACT_NAME, MESSAGE_TO_SEND, TARGET_TIME_STR
  4. 运行脚本

    • 打开一个普通的“命令提示符(cmd)”或“PowerShell”窗口(不需要管理员权限)。
    • 输入 cd Desktop 回车,进入桌面。
    • 输入 python wechat_sender.py 回车,开始执行。脚本会打印出下一次执行的时间,然后静默等待。(测试成功后,也可以关联文件类型,直接双击打开)

第四步:调试工具与技巧

  1. 首要调试工具:诊断脚本

    • 如果未来你设置的任何窗口找不到,第一件事就是用下面的“诊断脚本”来查看它在程序眼里的真实标题。将代码保存为 diagnostic.py 运行即可。
  2. 时间同步的意义

    • 你的电脑时间和标准北京时间可能有几百到几千毫秒的误差。对于日常生活这没问题,但对于抢购、活动等需要精确到秒甚至毫秒的场景,这点误差是致命的。我们的脚本通过主动访问腾讯服务器来获取时间,确保了在最关键的时刻,是以服务器的时间为准,从而实现精准卡点。
  3. 多任务

    • 当前脚本一次只能执行一个定时任务。如果你想同时给多个人/群在不同时间发送消息,你可以:
      1. 复制多份 wechat_sender.py 文件,例如 task_A.py, task_B.py
      2. 分别修改每个文件的配置。
      3. 打开多个命令提示符窗口,每个窗口分别运行一个任务 (python task_A.py, python task_B.py …)。

附录:终极调试工具 diagnostic.py

请将此脚本一并保存在桌面,备未来不时之需。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 这是一个诊断脚本,用于列出pywinauto能看到的所有窗口标题
from pywinauto import Desktop
import sys

# 设置默认编码为UTF-8,防止中文乱码
try:
sys.stdout.reconfigure(encoding='utf-8')
except TypeError:
pass

print("--- 正在使用 'win32' 后端扫描所有窗口... ---")
try:
windows_win32 = Desktop(backend='win32').windows()
win32_titles = [w.window_text() for w in windows_win32 if w.window_text()]
for title in sorted(win32_titles):
print(title)
except Exception as e:
print(f"win32后端扫描出错: {e}")

print("\n\n--- 正在使用 'uia' 后端扫描所有窗口... ---")
try:
windows_uia = Desktop(backend='uia').windows()
uia_titles = [w.window_text() for w in windows_uia if w.window_text()]
for title in sorted(uia_titles):
print(title)
except Exception as e:
print(f"uia后端扫描出错: {e}")

print("\n--- 扫描完成 ---")