上一篇解决了「写」:说一句思路,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 内容流水线实战」系列更新;你做定时自动发布时,哪个平台最让你头疼,评论 聊聊;觉得有用就收藏备用。