☰
WorkBuddy定时任务实战:每天十点半自动生成AI日报并推送微信
2026/9/28 8:28:11 网站建设 项目流程

1. 为什么我要给 WorkBuddy 设一个“十点半闹钟”

每天早上到工位,泡好咖啡坐下来,第一件事不是打开编辑器,而是先花十几分钟翻各种信息源:昨天项目里谁提交了什么、有没有新的 issue 被提上来、行业里又出了什么值得关注的东西。这件事本身不复杂,但极其消耗注意力和时间,而且一旦忙起来就很容易忘。我试过用日历提醒、用待办清单,最后都因为“提醒了还得手动去查”而放弃。

后来我把这套流程整个交给了 WorkBuddy,让它每天上午十点半自动生成一份 AI 日报,直接推送到微信。整个过程不需要我打开任何后台,不需要手动触发,到点就有一份整理好的内容躺在微信里。这篇文章就是把这套方案从头到尾拆开讲清楚:为什么这么设计、每个环节怎么落地、参数怎么选、踩过哪些坑,以及你如果想复现,具体该怎么做。

先明确一下这套东西适合谁。如果你每天需要处理大量碎片信息、有固定的信息收集习惯、又不想被“手动整理”这件事绑住,那这套方案基本可以直接抄。如果你只是想偶尔看看 AI 新闻,那可能没必要上自动化,手动刷一刷就够了。核心判断标准是:这件事你是否每天都要做,且重复度极高。只要满足这两点,自动化就是划算的。

WorkBuddy 在这里扮演的角色,是一个可以接受自定义指令、按计划执行任务的工作台。你可以把它理解成一个“听得懂人话的定时任务执行器”——你告诉它每天几点做什么,它就按时去做,做完把结果送到你指定的地方。AI 日报只是其中一个用法,同样的思路可以套用到周报汇总、数据巡检、内容监控等场景。

2. 整体方案设计与核心思路拆解

2.1 为什么选“定时触发 + 微信推送”这条链路

自动化方案有很多种形态,最常见的是“事件触发”(比如有新提交就通知)和“定时触发”(比如每天固定时间汇总)。我选定时触发,原因很直接:日报这个东西的价值在于节奏稳定。事件触发会导致通知忽多忽少,忙的时候一天几十条,闲的时候一条没有,反而增加认知负担。固定时间推送,你能形成预期,知道十点半会有一份东西,看完就进入工作状态。

推送渠道选微信,也是同样的逻辑。我不可能为了看一份日报专门去打开某个后台或者邮箱,但微信是我本来就一直开着的。把结果送到用户已经在用的工具里,是自动化方案能不能长期坚持的关键。很多人做自动化失败,不是因为技术不行,而是因为“查看成本太高”,最后就懒得看了。

提示:推送渠道的选择标准只有一个——你每天一定会打开它。微信、钉钉、飞书都可以,选你用得最顺手的那个,不要为了“看起来专业”去选一个你一周才开一次的渠道。

2.2 WorkBuddy 在链路中的定位

WorkBuddy 在这套方案里承担的是“调度 + 执行 + 汇总”三个职责。调度是指它知道什么时候该干活;执行是指它去拉取信息、调用模型生成内容;汇总是指它把结果整理成可读的格式,再通过接口推送到微信。

这里有个设计取舍值得说清楚:我没有让 WorkBuddy 直接去抓取所有原始信息,而是让它调用一个已经整理好的数据源。原因是原始信息抓取涉及太多不确定性——页面结构会变、接口会限流、反爬策略会调整。把这些不稳定因素集中在一个环节处理,比分散在整个链路里要好排查得多。WorkBuddy 只负责“拿现成的数据,生成日报,推出去”,链路越短,出问题的概率越低。

2.3 模型选型:为什么用 deepseek-v4-flash

生成日报这一步需要调用大模型。我选 deepseek-v4-flash,主要看三点:响应速度、成本、中文表达能力。日报这种场景对模型的“深度推理”要求不高,但对“快速稳定输出”要求很高。flash 版本在速度上有明显优势,而且中文语料训练充分,生成的内容读起来不像机翻。

如果你用的是其他模型,逻辑是一样的:选一个响应快、成本可控、中文表达自然的就行。不要在这个环节追求“最强模型”,日报不是写论文,够用就好。我实测下来,用 flash 版本生成一份 800 字左右的日报,从触发到推送完成,整个链路大概在 15 到 25 秒之间,这个延迟完全可以接受。

2.4 整体链路一览

把上面的设计串起来,完整链路是这样的:

  1. 每天上午 10:30,WorkBuddy 的定时任务被触发
  2. WorkBuddy 调用预设的数据源接口,拉取当日需要汇总的信息
  3. 把原始数据交给 deepseek-v4-flash,按预设的 prompt 生成日报正文
  4. 对生成内容做一次格式清洗(去掉多余空行、统一标点)
  5. 通过微信推送接口,把日报发送到指定会话
  6. 记录本次执行日志,方便后续排查

