☰
WorkBuddy定时任务+微信推送:打造AI日报自动化链路
2026/9/28 8:28:00 网站建设 项目流程

1. 为什么我要给 WorkBuddy 装一个"十点半闹钟"

每天早上到工位,第一件事不是泡咖啡,而是打开几个固定的信息源,把昨天夜里到今早发生的行业动态、项目进展、待办提醒过一遍。这件事本身不复杂,但极其消耗注意力和时间——你会在各种页面之间来回切换,被无关信息打断,等回过神来半小时已经没了。我试过用收藏夹、用待读清单、用各种聚合工具,最后发现真正的问题不在于"信息在哪",而在于"我什么时候被提醒去看"。

WorkBuddy 这类 AI 助手工具的价值,恰恰在于它能把"主动去查"变成"被动接收"。你不需要记得去问它,它到点自己把整理好的内容推给你。所以我给自己定了一个很朴素的目标:每天上午十点半,一份由 AI 生成的日报,自动出现在我的微信里。十点半这个时间点是刻意选的——早会基本结束,手头第一波紧急事项处理完,正好需要一个"今天该关注什么"的锚点。

这篇内容适合三类人看:一是已经在用 WorkBuddy 或类似 AI 助手,但还停留在"手动问答"阶段的人;二是想把 AI 能力接进微信这种日常高频入口的开发者或重度用户;三是对"定时任务 + AI 生成 + 消息推送"这条链路感兴趣、想自己搭一套的人。我会把整条链路的选型逻辑、关键步骤、踩过的坑和实测细节都摊开讲,不藏私。

需要先说明一点:下面涉及的具体接口、字段名、配置项,部分是基于常见实践的合理还原,因为不同版本的 WorkBuddy 和微信生态接口会有差异。你在复现时以自己环境的实际文档为准,但思路和排查方法是可以直接迁移的。

2. 拆解这条自动化链路:四个环节缺一不可

2.1 从"触发"到"送达"的完整路径

任何一条"定时把 AI 内容推到微信"的链路,本质上都可以拆成四段:定时触发 → 数据采集与整理 → AI 生成日报 → 消息推送到微信。这四段里,任何一段断了,整条链路就是死的。很多人一上来就研究"怎么调 AI 接口",结果发现真正卡住自己的是"定时任务在服务器上跑不起来"或者"微信这边收不到消息"。

我先把这四段各自的职责和常见实现方式列清楚,后面再逐段展开。

环节职责常见实现最容易出问题的地方
定时触发到点唤醒整个流程系统定时任务、云函数定时触发器、常驻进程内的调度器时区不对、进程被回收、任务重叠执行
数据采集拿到当天要总结的原始素材接口拉取、RSS、本地文件、数据库查询数据源鉴权失效、返回为空、格式突变
AI 生成把素材整理成可读日报调用大模型接口,带提示词模板超时、token 超限、输出格式不稳定
消息推送把结果送到微信微信生态内的消息通道、机器人 webhook频率限制、消息长度截断、鉴权过期

这张表建议你直接存下来,后面任何一环出问题,先对照它定位,比盲目翻日志快得多。

2.2 为什么选"十点半"而不是"早上八点"

时间点的选择不是拍脑袋。早上八点推送,你大概率还在通勤或刚坐下,消息会被淹没在未读里;太晚比如中午,又失去了"指导当天工作"的意义。十点半是一个注意力窗口:早上的紧急沟通告一段落,人还没进入深度工作状态,这时候一条结构清晰的日报能真正被读进去。

另外一个现实考虑是数据新鲜度。很多信息源在早上八点前还没更新完,你八点推的日报其实是"昨天的残渣"。十点半推,夜里到上午的新内容基本都进来了,日报的信息密度明显更高。这个细节看起来小,但直接决定了你愿不愿意每天真的去看它。

2.3 微信作为"收件箱"的合理性

为什么是微信而不是邮件、不是钉钉、不是某个专门的应用?因为微信是你打开频率最高、最不需要额外动作的入口。邮件要专门去开,专门的应用要专门去点,而微信你本来就在用。把日报塞进一个你已经在高频使用的通道里,是降低"阅读摩擦"最有效的办法。

但微信生态有个特点:它对主动推送的限制比较严。你不能随便给用户发消息,必须走它认可的通道。所以推送方案的选择,直接决定了这条链路能不能长期稳定跑下去。这一点我在第 4 节会重点讲。

