news 2026/10/22 22:37:34

个人微信二次开发实战:如何通过API实现微信消息定时发送?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
个人微信二次开发实战:如何通过API实现微信消息定时发送?

定时发送消息看着简单,实际做起来坑不少——发送时间不准、批量发被限流、任务中断不知道发到哪、用户取消后还在发。一个"每天早上9点发早报"的需求,背后是一套调度加进度管理加限流加补偿的机制。

一、定时实现选型——延迟队列还是定时任务

两种实现各有适用场景。延迟队列(Redis ZSet或消息队列延迟插件)精确到秒,适合单次延迟发送。定时任务(cron或调度框架)按周期触发,适合每天的固定发送。

实际项目里两者常常结合——定时任务负责周期性触发,触发后生成延迟消息投进延迟队列。这样周期性和精确延迟都能满足。任务创建和延迟投递的接口在 Eyun 开发文档 中有对应说明。

二、消息序列与限流控制

一个定时任务往往不是发一条,而是发一个序列。比如"每周一给所有客户发通知",几百条消息要发出去。这时候它就是消息序列——一批消息按顺序发送,每条之间要有间隔。

间隔不能省。连续高频发送会触发限流,一批全失败。经验值是每条间隔3秒以上,批量发送分批处理。序列必须记录进度——发到第几条了要落库,任务中断后从断点续发。不记进度的话,中断重启后不知道发到哪,重发会造成重复投放。

三、取消机制与失败补偿

定时任务要支持取消。用户改了需求,之前排的任务要撤掉。取消要真取消——延迟队列里的消息要能删除;删不掉的场景加状态标记,消费时检查状态跳过。只标记不处理等于没取消。

失败补偿分两级。单条发送失败做有限次重试,重试仍失败的记录到失败列表并告警。整个任务级别的失败要保留原任务,不能因为一次失败就把任务丢掉。定时发送和失败通知的接口在 Eyun 开发文档 中有对应能力。

定时发送方案对照

实现方式

适用场景

精度

主要坑

延迟队列

单次延迟发送

秒级

取消难

定时任务

周期性发送

分钟级

任务重叠

两者结合

周期+精确延迟

秒级

进度管理

定时发送与进度管理实现

class ScheduledSender: def __init__(self): self.delay_queue = RedisDelayQueue() # 延迟队列 self.db = ProgressDB() # 进度存储 def schedule_batch(self, task_id, receivers, content, send_at): # 批量定时:定时任务生成延迟消息 for idx, wxid in enumerate(receivers): self.delay_queue.add({ "task_id": task_id, "seq": idx, # 序列号 "wxid": wxid, "content": content }, delay=send_at - time.time()) def consume(self, msg): # 消费延迟消息:检查取消状态 task = self.db.get_task(msg["task_id"]) if task.status == "cancelled": return # 已取消直接跳过 try: resp = send_wechat(msg["wxid"], msg["content"]) if resp.ok: self.db.mark_sent( # 记录进度 msg["task_id"], msg["seq"] ) else: self.retry(msg) except Exception: self.retry(msg) def retry(self, msg): # 有限重试:最多3次 if msg.get("retry", 0) < 3: msg["retry"] = msg.get("retry", 0) + 1 self.delay_queue.add(msg, delay=30) # 30秒后重试 else: self.db.add_failure(msg) # 记录失败告警 self.alert(msg) def cancel(self, task_id): # 取消:标记状态+清理队列 self.db.update_task(task_id, "cancelled") self.delay_queue.remove_by_task(task_id)

落地建议

定时实现按场景选——单次延迟用延迟队列,周期性用定时任务,两者结合最常用。消息序列必须记进度——发到第几条落库,中断能续发,不记就会重发。取消要真取消——能删的删,不能删的加状态标记并在消费时跳过。限流不能省——每条间隔3秒,批量分批发。微信侧的消息发送和定时触发由Eyun这类个人微信API平台 提供,调度、进度和补偿逻辑在自建服务实现,接口字段以平台开发文档为准。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/22 22:37:33

小白速通嵌入式第三天——计算机硬件组成及主要部件功能

小白速通嵌入式第三天——计算机硬件组成及主要部件功能 目录 计算机硬件组成总览&#xff08;冯诺依曼结构&#xff09;中央处理单元 CPU存储器总线输入/输出控制高频考点与易错点速记 1. 计算机硬件组成总览 1.1 冯诺依曼体系五大部件&#xff08;背&#xff09; 计算机硬…

作者头像 李华
网站建设 2026/10/22 22:37:33

GPT-6 Astra 攻破 57 年数学难题,我却卡在把一篇文章发到 5 个平台

AI 刚又"降维打击"了一道数学难题这几天技术圈在传一件事&#xff1a;一位长期研究数学的爱好者&#xff0c;用 GPT-6 Astra 把一道卡了 57 年的几何难题往前推了一大步——"给你 N 个半径为 1 的小圆盘&#xff0c;怎么塞进一个大圆里&#xff0c;才能让大圆半…

作者头像 李华
网站建设 2026/10/22 22:37:09

插件加载失败排查指南:从 entries did not activate 看插件系统机制

有人在启动日志里看到一行failed to load plugins web boot: 2 entries did not activate时&#xff0c;第一反应通常是懵的&#xff1a;插件明明装了&#xff0c;文件也在&#xff0c;为什么就是没加载起来&#xff1f;plugins 这个词在开发工具、音视频应用、持续交付平台里随…

作者头像 李华
网站建设 2026/10/21 16:44:57

插件加载失败排查:从web boot报错到entries did not activate

写插件&#xff0c;绕不开一个场景&#xff1a;你满心欢喜装好一个扩展&#xff0c;重启服务或者打开应用&#xff0c;控制台里却躺着一条failed to load plugins&#xff0c;或者更“高级”一点的web boot: 2 entries did not activate。这种报错我见了太多次&#xff0c;几乎…

作者头像 李华
网站建设 2026/10/22 0:27:54

亚马逊云服务器部署网站的步骤与上线检查清单

对于企业官网、电商平台以及各种海外业务应用来说&#xff0c;选择云服务器只是网站上线的起点。真正影响网站后续运行效果的&#xff0c;往往是服务器环境配置、网络设置、安全策略以及上线前后的检查工作。很多用户在进行亚马逊云服务器部署时&#xff0c;第一反应是“买一台…

作者头像 李华
网站建设 2026/10/19 13:03:21

政企信息孤岛:为什么档案、法务、风控更需要本地化智能知识库?

政企数字化已经走过“系统有没有”的阶段&#xff0c;进入“数据能不能安全用起来”的阶段。OA、档案系统、法务系统、风控平台、合同管理系统、业务系统陆续上线&#xff0c;但真正影响合规效率的&#xff0c;往往不是系统数量&#xff0c;而是资料散落在不同平台、不同部门、…

作者头像 李华