首页 / 博客 / 机器人·功能实战

微信消息定时提醒待办机器人

分类:机器人·功能实战 · 标签:微信消息定时提醒、微信待办机器人、微信自动化消息

前言

你是否遇到过这样的场景:团队每天早上需要同步任务清单,却要靠人工去群里逐条发消息;客户的跟进节点忘了提醒,导致商机白白错过;或者重要事项明明设了日历,却因为没打开电脑而错过。把提醒嵌入微信——这是最自然的解法。本文介绍如何基于 WechatApi 个人微信 HTTP API 构建一套可生产使用的微信消息定时提醒待办机器人,覆盖架构设计、核心调用代码、参数说明和落地注意事项。

为什么选微信做提醒载体

企业内部已经有钉钉机器人、飞书 Webhook,为什么还要专门折腾微信消息提醒?原因很简单:受众在哪里,提醒就该在哪里

对于大多数国内用户来说,微信是使用频次最高的 App,平均每天打开次数远超其他通讯软件。如果把待办提醒放在微信里,信息被看到的概率要比邮件、短信高出不止一个量级。更关键的是,很多业务场景面向的是外部客户或合作伙伴,他们未必装了钉钉或飞书,但几乎 100% 在用微信。

个人微信相比企业微信的优势在于门槛低——不需要对方认证企业资质,也不需要对方主动关注公众号。一个普通微信账号,授权给 API 服务即可直接发消息给好友或群。WechatApi 正是基于 iPad 协议实现了这一能力,稳定运行于私有服务器或云端,支持文本、图片、文件、小程序卡片等多种消息类型,非常适合做定时提醒的消息投递底层。

整体架构设计

一个完整的定时提醒待办机器人由三个模块组成:

模块职责技术选型示例
任务存储记录提醒内容、触发时间、接收人MySQL / SQLite / Redis Sorted Set
调度引擎定时扫描、触发到期任务APScheduler / Celery Beat / crontab
消息投递调用微信 API 发送消息WechatApi HTTP 接口

三者解耦的好处是每个部分都可以单独替换。比如调度引擎从简单的 crontab 升级为 Celery,不影响存储层和消息层的代码;消息类型从文本扩展到图文卡片,只需改投递模块。

数据流如下:

  1. 用户通过管理界面或另一个微信指令机器人(接收用户"提醒我明天 9 点开会"这类指令)创建待办记录,写入任务表。
  2. 调度引擎每分钟扫描任务表,找出 remind_at <= NOW() 且状态为"待发送"的记录。
  3. 对每条记录,构造消息体,调用 WechatApi 的发送接口,将结果写回任务表(成功/失败)。
  4. 失败的任务按指数退避策略重试,超过最大重试次数后标记为"失败"并告警。

任务表结构与调度逻辑

以 SQLite 为例,任务表建议包含以下字段:

sqlCREATE TABLE remind_tasks (
    id          INTEGER PRIMARY KEY AUTOINCREMENT,
    wxid        TEXT NOT NULL,        -- 接收人微信 ID(或群 ID)
    content     TEXT NOT NULL,        -- 提醒文本内容
    remind_at   DATETIME NOT NULL,    -- 预定发送时间(UTC)
    repeat_rule TEXT DEFAULT NULL,    -- cron 表达式,NULL 表示一次性
    status      TEXT DEFAULT 'pending',  -- pending / sent / failed
    retry_count INTEGER DEFAULT 0,
    created_at  DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_remind_at ON remind_tasks(remind_at, status);

调度引擎使用 Python APScheduler,每 60 秒触发一次扫描函数:

pythonfrom apscheduler.schedulers.blocking import BlockingScheduler
from datetime import datetime, timezone
import sqlite3, requests

API_BASE   = "https://your-wechatapi-endpoint"   # 替换为实际接入点
API_TOKEN  = "YOUR_VIDEOS_API_TOKEN"              # 替换为控制台 token
APP_ID     = "YOUR_DEVICE_APP_ID"                 # 替换为设备 appId

def send_wechat_text(wxid: str, content: str) -> bool:
    """调用 WechatApi 发送文本消息,返回是否成功。"""
    payload = {
        "appId": APP_ID,
        "toWxId": wxid,
        "content": content,
    }
    headers = {
        "VideosApi-token": API_TOKEN,
        "Content-Type": "application/json",
    }
    try:
        resp = requests.post(
            f"{API_BASE}/api/sendTextMsg",
            json=payload,
            headers=headers,
            timeout=10,
        )
        data = resp.json()
        return data.get("ret") == 200
    except Exception as e:
        print(f"[ERROR] send_wechat_text failed: {e}")
        return False

def process_due_tasks():
    now = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S")
    conn = sqlite3.connect("reminders.db")
    cur  = conn.cursor()
    cur.execute(
        "SELECT id, wxid, content FROM remind_tasks "
        "WHERE remind_at <= ? AND status = 'pending' AND retry_count < 3",
        (now,)
    )
    rows = cur.fetchall()
    for task_id, wxid, content in rows:
        success = send_wechat_text(wxid, content)
        if success:
            cur.execute(
                "UPDATE remind_tasks SET status='sent' WHERE id=?", (task_id,)
            )
        else:
            cur.execute(
                "UPDATE remind_tasks SET retry_count = retry_count + 1 WHERE id=?",
                (task_id,)
            )
    conn.commit()
    conn.close()
    print(f"[{now}] processed {len(rows)} tasks.")

scheduler = BlockingScheduler()
scheduler.add_job(process_due_tasks, "interval", seconds=60)
scheduler.start()

这段代码已经是生产可用的骨架:扫描、发送、记录结果、有限重试,逻辑清晰且容易扩展。

WechatApi 核心接口参数说明

WechatApi 基于 微信 iPad 协议 实现,鉴权方式统一使用请求头 VideosApi-token,业务参数通过 JSON body 传入。以文本消息为例:

请求示例(curl):

bashcurl -X POST "https://your-wechatapi-endpoint/api/sendTextMsg" \
  -H "VideosApi-token: YOUR_VIDEOS_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "appId":   "YOUR_DEVICE_APP_ID",
    "toWxId":  "wxid_xxxxxxxxxxxxxxx",
    "content": "【待办提醒】您有一个会议将在 10 分钟后开始,请做好准备。"
  }'

成功响应示例:

json{
  "ret": 200,
  "msg": "操作成功",
  "data": {
    "msgId": "8176543210987654321",
    "createTime": 1718329200
  }
}

主要参数一览:

参数名位置类型说明
VideosApi-tokenHeaderstring控制台颁发的鉴权 token,每设备唯一
appIdBodystring设备 ID,登录控制台后获取
toWxIdBodystring接收方的 wxid 或群 chatroom ID
contentBodystring消息文本,支持换行符 \n
ret响应int200 表示成功,其他值见错误码文档
data.msgId响应string消息唯一 ID,可用于对账

群消息与私聊接口参数一致,区别在于 toWxId 传群 ID(以 @chatroom 结尾)。如果需要在群里 @ 某人,追加 atWxIds 数组字段即可,详见官方开发文档 post.wechatapi.net

进阶:支持用户自主配置提醒的指令机器人

只有运营人员手动录入任务的系统,使用场景太窄。更实用的做法是让用户自己通过微信发指令来设置提醒,机器人解析后写入任务表。这需要在消息接收端(Webhook 或轮询)处理入站消息。

接收到用户发来的消息后,通过正则或 NLP(调用大模型提取意图)解析出时间和提醒内容。以简单正则为例:

pythonimport re
from datetime import datetime, timedelta

def parse_remind_command(text: str):
    """
    支持格式示例:
      "提醒我明天上午9点 开周会"
      "3小时后提醒我 提交报告"
      "提醒我2026-06-14 15:30 客户回访"
    返回 (remind_at, content) 或 None
    """
    # 匹配绝对时间:YYYY-MM-DD HH:MM
    m = re.search(r"(\d{4}-\d{2}-\d{2})\s+(\d{2}:\d{2})\s+(.+)", text)
    if m:
        dt = datetime.strptime(f"{m.group(1)} {m.group(2)}", "%Y-%m-%d %H:%M")
        return dt, m.group(3).strip()

    # 匹配相对时间:N小时后
    m = re.search(r"(\d+)小时后\S*\s+(.+)", text)
    if m:
        dt = datetime.utcnow() + timedelta(hours=int(m.group(1)))
        return dt, m.group(2).strip()

    return None

解析成功后直接 INSERTremind_tasks 表,下一个调度周期自然会处理。整个闭环无需人工干预。

这种"用微信管理微信提醒"的设计非常受销售、运营团队欢迎——他们不需要打开额外的 App 或网页,在聊天框里说一句话就完成了待办创建。借助 WechatApi 的微信机器人开发能力,这套逻辑可以很快搭建起来并接入已有业务系统。

定时重复提醒与 Cron 表达式