3. 定时触发与数据采集:链路的地基怎么打

3.1 定时任务的三种落地方式与取舍

定时触发看起来最简单,其实坑最多。我按"部署成本"从低到高说三种方式。

第一种:本地机器的系统定时任务。比如在 Mac 上用launchd,在 Linux 上用cron。优点是零成本、配置直观;缺点是机器必须开着,休眠或关机就断。我一开始就是这么干的,结果周末电脑一关,周一发现日报缺了两天。如果你只是自己用、机器常年不关,这种方式完全够。

第二种:云函数定时触发器。各大云平台都提供定时触发能力,你写一个函数,配一个 cron 表达式,到点自动执行。优点是稳定、不依赖你的机器;缺点是有冷启动延迟,且函数执行时长通常有限制,如果 AI 生成比较慢可能超时。

第三种:常驻进程内的调度器。比如用 Python 的APScheduler或 Node 的node-cron,跑在一个长期运行的服务里。优点是灵活、可控、能处理复杂逻辑;缺点是你得有个地方让它一直跑着。

我最终选的是第二种和第三种结合:核心逻辑放在一个常驻服务里,用云端的定时触发器每天唤醒一次。这样既稳定,又保留了处理复杂逻辑的空间。

cron 表达式这里要特别小心。以"每天上午十点半"为例,标准五段式是:

30 10 * * *

但如果你用的是某些云平台,它可能要求六段式(多一个秒位),或者要求指定时区。我踩过的坑是:服务器默认时区是 UTC,我配了30 10 * * *,结果推送时间是北京时间下午六点半。排查了半天才反应过来是时区问题。所以配完定时任务,第一件事是确认服务器时区,或者直接在表达式里显式指定。

# 查看服务器当前时区 timedatectl # 如果不对,设置为东八区 sudo timedatectl set-timezone Asia/Shanghai

3.2 数据采集:先想清楚"日报里到底要有什么"

很多人卡在这一步,是因为没想清楚日报的内容边界。你不可能把所有信息都塞进去,那样日报会变成信息垃圾场。我的做法是先列一个"最小可用清单":今天必须知道的 3 到 5 件事。超出这个范围的,一律不进日报。

采集方式上,我主要用两类:

  • 接口拉取:对于有开放接口的数据源,直接调接口拿结构化数据。这种方式最稳,但要注意鉴权 token 会过期,得做自动刷新或失败重试。
  • 本地文件/数据库查询:对于自己产生的数据(比如待办、笔记、项目进度),直接从本地读。这种方式没有网络依赖,最可靠。

采集环节有个经验:永远对空结果做兜底。如果某天数据源挂了、返回为空,你的日报不能因此变成一片空白或者报错。我的处理是,如果采集到的素材少于阈值,就在日报里明确写"今日数据源异常,以下为部分内容",而不是硬凑或者直接失败。这样你至少知道链路哪一环出了问题。

3.3 素材预处理:别把原始数据直接丢给 AI

采集到的原始数据通常是脏的:有重复、有格式混乱、有无关字段。直接丢给 AI,它会浪费大量 token 在理解噪音上,输出质量也会下降。所以中间要加一层预处理。

我的预处理做了三件事:去重、截断、结构化。去重是把重复条目合并;截断是给每条内容设一个长度上限,避免单条超长内容挤占整个上下文;结构化是把不同来源的数据统一成同一种格式,比如都转成{标题, 摘要, 来源, 时间}这样的对象。

# 预处理示例:统一格式 + 去重 + 截断 def preprocess(raw_items, max_len=200): seen = set() cleaned = [] for item in raw_items: key = item.get("title", "").strip() if not key or key in seen: continue seen.add(key) cleaned.append({ "title": key, "summary": item.get("summary", "")[:max_len], "source": item.get("source", "unknown"), "time": item.get("time", "") }) return cleaned

这段代码不复杂,但它决定了后面 AI 生成的质量上限。垃圾进,垃圾出,这句话在 AI 日报场景里体现得淋漓尽致。

4. 让 AI 写出"像人写的"日报:提示词与输出控制

4.1 提示词模板的四个必备部分

AI 生成日报,成败几乎全在提示词。我试过很多版本,最后稳定下来的模板包含四个部分:角色设定、任务说明、输出格式、约束条件。

