产品经理的 AI 内容流水线实战(三):写完自动发,掘金/知乎/CSDN 定时发布 + 邮件通知踩坑

上一篇解决了「写」:说一句思路,AI 产出一篇合规的待发布稿。 这篇解决「发」:稿子躺在 Obsidian 里不会自己长腿跑到平台上。我的目标是------到点自动发,发完邮件告诉我结果,我全程不打开任何后台。


一、三个平台,三种脾气

我以为「发文章」就是调个接口的事,结果一脚踩进坑:掘金、知乎、CSDN,处理方式完全不一样。

  • 编辑器内核不同:有的是 CKEditor,有的是 Draft.js,注入正文的姿势得分开写
  • 知乎最折腾:两步发布流(先「发布」再「更新」,或两次「发布」),还有签名校验,一套代码根本打不通
  • 登录态各异:每个平台的 cookie / 凭证都得单独维护

逼出来的解法是给每个平台写一个独立的发布模块,再抽一层统一入口按平台路由。这不是示意图,是我 publish.py 里的真实结构:

python 复制代码
# vault-scripts/publish.py
from lib.platforms import juejin, zhihu, csdn   # 三个平台各自一个模块

# 统一入口读 frontmatter,按目标平台分发到对应模块
#   掘金 → juejin.py      知乎 → zhihu.py      CSDN → csdn.py

每个平台的差异(CKEditor 注入、两步发布流、签名)都封在各自的模块里,对外只暴露一个统一调用。

这三平台的深度踩坑(CKEditor 注入、Draft.js fiber chain、签名校验)我之前各写过单篇,这里不重复,重点是它们最后都被收进了一个统一入口

二、定时器:让发布不用我盯着

统一入口有了,下一步是别让我手动触发。加定时器,每天定点扫「待发布」队列自动发。这是真实的调度脚本用法:

bash 复制代码
# vault-scripts/scheduled_publish.py ------ 每日定时发布调度器
python scheduled_publish.py            # 按今日方案自动发布(最多 2 篇)
python scheduled_publish.py --pick 3   # 预览今天该发哪 3 篇(不实际发布)
python scheduled_publish.py --rescue   # 救援模式:补发昨天没发出去的

再用系统计划任务每天定时唤起它(Windows 用 schtasks,Linux/Mac 用 cron):

bash 复制代码
# Windows:每天 18:00 跑一遍
schtasks /create /tn "ScheduledPublish" /sc daily /st 1800 \
  /tr "python E:\Obsidian\vault-scripts\scheduled_publish.py" /f

配合 frontmatter 里的 status: 待发布created 时间,系统知道哪篇该发、按什么顺序发------这就是上一篇说「创建时间驱动排序」的真正用处:发布顺序不用我排,时间线天然就是队列。

三、邮件通知:把结果推给我,而不是我去查

自动跑起来的最后一个问题:我怎么知道发没发成功? 总不能不定时开三个后台去刷。

解法是发完把结果通过邮件推给我(SMTP 配置在 config/settings.json 里):

csharp 复制代码
[PubHub] 今日发布结果
  ✅ 掘金   成功
  ✅ CSDN   成功
  ❌ 知乎   失败(登录态过期)

到这一步,「写完 → 自动发 → 邮件告诉我」的链路闭环了。我以为可以躺平了。

四、躺不平:邮件只告诉我「失败了」,没告诉我「怎么办」

跑了一段时间,现实的毛边露出来了。看上面那封邮件就知道问题在哪------知乎失败了,理由是登录态过期。

邮件能让我知道 失败,但没法让我快速处理 :我得手动找到那篇、手动重发、还不知道这个平台最近到底稳不稳。更麻烦的是,三个平台成功率不一致,今天这个挂、明天那个挂,纯靠一封封邮件,我拼不出「哪个平台最不靠谱、该重点关注谁」的全局。

这个「看得见结果、看不见全局、也没法一键补发」的痛点,直接催生了下一篇的主角------一个本地客户端。

上面这套发布脚本(统一入口 + 平台模块 + 定时调度 + 邮件通知)是我一点点踩坑填出来的。想要完整脚本参考的,私聊我。


下一篇讲:为什么我不用网页、偏要做一个本地客户端,把三个平台的状态、成功率、手动补发全都管起来。


如果这篇对你有用,欢迎关注 看「AI 内容流水线实战」系列更新;你做定时自动发布时,哪个平台最让你头疼,评论 聊聊;觉得有用就收藏备用。