这条链路里,第 2 步和第 5 步是最容易出问题的环节,后面会专门讲排查方法。

3. 核心细节解析与实操要点

3.1 定时任务的参数怎么设

定时任务看起来简单,但有几个参数如果设错,会导致任务要么不触发,要么触发时间漂移。第一个是时区。WorkBuddy 如果跑在服务器上,默认时区可能是 UTC,你设的 10:30 实际执行时间是北京时间 18:30。这个坑我踩过,排查了半天才发现是时区问题。解决办法是在任务配置里显式指定时区,或者把服务器时区改成你所在的时区。

第二个是执行频率的边界。如果你设的是“每天 10:30”,要确认它不会在 10:30:00 到 10:30:59 之间重复触发。有些调度器的最小粒度是分钟,有些是秒,配置时要看清楚。我一般会把触发时间设成 10:30:00,然后在任务内部加一个“本次执行标记”,防止重复推送。

第三个是失败重试策略。网络请求可能失败,模型调用可能超时,如果一次失败就放弃,那当天就没有日报了。我的做法是设置最多 3 次重试,每次间隔 60 秒。如果 3 次都失败,就推送一条“今日日报生成失败”的简短通知,至少让你知道出了问题,而不是默默什么都没发生。

3.2 数据源接口的稳定性处理

数据源是整个链路的上游,它不稳定,后面全白搭。我在这一层做了三件事:

  • 加超时:单次请求超过 10 秒就放弃,避免整个任务卡死
  • 加缓存:如果本次拉取失败,尝试读取上一次成功拉取的数据,并在日报里标注“数据可能不是最新”
  • 加校验:拉回来的数据先检查字段是否完整,缺字段就直接走失败流程,不要把残缺数据喂给模型

注意:不要假设数据源永远可用。任何外部依赖都要有降级方案,哪怕降级方案只是“推送一条说明”,也比什么都不推要好。

3.3 Prompt 的设计要点

日报生成的质量,八成取决于 prompt。我试过很多版本,最后稳定下来的结构是这样的:

你是一个信息汇总助手。请根据以下原始数据,生成一份简洁的每日简报。 要求: 1. 分成三个板块:重要动态、值得关注、一句话总结 2. 每个板块不超过 5 条,每条不超过 50 字 3. 不要编造数据中没有的信息 4. 语言简洁,不要用“据悉”“据了解”这类冗余表达 5. 如果某条信息不确定,标注“待确认” 原始数据: {data}

这个 prompt 的关键在于约束输出结构和禁止编造。大模型在没有约束的情况下,很容易把简短的数据扩写成一大段废话,或者自己脑补一些不存在的信息。加上“不要编造”和“待确认”标注后,输出质量稳定了很多。

3.4 微信推送的格式处理

微信推送对格式有一定要求,纯文本最稳,Markdown 在部分场景下不渲染。我的做法是把日报生成成纯文本,用换行和简单的符号(比如-、【】)来做视觉分隔。这样不管在哪个客户端打开,显示效果都是一致的。

推送内容长度也要控制。微信单条消息有长度限制,超过会被截断。我的日报控制在 800 字以内,如果内容确实多,就分成两条推送,第一条是摘要,第二条是详情。实测下来,800 字以内的日报阅读体验最好,太长反而没人看。

4. 实操过程与核心环节实现

4.1 环境准备与基础配置

先把基础环境搭好。WorkBuddy 支持多种部署方式,我用的是 Linux 环境,因为定时任务在 Linux 上更稳定。安装过程按官方文档走就行,这里不展开,重点说几个配置项:

  • 时区配置:在配置文件里设置TZ=Asia/Shanghai,或者在启动命令前加TZ=Asia/Shanghai
  • 日志路径:指定一个固定的日志目录,方便后续排查,我设在/var/log/workbuddy/
  • 并发限制:如果同时跑多个任务,设置最大并发数,避免资源争抢

配置完成后,先跑一个最简单的测试任务,确认 WorkBuddy 能正常触发和执行。不要一上来就配完整链路,分步验证能省很多排查时间。

4.2 编写日报生成脚本

核心逻辑我写成了一个独立的脚本,WorkBuddy 只负责调用它。这样做的好处是脚本可以单独测试,不依赖 WorkBuddy 的调度。脚本的主要逻辑如下:

import requests import json from datetime import datetime def fetch_data(): """拉取原始数据,带超时和重试""" for attempt in range(3): try: resp = requests.get(DATA_SOURCE_URL, timeout=10) if resp.status_code == 200: return resp.json() except Exception as e: print(f"第 {attempt+1} 次拉取失败: {e}") return None def generate_report(data): """调用模型生成日报""" prompt = build_prompt(data) resp = requests.post( MODEL_API_URL, json={"model": "deepseek-v4-flash", "prompt": prompt}, timeout=30 ) return resp.json().get("content", "") def push_to_wechat(content): """推送到微信""" resp = requests.post( WECHAT_WEBHOOK_URL, json={"msgtype": "text", "text": {"content": content}}, timeout=10 ) return resp.status_code == 200 if __name__ == "__main__": data = fetch_data() if not data: push_to_wechat("今日日报生成失败:数据源不可用") exit(1) report = generate_report(data) if not report: push_to_wechat("今日日报生成失败:模型调用异常") exit(1) push_to_wechat(report) print(f"日报推送完成: {datetime.now()}")