角色设定是告诉模型"你是谁",比如"你是一名资深的行业分析师,擅长把零散信息整理成简洁的每日简报"。任务说明是明确"要做什么",比如"根据以下素材,生成一份不超过 500 字的日报"。输出格式是规定"长什么样",比如分几个板块、每个板块几条。约束条件是划红线,比如"不要编造素材中没有的信息""不要使用夸张的营销词汇"。

这里有个反直觉的点:约束条件比任务说明更重要。因为模型天生倾向于"多说",你不明确限制,它就会把日报写成一篇冗长的分析文章。我最早版本的日报动辄上千字,读起来累,后来加了字数上限和"每条不超过两句话"的约束,可读性立刻上来了。

4.2 输出格式不稳定的三种应对

即使提示词写得很清楚,模型的输出格式仍然可能飘。今天用 markdown 列表,明天变成纯段落,后天多出一堆前言后语。这在自动化场景里是致命的,因为你的推送环节可能依赖固定格式来解析。

我的应对分三层:

  • 第一层:在提示词里给示例。直接给一个"理想输出"的样例,模型模仿能力很强,有样例比纯文字描述有效得多。
  • 第二层:代码侧做容错解析。不要假设输出一定符合格式,用正则或分段逻辑去提取关键内容,提取不到就用原文兜底。
  • 第三层:加一个"格式校验"步骤。生成后检查是否包含必需的板块标题,缺了就重试一次,或者降级为纯文本推送。
# 简单的格式校验与降级 def validate_report(text): required_sections = ["今日要点", "值得关注"] for sec in required_sections: if sec not in text: return None # 触发重试或降级 return text

4.3 控制生成耗时:超时是自动化最大的敌人

AI 生成是整条链路里最慢的一环。如果模型响应慢,加上网络波动,很容易超过定时任务的执行时限。我遇到过好几次"任务跑了但日报没推出来",最后发现是生成超时被中断了。

处理办法有三个:设合理超时、做重试、准备降级内容。超时不要设太短,给模型留足时间,但也不能无限等。重试要限制次数,避免雪崩。降级内容就是"如果 AI 生成失败,至少推一条'今日日报生成失败,请检查链路'的提示",让你知道出了问题,而不是默默什么都没发生。

提示:生成环节建议单独打日志,记录每次的耗时和 token 用量。跑一段时间后你会发现规律,比如某些时段模型响应明显变慢,据此调整触发时间能显著提升成功率。

5. 把日报送进微信:推送通道的选择与避坑

5.1 微信生态里可用的推送方式对比

这是整条链路里最需要谨慎的部分,因为微信对主动推送管得很严。我调研和实践过的几种方式,对比如下:

方式适用场景优点限制
微信内机器人 webhook群聊/个人接收配置简单、即时有频率限制、消息格式受限
服务号模板消息面向关注用户稳定、可长期需要认证、有推送额度
小程序订阅消息用户主动订阅后合规、体验好需用户逐次授权
文件传输助手类通道个人自用无需额外配置依赖客户端在线

对于"自己给自己推日报"这种个人场景,最省事的是走微信内的机器人 webhook 或文件传输助手类通道。但要注意,这类通道通常有消息长度限制,日报太长会被截断。我的做法是把日报控制在合理长度内,如果确实超长,就只推摘要,完整内容存到本地或云端,日报里附一个说明。

5.2 消息格式:让日报在微信里"好看"

微信里的消息渲染能力和网页不一样,markdown 支持有限。我试过直接推 markdown,结果一堆符号原样显示,很难看。后来改成纯文本 + 简单符号排版,可读性反而更好。

具体做法:用空行分隔板块,用短横线或数字做列表,用方括号或书名号突出标题。不要用复杂的表格和嵌套列表,微信里显示会乱。下面是一个实测效果不错的格式:

【今日日报】2024-XX-XX 一、今日要点 1. 第一条内容,一句话说清 2. 第二条内容,一句话说清 二、值得关注 - 某事项有新进展 - 某数据出现异常 三、明日提醒 - 记得处理某件事

这种格式在手机和电脑微信上都能正常显示,不会出现符号错乱。

5.3 鉴权与频率:两个最容易让链路"猝死"的点

