1. 为什么我要给 WorkBuddy 设一个“十点半闹钟”
每天早上到工位,第一件事不是泡茶,而是打开各种窗口翻消息、看邮件、扫一遍项目群里的讨论,把昨天遗留的问题和今天要跟进的事项在脑子里过一遍。这个过程大概要花掉二十分钟到半小时,而且经常因为信息太散而漏掉关键内容。后来我把这套流程交给了 WorkBuddy,让它每天上午十点半自动生成一份 AI 日报,直接推送到微信上。现在我到工位坐下,微信里已经躺着一份整理好的摘要,扫一眼就能进入状态。
这个项目的核心其实就三件事:定时触发、AI 内容生成、微信推送。听起来简单,但中间涉及调度策略、数据源整理、提示词设计、推送通道选择等一堆细节。我踩过的坑包括:定时任务在服务器重启后失效、AI 输出格式不稳定导致推送内容乱码、微信侧消息长度超限被截断等等。这篇文章会把整套方案的思路、实现细节和避坑经验完整拆开讲,适合有一定脚本基础、想把日常信息整理工作自动化的朋友参考。即使你之前没接触过 WorkBuddy,跟着思路走也能理解整个链路的搭建逻辑。
提示:本文提到的 WorkBuddy 是一个 AI 任务编排工具,核心能力是把多个步骤串成一条自动化流水线。不同版本的界面和配置方式可能有差异,但底层逻辑是相通的。
2. 整体方案设计与核心思路拆解
2.1 为什么选“定时触发 + AI 生成 + 微信推送”这条链路
先说我评估过的几种方案。第一种是纯本地脚本,用系统的定时任务跑一个 Python 脚本,脚本里调 AI 接口生成内容,再通过某种方式发到手机。第二种是用现成的自动化平台,拖拽几个节点连起来。第三种就是 WorkBuddy 这类工具,把调度、AI 调用、消息推送都封装成可配置的模块。
我最终选第三条路,原因很实际。纯本地脚本的自由度最高,但维护成本也最高——服务器换了要重新配环境,依赖升级了要重新测,推送通道挂了要自己排查。自动化平台看起来省事,但很多平台对 AI 模型的选择有限制,提示词也不能精细控制。WorkBuddy 的好处在于它既提供了可视化的任务编排,又允许我在关键节点插入自定义逻辑,比如自己写提示词模板、自己处理数据格式。这种“半开放”的形态对我来说刚刚好。
另一个关键考量是推送通道的稳定性。微信是我每天必看的工具,消息触达率比邮件高得多。但微信本身不提供个人号的消息推送接口,所以需要借助一些中间服务。我试过几种方式,最后选了一个折中方案:通过一个轻量的消息中转服务,把内容转发到微信的文件传输助手或者某个只有自己的群。这样既不需要复杂的认证流程,又能保证消息能到。
2.2 十点半这个时间点是怎么定下来的
时间选择不是拍脑袋决定的。我观察了自己一周的工作节奏:九点到九点半是处理紧急消息和站会的时间,九点半到十点是在写代码或者处理具体任务,十点左右会有一个自然的停顿——可能是倒水、可能是等编译。十点半这个点,上午的工作已经推进了一部分,但还没到午饭前的收尾阶段,正好适合插入一个信息同步的动作。
另外从数据源的角度看,很多系统的日报数据是在早上八点到九点之间生成的,十点半去拉取能确保数据已经更新完毕。如果设得太早,比如九点,可能会拿到不完整的数据;设得太晚,比如十一点半,又接近午饭时间,容易被其他事情打断。所以十点半是一个经过实测的“甜点时间”。
注意:如果你的数据源有固定的更新时间窗口,比如某些平台是每天十点才刷新数据,那定时任务至少要往后推半小时,留出缓冲。
2.3 日报内容应该包含什么
一开始我想把所有信息都塞进去,结果生成的内容又长又乱,根本不想看。后来我做了减法,只保留四类内容:昨日关键进展、今日待办事项、需要关注的风险点、一条随机激励语。前三条是实用信息,最后一条是给自己一点正向反馈。
这个结构的好处是信息密度高但阅读负担低。每条内容控制在两三句话以内,整份日报读下来不超过一分钟。如果你也想做类似的事情,建议先想清楚“我每天早上最想知道什么”,而不是“我能拿到什么数据”。前者是需求驱动,后者是技术驱动,效果差别很大。
3. 核心细节解析与实操要点
3.1 WorkBuddy 任务的创建与规则配置
在 WorkBuddy 里创建一个定时任务,第一步是选触发方式。它支持 cron 表达式,也支持可视化选择。我直接用 cron 写的30 10 * * *,意思是每天十点三十分触发。这里有个细节:如果你的服务器时区不是东八区,需要在任务配置里显式指定时区,否则会在错误的时间跑起来。
创建完触发规则后,下一步是定义任务步骤。我的任务链是这样的:
- 数据采集节点:从几个数据源拉取原始信息,包括项目管理系统里的任务状态、代码仓库的提交记录、以及一个手动维护的待办清单。
- 数据清洗节点:把拉到的原始数据做去重、排序、截断,统一成结构化格式。
- AI 生成节点:把清洗后的数据填入提示词模板,调用 AI 模型生成日报正文。
- 格式处理节点:对 AI 输出做后处理,比如去掉多余的 Markdown 标记、控制总长度。
- 推送节点:把最终内容发送到微信。
每个节点都可以单独测试。我建议先把前四个节点跑通,确认输出内容符合预期后,再接入推送节点。否则调试的时候会频繁收到测试消息,很烦人。
3.2 提示词模板的设计要点
提示词是决定日报质量的关键。我试过好几种写法,最后稳定下来的模板大概是这样的结构:
你是一个工作助理,需要根据以下原始数据生成一份简洁的每日工作日报。 要求: 1. 分为四个部分:昨日进展、今日待办、风险提醒、一句话鼓励。 2. 每个部分不超过三条,每条不超过两句话。 3. 语言简洁,不要用“我们”“大家”这类词,直接用动词开头。 4. 如果某个部分没有内容,写“暂无”。 5. 不要编造数据中没有的信息。 原始数据: {data}这个模板里最重要的两条是“不要编造”和“控制长度”。AI 模型天然倾向于扩写和补充,如果不加限制,它会自己脑补出一些不存在的事项。另外长度控制也很关键,因为微信消息有长度限制,太长的内容会被截断或者折叠。
实操心得:提示词里的示例比描述更有效。如果你希望 AI 输出特定格式,最好在提示词里给一个简短的示例,而不是用文字描述格式要求。
3.3 微信推送通道的选择与配置
微信推送这块我折腾最久。个人微信没有官方推送接口,所以需要找一个合法的替代方案。我最终用的是“消息中转 + 文件传输助手”的方式:WorkBuddy 把内容发到一个自建的中转服务,中转服务再通过微信的开放能力把消息转发到我的文件传输助手。
具体配置时需要注意几点。第一,消息内容要做 URL 编码,否则特殊字符会导致发送失败。第二,如果内容超过一定长度,要主动截断并加上“全文见附件”之类的提示。第三,推送失败要有重试机制,我设的是失败后隔三十秒重试一次,最多重试三次。
另外,如果你不想折腾中转服务,也可以考虑用邮件作为备选通道。虽然触达率不如微信,但配置简单很多,适合刚开始尝试的阶段。
3.4 数据源的整理与清洗
数据清洗这一步看起来不起眼,但直接决定了 AI 生成内容的质量。我的原始数据来自三个地方,格式各不相同:项目管理系统返回的是 JSON,代码仓库的提交记录是纯文本,待办清单是我手动维护的 Markdown 文件。
清洗的逻辑是:先把所有数据转成统一的 JSON 结构,每个条目包含type、title、status、timestamp四个字段。然后按时间倒序排列,只保留最近二十四小时的条目。最后对title做截断,超过五十个字符的只保留前五十个。
这一步的代码不复杂,但一定要做。我一开始跳过清洗直接喂给 AI,结果生成的内容里混进了大量无关信息,比如三个月前的旧任务、已经关闭的工单等等。清洗之后,日报的相关性明显提升。
4. 实操过程与核心环节实现
4.1 环境准备与依赖安装
我是在一台常驻的 Linux 机器上跑这套流程的。系统是 Ubuntu 22.04,Python 版本 3.10。需要安装的依赖不多,主要是requests用来调接口,pyyaml用来读配置文件,以及schedule作为本地调试时的备用调度器。
sudo apt update sudo apt install -y python3-pip pip3 install requests pyyaml scheduleWorkBuddy 本身如果是客户端形式,直接在界面里配置即可;如果是服务形式,需要确认它的 API 地址和认证方式。我用的版本需要在配置文件里填一个 token,这个 token 在 WorkBuddy 的设置页面可以找到。
注意:token 不要硬编码在脚本里,建议放在环境变量或者单独的配置文件里,并且给配置文件设置好权限,避免泄露。
4.2 数据采集脚本的编写
数据采集我写了一个 Python 脚本,核心逻辑是三个函数分别拉取三个数据源,然后合并。这里以拉取项目管理系统数据为例:
import requests import json from datetime import datetime, timedelta def fetch_project_tasks(api_url, token): headers = {"Authorization": f"Bearer {token}"} params = { "updated_after": (datetime.now() - timedelta(hours=24)).isoformat(), "status": "open,in_progress" } resp = requests.get(api_url, headers=headers, params=params, timeout=10) resp.raise_for_status() tasks = resp.json().get("items", []) result = [] for t in tasks: result.append({ "type": "task", "title": t.get("title", "")[:50], "status": t.get("status", ""), "timestamp": t.get("updated_at", "") }) return result这段代码的关键点是updated_after参数,只拉取最近二十四小时有更新的任务。另外timeout一定要设,否则网络卡住的时候整个任务会挂起。raise_for_status用来在接口返回错误时及时抛出异常,方便排查。
4.3 AI 生成节点的配置与调试
在 WorkBuddy 里配置 AI 节点时,需要填几个东西:模型选择、提示词模板、输入变量映射、输出格式。模型我选的是 deepseek 系列,因为它在中文理解和指令遵循上表现比较稳定,而且响应速度可以接受。
输入变量映射是把上一步清洗后的数据填入提示词的{data}占位符。这里要注意数据量不能太大,如果原始数据超过几千字,AI 的处理时间会明显变长,而且容易丢失细节。我的做法是先在清洗阶段做一次摘要,把每个条目的描述压缩到一句话,再喂给 AI。
调试的时候我建议先用固定的测试数据跑几遍,观察输出是否稳定。如果发现 AI 有时候输出 Markdown 有时候输出纯文本,可以在提示词里明确要求“输出纯文本,不要使用任何标记符号”。如果发现内容长度波动很大,可以在提示词里加上字数范围,比如“总字数控制在三百字以内”。
4.4 推送环节的实现与测试
推送环节我写了一个简单的转发函数,把 AI 生成的文本发到中转服务:
def push_to_wechat(content, endpoint, secret): payload = { "secret": secret, "content": content[:1800], "type": "text" } resp = requests.post(endpoint, json=payload, timeout=10) if resp.status_code != 200: raise RuntimeError(f"push failed: {resp.status_code}") return resp.json()这里content[:1800]是做一个硬截断,防止内容过长导致推送失败。实际测试下来,一千八百个字符以内的消息基本都能正常送达。如果内容确实需要更长,可以考虑拆成多条发送,或者生成一个摘要版本加一个完整版本的链接。
测试推送的时候,我建议先用一条固定的测试消息,确认通道通了之后,再接入真实的 AI 输出。否则一旦格式有问题,你很难判断是 AI 的问题还是推送的问题。
4.5 定时调度的配置与验证
WorkBuddy 的定时任务配置好之后,一定要做一次手动触发测试。我一般会先把触发时间设成几分钟后,观察任务是否按时执行、每个节点是否正常完成、最终消息是否送达。确认无误后再改成正式的十点半。
另外要检查任务的超时设置。如果某个节点卡住,整个任务会一直挂着。我给每个节点设了三十秒的超时,整个任务设了五分钟的总超时。超过时间就标记为失败,并发送一条告警消息到微信,这样我能及时知道出了问题。
实操心得:定时任务最好加一个“执行日志”节点,把每次运行的耗时、各节点状态、输出摘要记录到一个文件里。出问题的时候翻日志比重新跑一遍快得多。
5. 常见问题与排查技巧实录
5.1 任务没有按时触发
这是最常见的问题。排查顺序是这样的:先确认 WorkBuddy 服务本身是否在运行,再看任务的 cron 表达式是否正确,然后检查时区设置。我遇到过一次是因为服务器重启后 WorkBuddy 的服务没有自动拉起,导致任务根本没跑。后来我加了一个系统级的守护配置,确保服务异常退出后能自动重启。
还有一种情况是任务触发了但卡在某个节点。这时候要看节点的超时设置和日志。如果日志显示某个接口调用一直没返回,那大概率是网络问题或者对方服务挂了。我的做法是在关键节点加上重试逻辑,比如接口调用失败后隔几秒重试两次。
5.2 AI 输出内容不符合预期
AI 输出的问题一般分三类:格式不对、内容跑偏、长度失控。格式问题通常是因为提示词不够明确,解决办法是在提示词里给出具体的输出示例。内容跑偏往往是因为原始数据太杂,AI 抓不住重点,这时候要加强数据清洗,只保留最相关的信息。长度失控则需要在提示词里明确字数限制,并且在输出后做一次截断。
我自己的经验是,提示词要反复迭代。第一版写完之后,连续跑三天,每天看输出,把不满意的地方记下来,然后针对性地改提示词。一般迭代三到五轮之后,输出质量就能稳定下来。
5.3 微信推送失败或消息被截断
推送失败的原因比较多。如果是网络问题,重试通常能解决。如果是认证问题,需要检查 token 或 secret 是否过期。如果是内容问题,比如包含了特殊字符,那就需要在推送前做一次转义处理。
消息被截断通常是因为长度超限。不同通道的长度限制不一样,我用的中转服务限制是两千个字符左右。解决办法是在推送前先计算内容长度,超过阈值就自动截断并加上省略号。更好的做法是让 AI 生成时就控制长度,而不是事后截断。
5.4 数据源接口变更导致采集失败
这个问题的隐蔽性比较强,因为接口变更往往不会提前通知。我的应对策略是在采集脚本里加一个“数据量校验”:如果拉到的条目数为零,或者比昨天少了超过一半,就触发告警。这样即使接口变了,我也能第一时间知道,而不是等到日报内容变得很奇怪才发现。
另外建议把采集脚本的返回结果保存一份原始副本,方便对比。我一般会保留最近七天的原始数据,超过七天的自动清理。这样既不占太多空间,又能在出问题时回溯。
5.5 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决措施 |
|---|---|---|---|
| 任务未触发 | 服务未运行、cron 错误、时区不对 | 检查服务状态和任务配置 | 加守护进程、修正 cron 和时区 |
| 任务卡住 | 接口超时、节点死锁 | 查看节点日志和超时设置 | 加重试逻辑、设置合理超时 |
| AI 输出格式乱 | 提示词不明确 | 对比提示词和实际输出 | 增加输出示例和格式约束 |
| 推送失败 | 网络问题、认证过期、内容超限 | 检查推送日志和返回码 | 重试、更新凭证、截断内容 |
| 数据为空 | 接口变更、权限失效 | 检查采集脚本返回 | 加数据量校验和告警 |
6. 几个让日报更好用的小技巧
6.1 给日报加一个“昨日回顾”的锚点
我在日报的最后加了一行“昨天这个时候你在做什么”,内容是前一天日报里“今日待办”的第一条。这样做的目的是形成一个闭环:昨天说要做的,今天看看有没有推进。如果连续几天都看到同一条待办没有变化,那就说明这件事需要重新评估优先级了。
这个功能实现起来很简单,就是在生成日报的时候,把前一天日报的内容读出来,取第一条待办,拼接到新日报的末尾。但效果很好,有一种“自己监督自己”的感觉。
6.2 用不同的语气切换来保持新鲜感
同样的格式看久了会麻木。我在提示词里加了一个随机变量,让 AI 在“正式”“轻松”“极简”三种风格之间随机切换。正式风格适合周一,轻松风格适合周五,极简风格适合特别忙的时候。这个改动很小,但让日报的阅读体验好了很多。
具体做法是在提示词模板里加一个{style}占位符,然后在生成前随机选一个值填进去。风格描述可以写得很简单,比如“正式:用词严谨,条理清晰”“轻松:语气随意,可以用口语”“极简:只保留最关键的信息,每条不超过十个字”。
6.3 把日报同步一份到笔记软件
微信里的消息容易被刷掉,所以我还会把每天的日报同步一份到笔记软件里。这样过一段时间可以回看,看看自己这段时间都在忙什么。同步的方式很简单,就是在推送节点后面再加一个节点,把同样的内容写到笔记软件的接口里。
笔记软件的选择看个人习惯,我用的是一个支持 Markdown 的轻量工具。关键是它的接口要简单,最好支持直接 POST 一段文本就能创建一条笔记。如果接口太复杂,维护成本就上去了。
6.4 定期回顾和调整日报结构
我大概每个月会花十分钟看一下这个月的日报,问自己三个问题:哪些内容我从来不看?哪些内容我每次都看?有没有什么信息是我希望看到但日报里没有的?根据这三个问题的答案来调整日报的结构。
上个月我发现“风险提醒”这一块经常是“暂无”,说明我的数据源里缺少风险相关的信息。于是我在采集节点里加了一个来源,专门拉取项目群里被标记为“阻塞”的消息。这个改动之后,风险提醒的命中率明显提高了。
提示:日报的结构不是一成不变的,随着工作内容的变化,需要定期调整。建议每个月做一次小回顾,每季度做一次大调整。
6.5 异常情况的兜底方案
再稳定的系统也会出问题。我的兜底方案是:如果十点半没有收到日报,十点四十五分的时候会有一个备用任务再跑一次。如果备用任务也失败了,我会收到一条简短的告警消息,内容只有“日报生成失败,请检查”。这样即使主流程挂了,我也能知道,而不是傻等。
备用任务的配置和主任务基本一样,只是触发时间不同,而且它会在执行前先检查一下今天的日报是否已经发送成功。如果已经发送过了,就直接跳过,避免重复推送。
7. 关于 WorkBuddy 规则配置的一点补充
标题里提到“给 WorkBuddy 定几条规则,后续对所有任务都生效”,这个能力在实际使用中确实很实用。我目前设了三条全局规则:第一条是“所有涉及外部接口调用的节点,超时时间不超过三十秒”;第二条是“所有 AI 生成的内容,输出前必须做一次长度检查”;第三条是“所有推送类节点,失败后必须重试至少两次”。
这三条规则帮我省了很多重复配置的工作。比如我后来新增了一个“周报生成”的任务,就不需要再单独设置超时和重试,直接继承全局规则就行。WorkBuddy 的规则配置界面支持条件判断,比如“如果节点类型是 AI 生成,则应用规则 A”,这样灵活性更高。
如果你刚开始用 WorkBuddy,建议先不要设太多规则,等跑通两三个任务之后,再根据实际遇到的问题来提炼规则。规则太多反而会互相冲突,排查起来更麻烦。
8. 最后分享几个踩坑之后的体会
这套东西我从开始折腾到稳定运行,大概花了两个周末。最大的体会是:不要追求一步到位。我一开始想做一个大而全的日报系统,结果每个环节都出问题,调试起来非常痛苦。后来拆成小步走,先让数据采集跑通,再加 AI 生成,最后接推送,每一步都确认稳定了再往下走,效率反而高很多。
另一个体会是日志比什么都重要。我现在的每个节点都会输出结构化的日志,包括开始时间、结束时间、输入摘要、输出摘要、状态码。出问题的时候,看一眼日志基本就能定位到是哪个环节出了错。没有日志的话,只能靠猜,非常浪费时间。
还有一点是不要过度依赖 AI。AI 适合做摘要和格式化,但不适合做判断和决策。我的日报里所有涉及优先级判断的内容,都是我在采集阶段就打好标签的,AI 只负责把标签翻译成通顺的文字。如果把判断也交给 AI,输出会变得很不稳定。
最后,这套方案的价值不在于技术有多复杂,而在于它确实帮我省下了每天早上的二十分钟。这二十分钟我可以用来做更重要的事,或者干脆多喝一杯咖啡。自动化工具的意义就在于此:把重复的、低价值的事情交给机器,把时间和精力留给真正需要人来做的事情。