☰
WorkBuddy定时任务+DeepSeek:打造微信自动化技术日报
2026/9/29 18:03:18 网站建设 项目流程

1. 从"手动刷信息"到"定时收日报":这个闹钟到底解决了什么

每天早上到工位,打开电脑第一件事是什么?我猜很多人的答案跟我差不多:挨个打开收藏夹里的技术社区、公众号、RSS 源,扫一遍有没有值得看的新内容。这个过程看起来不费劲,但实际算下来,每天少则二十分钟,多则一个小时就搭进去了,而且信息质量参差不齐,翻半天可能一条有用的都没有。

我给 WorkBuddy 设了个闹钟这件事,本质上就是把"人找信息"变成了"信息找人"。每天上午十点半,一份由 AI 整理好的日报会自动推送到微信里,我只需要花三五分钟扫一眼,就能掌握当天值得关注的技术动态。这套流程里涉及几个关键角色:WorkBuddy负责任务调度和触发,DeepSeek负责内容的理解与摘要生成,微信小程序负责最终的接收和展示,而自动化则是把这三者串起来的底层逻辑。

适合谁来参考这套方案?我觉得有三类人特别合适。第一类是每天需要跟踪大量技术资讯但时间碎片化的开发者;第二类是想入门自动化工作流、但不知道从什么场景切入的初学者;第三类是用过一些 AI 工具、但始终停留在"手动对话"阶段、没体验过"定时自动跑"是什么感觉的朋友。整套方案的技术门槛不算高,但里面有不少细节如果没人提醒,很容易在配置阶段就卡住。

需要提前说明的是,下面讲到的具体配置参数和步骤,一部分来自我自己的实际搭建过程,另一部分是基于同类自动化工具的常见实践做的合理补充。不同版本的 WorkBuddy 在界面和字段命名上可能有差异,你照着做的时候以自己看到的实际界面为准。

2. 拆解这套自动化日报的四个核心环节

2.1 触发层:为什么选"定时任务"而不是"手动触发"

自动化的第一步永远是"什么时候开始跑"。WorkBuddy 这类工具通常支持多种触发方式:手动点击、Webhook 触发、定时触发、事件触发。我选择定时触发,理由很直接——日报这个东西的价值在于"稳定",而不是"及时"。

你想想,如果靠手动触发,那本质上还是在依赖人的记性。今天忙忘了,日报就断了;明天想起来补一次,节奏又乱了。定时触发的好处是它把"要不要跑"这个决策从人脑里彻底移除了,变成了一条系统规则。上午十点半这个时间点也不是随便定的,它卡在大多数团队晨会结束、进入正式工作节奏之前,这时候收到一份日报,刚好可以用来规划当天的学习或调研方向。

在 WorkBuddy 里配置定时任务,一般需要填三个东西:执行频率(每天/每周/自定义 cron 表达式)、执行时间(具体到分钟)、时区。这里有个坑我踩过:如果你的服务器或运行环境用的是 UTC 时间,而你填的是北京时间,那实际触发时间会差八个小时。所以配置完第一件事,就是看时区设置对不对。

2.2 数据层:日报的内容从哪里来

日报的内容来源决定了它的价值上限。我的做法是把信息源分成三类,分别用不同的抓取策略:

  • 结构化源:比如技术社区的 API、RSS 订阅源。这类源格式规整,直接请求就能拿到标题、链接、发布时间,处理成本最低。
  • 半结构化源:比如某些资讯页面的列表。这类需要做一定的解析,通常用正则或者简单的 DOM 选择器就能提取。
  • 非结构化源:比如一些需要登录才能看的社区。这类我一般直接放弃,因为维护成本太高,而且容易触发风控。

抓取环节有个经验值得分享:不要贪多。我一开始接了十几个源,结果日报长得像流水账,AI 摘要也抓不住重点。后来砍到五六个高质量源,日报的可读性反而上去了。信息过载和没有信息一样糟糕,这一点在做日报的时候体现得特别明显。

2.3 处理层:DeepSeek 在中间做了什么

拿到原始数据之后,直接推送给用户是没意义的——那只是一堆标题的堆砌。真正让日报"活"起来的是中间这层 AI 处理。我用的是 DeepSeek 的 API,主要做三件事:

第一是去重和聚类。同一个事件可能被多个源报道,AI 能识别出哪些是重复内容,把它们合并成一条。第二是摘要生成。给每条内容生成一句话的核心概括,让人扫一眼就知道讲的是什么。第三是重要性排序。根据内容的技术深度、讨论热度等维度,把最值得看的排到前面。

调用 DeepSeek API 的时候,prompt 的设计很关键。我试过好几种写法,最后稳定下来的模板大概是这样的:

prompt = f""" 你是一个技术资讯编辑。请对以下 {len(items)} 条资讯进行处理: 1. 合并重复或高度相似的内容 2. 为每条生成不超过 50 字的摘要 3. 按技术价值从高到低排序 4. 输出格式为 JSON 数组,每条包含 title、summary、url 三个字段 原始资讯: {raw_content} """

这里要注意的是,输出格式一定要在 prompt 里明确约束。如果你不指定 JSON,AI 可能会返回一段自然语言,后续解析起来就很麻烦。另外,DeepSeek 的 API 有 token 限制,如果原始内容太长,需要先做截断或者分批处理。

2.4 推送层:微信小程序作为接收端的设计考量

为什么选微信小程序而不是直接发邮件或者推送到其他渠道?核心原因是触达率。邮件容易被淹没在收件箱里,而微信是大多数人每天打开频率最高的应用,推送到达之后基本不会被忽略。

微信小程序在这里承担的角色其实很轻——它不需要复杂的交互,主要就是一个展示页面。但有几个细节需要注意:

  • 顶部导航栏高度:小程序的导航栏在不同机型上高度不一样,如果自定义导航栏,需要用wx.getSystemInfoSync()拿到状态栏高度再做适配,否则在刘海屏上会显示异常。
  • 缓存策略:日报数据不需要实时刷新,可以设置一个合理的缓存时间,比如 6 小时。这样用户再次打开时能秒加载,减少等待。
  • 请求封装:小程序的网络请求建议统一封装一层,把 baseURL、超时时间、错误处理都收拢到一个文件里,后续维护会轻松很多。

如果你不想自己开发小程序,也可以考虑用微信的模板消息或者服务号推送,把日报内容直接发到对话里。这种方式开发成本更低,但展示形式受限,长内容阅读体验不如小程序。

3. 把 WorkBuddy 的定时任务真正跑起来

3.1 环境准备阶段最容易忽略的三件事

在正式配置任务之前,有几项准备工作如果没做到位,后面会反复出问题。

第一是运行环境的网络连通性。WorkBuddy 需要能访问外部的数据源和 DeepSeek 的 API 接口。如果你把它部署在本地,一般没问题;如果部署在服务器上,要确认服务器的出网策略没有限制。我见过有人折腾半天以为是代码问题,最后发现是服务器根本连不上外网。

第二是 API Key 的管理。DeepSeek 的 API Key 不要硬编码在代码里,建议用环境变量或者配置文件的方式管理。WorkBuddy 一般支持在任务配置里填写密钥,或者读取环境变量。这样做的好处是,万一密钥泄露或者需要更换,不用改代码重新部署。

第三是依赖库的版本。如果你用 Python 写处理逻辑,requests、json这些库的版本要确认一下。特别是requests,老版本对某些 HTTPS 站点的支持有问题,升级到较新版本能避免一些莫名其妙的 SSL 报错。

3.2 任务配置的字段逐个说明

WorkBuddy 里创建一个定时任务,通常需要填写以下字段。我按重要性排个序,并说明每个字段的填写要点:

字段名作用填写要点
任务名称标识任务建议用"日报-日期"格式,方便排查
触发方式决定何时执行选"定时触发",不要选"手动"
Cron 表达式精确控制时间每天 10:30 对应30 10 * * *
时区避免时间偏移确认与你的预期一致,通常选 Asia/Shanghai
执行脚本实际运行的逻辑指向你的处理脚本路径
超时时间防止任务卡死建议设 300 秒,太短容易误杀
重试策略失败后如何处理建议失败重试 2 次,间隔 60 秒