这个脚本的结构很清晰:拉数据、生成、推送,每一步都有失败处理。你可以直接拿去改,把 URL 和参数换成你自己的就行。

4.3 配置 WorkBuddy 定时任务

脚本写好后,在 WorkBuddy 里配置定时任务。核心配置项如下:

配置项值说明
任务名称daily-ai-report自定义,方便识别
触发时间10:30:00每天上午十点半
时区Asia/Shanghai显式指定,避免漂移
执行命令python /path/to/report.py调用脚本
超时时间120 秒给足模型调用时间
重试次数3失败后重试
重试间隔60 秒避免频繁重试

配置完成后,先手动触发一次,确认整个链路能跑通。手动触发没问题后,再等第二天看定时触发是否正常。

4.4 验证与日志检查

任务跑起来后,要养成看日志的习惯。我一般在任务执行后 5 分钟检查一次日志,确认三件事:

  1. 数据拉取是否成功(日志里会有“拉取成功”或“拉取失败”)
  2. 模型调用是否正常(日志里会有 token 消耗和响应时间)
  3. 微信推送是否成功(日志里会有推送接口的返回码)

如果某一步失败,日志里会有具体的错误信息。根据错误信息定位问题,比盲目猜测快得多。

5. 常见问题与排查技巧实录

5.1 任务没有按时触发

这是最常见的问题,排查顺序如下:

  • 检查时区:确认 WorkBuddy 的时区和你的预期一致
  • 检查任务状态:确认任务没有被禁用或暂停
  • 检查调度器日志:看调度器有没有记录触发事件
  • 检查系统时间:服务器时间是否准确,有没有跑偏

我遇到过一次任务不触发,最后发现是服务器时间比实际时间慢了 20 分钟,导致 10:30 的任务实际在 10:50 才触发。同步一下系统时间就好了。

5.2 日报内容为空或格式错乱

如果推送出来的日报是空的,或者格式乱七八糟,通常是 prompt 或数据的问题。排查方法:

  • 打印原始数据:确认数据源返回的内容是否正常
  • 打印模型输出:确认模型返回的内容是否完整
  • 检查 prompt:确认 prompt 里的变量是否正确替换

格式错乱一般是模型没有按预期输出,可以在 prompt 里加一句“严格按照以下格式输出”,并给出示例。示例对模型的约束效果比纯文字描述好很多。

5.3 微信推送失败

微信推送失败的原因比较多,常见的有:

错误码原因解决办法
40001凭证无效检查 webhook 地址是否正确
45009接口调用超限降低推送频率,或申请更高配额
40008消息内容为空检查推送内容是否为空字符串
超时网络问题增加超时时间,或检查网络连通性

提示:微信推送接口有频率限制,不要短时间内重复推送。如果任务重试,要确保不会因为重试导致重复推送多条消息。

5.4 模型调用超时或返回异常

模型调用超时一般是网络问题或模型服务负载高。解决办法:

  • 增加超时时间,从 30 秒调到 60 秒
  • 在 prompt 里限制输出长度,减少生成时间
  • 如果频繁超时,考虑换一个响应更快的模型

返回异常的情况,比如返回内容包含乱码或无关信息,一般是 prompt 不够明确。可以在 prompt 里加“只输出日报内容,不要输出其他说明”,能有效减少无关输出。

5.5 独家避坑技巧

几个我踩过坑之后总结的技巧:

  • 不要在周五下午改配置:改完如果出问题,周末没人处理,周一回来一堆烂摊子
  • 保留最近 7 天的日志:出问题时可以对比正常和异常的执行记录
  • 推送内容加时间戳:方便确认收到的是哪一天的日报,避免混淆
  • 先跑通再优化:不要一开始就追求完美格式,先让链路跑起来,再慢慢调

6. 后续扩展与个人体会

这套方案跑稳定之后,可以扩展的方向不少。比如把日报改成周报,每周一早上推送上周汇总;或者增加一个“异常提醒”任务,当数据源出现异常时立即推送,而不是等到第二天。WorkBuddy 的自定义指令能力在这里很有用,你可以给它定几条通用规则,比如“所有推送内容必须包含时间戳”“所有失败必须推送通知”,这些规则对后续所有任务都生效,不用每个任务单独配置。

我个人在实际操作中的体会是,自动化的价值不在于“省了多少时间”,而在于“消除了多少不确定性”。以前我每天要记得去查信息,现在不用记了,到点就有。这种确定性带来的心理负担减轻,比省下来的十几分钟更值钱。另外一个小建议:日报的内容不要贪多,控制在 800 字以内,三条核心信息加一句总结就够了。信息太多反而没人看,自动化就失去了意义。

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

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

立即咨询