鉴权过期是隐形杀手。很多推送通道的凭证有有效期,过期后推送会静默失败——你以为发出去了,其实对方根本没收到。我的做法是每次推送后检查返回状态,如果返回鉴权错误,立刻告警,而不是等你自己发现日报没来。

频率限制也要注意。如果你不小心把定时任务配成了每分钟执行,或者重试逻辑写得太激进,很容易触发限流,导致账号被临时限制。定时任务一定要做幂等和去重,确保同一天不会重复推送。

# 推送前检查今天是否已推送过,避免重复 def should_push_today(record_file): today = datetime.now().strftime("%Y-%m-%d") if os.path.exists(record_file): with open(record_file) as f: if today in f.read(): return False return True

6. 实测中踩过的坑与排查链路

6.1 "日报没来"的完整排查顺序

链路跑起来之后,最常遇到的问题就是"今天日报没来"。这时候不要慌,按固定顺序排查,比乱翻日志高效得多。我的排查顺序是:

  1. 先看定时任务有没有触发。查调度器日志或云函数的执行记录,确认任务是否被唤醒。如果没触发,问题在定时配置(时区、表达式、服务是否在运行)。
  2. 再看数据采集有没有成功。如果任务触发了但没产出,看采集环节的日志,是不是数据源鉴权失败或返回为空。
  3. 然后看 AI 生成有没有完成。检查生成耗时和返回内容,是不是超时或被中断。
  4. 最后看推送有没有成功。检查推送接口的返回状态,是不是鉴权过期或触发限流。

这个顺序是从链路前端往后端走,能最快定位到断点。我踩过最冤的一次是:任务触发了、数据采集了、AI 也生成了,结果推送环节因为凭证过期静默失败,白白排查了半天前面几环。

6.2 时区、编码、换行符:三个"看不见"的坑

这三个问题都属于"看起来没问题,实际处处是问题"的类型。

时区前面说过了,服务器 UTC 和本地时间不一致,会导致推送时间完全错位。编码问题常见于中文内容,如果采集或生成环节编码处理不当,日报里会出现乱码。换行符在跨平台时尤其烦人,Windows 的\r\n和 Linux 的\n混用,可能导致消息在微信里显示成一大坨。

# 统一换行符和编码 text = text.replace("\r\n", "\n").replace("\r", "\n") text = text.encode("utf-8", errors="ignore").decode("utf-8")

这几行代码看着不起眼,但能省掉你大量"为什么显示不对"的困惑。

6.3 内容质量的持续调优

链路跑通只是第一步,日报"好不好看、有没有用"才是长期价值所在。我调优的做法是每周回看一次历史日报,标记哪些内容我真正读了、哪些直接跳过。然后据此调整提示词里的板块权重和素材来源。

比如我一开始放了很多"行业新闻",后来发现自己几乎不看,就把它降级成了可选项,把"项目待办"和"数据异常"提到前面。日报是给自己看的,它的价值不由生成得多漂亮决定,而由你愿不愿意每天读决定。

7. 关于这套方案的一些个人体会

这套"十点半闹钟"我跑了挺长一段时间,最大的感受是:自动化的价值不在于省了多少操作,而在于它帮你建立了一个稳定的节奏。以前我是"想起来才看",现在是"每天固定时间被提醒",信息摄入从随机变成了规律,整个人的工作状态都不一样。

如果你也想搭一套,我的建议是先跑通最小链路,再逐步加功能。不要一上来就追求完美的日报格式、丰富的素材来源、漂亮的排版。先用最简单的定时任务 + 一次 AI 调用 + 一条微信推送,把链路跑通,确认每天能收到东西,然后再一点点优化。我见过太多人卡在"设计完美方案"阶段,最后什么都没跑起来。

另外,**给链路加一个"心跳"**很重要。哪怕某天没有内容可推,也推一条"今日无重要更新"的提示。这样你至少知道系统还活着,而不是在"没消息"和"系统挂了"之间猜来猜去。这个习惯能帮你及早发现链路故障,避免某天突然发现已经断了一周。

最后分享一个小技巧:把日报的生成结果同时存一份到本地文件。微信里的消息会被刷走,但本地文件可以随时回看、搜索、做周度月度回顾。我现在每个月会翻一次这个月的日报存档,很多当时没在意的信息,回头看会发现规律。这个附加价值,是当初搭这套系统时完全没想到的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询