Cron 表达式这块,很多人第一次接触会觉得像天书。其实记住五个位置分别代表"分 时 日 月 周"就行。30 10 * * *的意思就是每天 10 点 30 分执行,星号代表"任意值"。如果你想只在工作日跑,可以写成30 10 * * 1-5。

3.3 脚本逻辑的骨架与关键注释

下面是我实际在用的脚本骨架,做了简化处理,但核心逻辑都在:

import requests import json import os from datetime import datetime # 1. 抓取数据源 def fetch_sources(): items = [] for source in SOURCES: try: resp = requests.get(source['url'], timeout=10) # 解析逻辑根据源的类型不同而不同 items.extend(parse(resp, source['type'])) except Exception as e: print(f"抓取 {source['name']} 失败: {e}") return items # 2. 调用 DeepSeek 处理 def process_with_ai(items): api_key = os.environ.get('DEEPSEEK_API_KEY') headers = { 'Authorization': f'Bearer {api_key}', 'Content-Type': 'application/json' } payload = { 'model': 'deepseek-chat', 'messages': [{'role': 'user', 'content': build_prompt(items)}], 'temperature': 0.3 # 降低随机性,保证输出稳定 } resp = requests.post(DEEPSEEK_API_URL, headers=headers, json=payload, timeout=60) return parse_ai_response(resp.json()) # 3. 推送到微信 def push_to_wechat(content): # 这里可以是小程序云函数调用,也可以是模板消息接口 pass if __name__ == '__main__': raw = fetch_sources() processed = process_with_ai(raw) push_to_wechat(processed) print(f"日报生成完成,共 {len(processed)} 条")

这段代码里有几个细节值得展开说。temperature设成 0.3 而不是默认值,是因为日报需要的是稳定输出,不需要 AI 发挥创造力。超时时间设 60 秒,是因为 DeepSeek 处理大量文本时响应会比较慢,设太短会频繁超时。异常处理用try-except包住每个源的抓取,这样单个源挂掉不会影响整体流程。

3.4 第一次跑通之后必须做的验证

任务配置完,第一次手动触发跑通,不代表就万事大吉了。我建议做以下几项验证:

  • 检查输出内容:AI 生成的摘要有没有明显的事实错误?排序是否合理?有没有把不相关的内容合并到一起?
  • 检查推送到达:微信端是否正常收到?格式有没有乱?链接能不能点开?
  • 检查执行日志:WorkBuddy 一般会记录每次任务的执行日志,看看有没有警告或错误信息被忽略。
  • 模拟失败场景:故意把某个数据源的 URL 改错,看任务是否能正常降级处理,而不是整个崩掉。

这几步做完,你才算真正把这套流程跑稳了。

4. 那些让我折腾了半天的坑与对应的解法

4.1 时间对不上:定时任务在错误的时间触发

这是我最开始遇到的一个坑。配置里明明写的是 10:30,结果日报总是在下午 6:30 才到。排查了一圈才发现,WorkBuddy 运行环境的系统时区是 UTC,而我填的时间被当成了 UTC 时间,换算成北京时间就差了八小时。

解决办法有两个:一是把运行环境的时区改成Asia/Shanghai,二是在 Cron 表达式里直接按 UTC 时间填写。我选了第一种,因为后续所有时间相关的配置都能统一,不容易再出错。改完之后记得重启一下 WorkBuddy 的服务,让时区设置生效。

4.2 AI 输出格式不稳定:JSON 解析频繁失败

DeepSeek 虽然能力不错,但如果你在 prompt 里没有严格约束输出格式,它有时候会返回带 markdown 代码块包裹的 JSON,有时候会在 JSON 前后加一段解释性文字。我的解析代码一开始写得很死,直接json.loads(response),结果经常报错。

后来我加了一层清洗逻辑:先用正则把json 和这类标记去掉,再尝试解析。如果还是失败,就退而求其次,用正则提取出 JSON 数组的部分。这样处理后,解析成功率从大概七成提升到了接近百分之百。

import re def clean_json_response(text): # 去掉 markdown 代码块标记 text = re.sub(r'```json\s*', '', text) text = re.sub(r'```\s*', '', text) # 尝试找到 JSON 数组的起止位置 match = re.search(r'\[.*\]', text, re.DOTALL) if match: return match.group(0) return text