一次性提醒只是基础能力,很多场景需要周期性提醒

在任务表的 repeat_rule 字段存储标准 cron 表达式(如 0 9 * * 1-5 表示工作日每天 9 点),调度引擎在任务执行后检查该字段:若为 NULL 则标记为 sent;若有值,则根据 cron 规则计算下一次触发时间并更新 remind_at,状态重置为 pending

APScheduler 内置了 CronTrigger,可以直接解析标准 cron 表达式,不需要自己写计算逻辑:

pythonfrom apscheduler.triggers.cron import CronTrigger

# 示例:动态注册一个每天 9 点触发的 job
scheduler.add_job(
    func=lambda: send_wechat_text("wxid_xxxxxxx", "早安,今日待办已就绪,请查收!"),
    trigger=CronTrigger.from_crontab("0 9 * * *"),
    id="daily_morning_brief",
    replace_existing=True,
)

如果任务量大,建议用数据库驱动的 jobstore(APScheduler 支持 SQLAlchemy jobstore),这样重启服务后已注册的定时任务不会丢失。

生产部署注意事项

1. 设备在线保障

WechatApi 依赖微信设备保持登录状态。建议监听设备离线回调(或定期调用设备状态查询接口),一旦掉线立即告警,触发重新扫码登录流程,避免提醒消息静默丢失。

2. 消息发送频率控制

微信对短时间内大量发送消息有频率限制。若有批量提醒场景(如同时给 500 人发早报),需要在调度层做限速:每条消息之间加随机延迟(建议 1-3 秒),分批次投递而非并发轰炸。WechatApi 文档 中有详细的频控建议,上线前务必阅读。

3. 时区处理

服务器、数据库和前端三处时区必须统一,否则"明天 9 点"可能变成"后天 2 点"。推荐全链路使用 UTC 存储,仅在展示层做时区转换。数据库字段用 DATETIME 配合应用层显式传 UTC 时间戳,避免依赖数据库时区配置。

4. 幂等发送

调度引擎在极少数情况下可能重复触发同一任务(服务重启、时钟漂移等)。建议用 UPDATE ... WHERE status='pending' 的原子操作配合数据库行锁,或引入分布式锁(Redis SETNX),保证同一任务只被发送一次。

5. 内容安全

用户自定义的提醒内容需要过滤敏感词,避免机器人账号因发送违规内容而被限制。可以在写入任务表前接入文本审核 API(腾讯云/阿里云均有现成服务),高风险内容拦截并返回提示。

实际业务场景举例

以下几类场景已有团队在用这套方案落地,可直接参考:

销售 CRM 跟进提醒:销售在 CRM 里更新客户状态时触发写入提醒任务,到期后机器人在个人微信推送"今天需要回访客户 XX,上次沟通进展:……",比邮件触达率高出数倍。

运营每日播报:电商团队设置每天 8:00 推送昨日销售数据摘要到运营群,数据从内部 BI 系统实时拉取后拼成消息文本,比人工整理快且不容易出错。

项目里程碑提醒:项目管理工具(如 Jira、飞书多维表格)通过 Webhook 将截止日期写入提醒表,机器人提前 1 天、当天分别在项目群提醒负责人,避免交付物临时失联。

个人待办助手:个人用户通过微信给机器人发指令("提醒我下周三上午 10 点 去医院体检"),机器人确认后写入任务,到期推送提醒。这也是 微信二次开发 中非常典型的个人效率工具方向。

小结

本文从架构设计到核心代码,完整拆解了如何用 WechatApi + APScheduler 搭建一套微信消息定时提醒待办机器人。核心要点回顾:

如果你正在评估微信消息自动化方案,WechatApi 提供了完整的 个人微信 API 能力,支持文本、图片、文件、群管理等丰富接口,可以直接在 控制台 注册试用,接入成本极低。

想动手试试?

WechatApi 提供扫码登录、消息收发、好友与群管理等 REST 接口,注册后几分钟跑通。

立即免费注册查看开发文档

相关产品页

🔗 微信二次开发(产品页)🔗 微信机器人开发(产品页)🔗 微信群管理机器人(产品页)

相关文章

30 分钟做一个微信自动回复机器人(完整实战)微信机器人接入 GPT,实现智能自动回复微信群管理机器人开发实战:自动迎新、答疑、踢人微信客服机器人怎么做?7×24自动应答+转人工方案
© 2025 WechatApi · 企业级微信智能机器人接入平台
官网价格帮助文档博客
苏ICP备2024128799号 · 苏ICP备2023038368号