4.3 微信小程序的缓存把新数据挡住了

小程序默认会缓存请求结果,这在日报场景下反而成了问题——用户打开小程序,看到的还是昨天的内容。解决办法是在请求 URL 里加一个时间戳参数,或者在请求头里设置Cache-Control: no-cache。我用的方法是在 URL 后面拼上当天的日期,这样每天第一次打开时缓存自然失效,同一天内再次打开又能利用缓存加速。

4.4 数据源反爬导致抓取失败

有些站点会对频繁请求做限制,表现为返回 403 或者返回一个验证页面。遇到这种情况,我的处理策略是:降低抓取频率(比如每个源之间间隔 2 秒)、设置合理的 User-Agent、对失败源做标记并在下次运行时跳过。如果某个源连续失败超过三次,就在日志里告警,提醒我手动检查是不是源的结构变了。

这里要强调一点:抓取行为要遵守目标站点的规则。优先使用官方提供的 API 或 RSS,不要对站点造成额外负担。这既是技术上的稳妥做法,也是基本的网络礼仪。

5. 让日报从"能用"变成"好用"的几个优化方向

5.1 内容分区的设计思路

一开始我的日报就是一条条列出来,看多了会觉得疲劳。后来我把它分成了三个区:必读区放当天最重要的两三条,速览区放其余的技术动态,工具区放新发现的实用工具或库。分区之后,阅读效率明显提升,因为我知道哪些需要细看,哪些扫一眼就行。

分区的实现方式是在 prompt 里让 AI 给每条内容打一个分类标签,然后在推送时按标签分组渲染。标签体系不用太复杂,三到五个就够了,太多了反而增加判断成本。

5.2 历史归档与检索

日报只推送当天的内容,但有时候我会想翻之前某天的日报。所以我在小程序端加了一个简单的历史列表页,把每天的日报存到云数据库里,按日期倒序排列。这样既能回看,也能在需要的时候搜索关键词。

存储这块要注意数据量。如果每天存一份日报,一年就是 365 条记录,对云数据库来说完全没压力。但如果每条日报里包含大量原文,就要考虑做定期清理或者只存摘要。

5.3 推送时间的个性化调整

10:30 这个时间对我是合适的,但不一定适合所有人。如果你习惯晚到公司,可以调到 11:00;如果你喜欢在通勤路上看,可以调到 8:30。WorkBuddy 的定时任务支持随时修改触发时间,改完立即生效,不用重新部署。

我甚至考虑过做一个"智能时间"——根据用户前一天打开日报的时间,自动调整推送时间。后来觉得有点过度设计,就放弃了。自动化方案的原则是够用就好,不要为了自动化而自动化。

5.4 失败告警机制

再稳定的系统也会有出问题的时候。我给这套流程加了一个简单的告警:如果任务连续两次执行失败,就通过微信给我发一条提醒。这样我不需要每天去检查日志,只在真正出问题的时候才被通知。

告警的实现方式可以复用推送通道,只是把内容换成错误信息。WorkBuddy 本身一般也支持配置告警通知,可以在任务设置里找到相关选项。

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

搭这套东西之前,我对自动化的理解停留在"省时间"这个层面。真正跑起来之后才发现,它更大的价值是改变了我和信息的关系。以前是我主动去追信息,追得累了就干脆不看了;现在信息按时送到面前,我只需要做筛选和判断。这个转变听起来很小,但实际体验差别很大。

另外一点体会是,自动化方案要留出人工干预的口子。AI 再聪明也会有判断失误的时候,所以我在日报里保留了原始链接,看到感兴趣的可以直接点进去看原文。AI 做的是初筛和整理,最终的判断权还是在我手里。这个定位想清楚了,方案的设计方向就不会跑偏。

如果你也想搭一套类似的流程,我的建议是从最简单的版本开始:先接一个数据源,跑通抓取、处理、推送的完整链路,然后再逐步加源、加功能。一上来就追求大而全,很容易在配置阶段就耗尽耐心。先把最小可用版本跑起来,后面的优化都是水到渠成的事。

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

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

立即咨询