
⚡ 自动化发布流水线:每天两篇文章七个平台
双文章模式 · MiniMax 降级链 · 蚁小二 API · ZBlog XML-RPC · 2026.05
每天为两个不同场景生成两篇高质量文章,通过自动化流水线发布到 百家号、头条号、搜狐号、ZBlog 共计七个发布目标。本文完整拆解这套系统的架构设计、核心代码、质量策略与实战踩坑记录。
一、七武器选题分析
七武器是该系统的"情报中枢"。每天凌晨 06:10(CST),定时任务触发七武器选题分析流程:
# crontab - 七武器每日调度
10 22 * * * cd /root/.hermes && python3 topic_matrix/seven_weapons.py --mode daily
七武器从七个维度扫描信息源,输出当日选题建议:
- ? 微博热搜 — 微博实时热点 Top50,捕捉大众情绪
- ? 今日热榜 — 聚合类热榜,跨平台交叉验证热度
- ? AI 资讯 — Arxiv / Hugging Face / 业界新闻,追踪技术前沿
- ? 知乎热议 — 知乎热榜深度话题,适合延展为长文
- ? 国际视野 — 路透/Reuters 关键新闻,筛选国际化议题
- ? 行业动态 — 36氪/虎嗅,垂直行业深度报道
- ? 知识库挖掘 — 从本地记忆库中检索高价值历史话题
? 产出物:
七武器输出一个 JSON 文件(topic_matrix/daily_topics.json),包含 选题标题、热度评分、时效性、风格倾向 四维评分,供下游双文章生成器选用。
二、双文章并行生成(MiniMax 降级链)
同一个选题或同一新闻事件,并行生成两篇风格完全不同的文章:
? News 风
→
卡兹克风格
→
自媒体爆款
百家号·头条号·搜狐号
? Geo 风
→
官网 SEO 风格
→
结构化·长尾关键词
ZBlog · 官网SEO
2.1 新闻卡兹克风格
特点:口语化开场、情绪钩子、短句分段、热点切入、个人观点穿插。适合自媒体平台:读者停留在页面上的前 5 秒决定是否读完。
2.2 Geo 官网 SEO 风格
特点:H2/H3 结构化、长尾关键词布局、信息密度高、无情感渲染。适合搜索引擎收录,在 ZBlog 站点上获得长期的搜索流量。
2.3 MiniMax 降级链
两篇文章使用 MiniMax-Text-01 并行生成。如果 MiniMax 不可用,按以下链降级:
# 降级链配置(双文章各用各的)
LLM_CHAIN = [
"minimax-text-01", # 主力模型
"deepseek-chat", # 一级降级
"gpt-4o-mini", # 二级降级
]
# 注意:降级链只换模型不改 prompt,保证风格不变
⛔ 重要质量原则:
如果三个模型全部不可用,任务直接中止,不发布任何内容。宁可当天无文章,也不发布低质量 AI 文章。这是系统的第一原则。
三、封面图生成(Seedream 4.0)
文章正文生成完毕后,立即进入封面图生成环节。每篇文章需要一个封面图,系统调用 Seedream 4.0 图像生成模型:
# 封面图 prompt 构建逻辑
def build_cover_prompt(title, style):
if style == "news":
return f"现代科技感封面,主题:{title},扁平化设计,16:9,高清,无文字"
elif style == "geo":
return f"专业商务风封面,主题:{title},简洁大气,16:9,高清"
3.1 WAN 配额耗尽 403
Seedream 4.0 走的是火山引擎 API,每天有免费 WAN(万次)配额。踩坑实录:
? 踩坑 #1 — WAN 配额用完 403:
某天连续生成 30+ 张图后 API 返回 HTTP 403。解决方案:在请求中嵌入 配额预检,每次调用前先 GET /quota/remaining 查看余额,小于 10 次时自动切换为备用图床预置图。
备用方案:如果生成失败(403 或模型超时),直接使用 预设封面图池(30 张精选科技类封面,存储在本地 CDN),保证页面不被空白图卡住。
四、蚁小二 API 发布
自媒体平台(百家号、头条号、搜狐号)通过 蚁小二 API 统一发布。蚁小二是一个第三方内容分发平台,提供标准化的 RESTful API:
# 蚁小二 API 发布核心逻辑
def publish_to_platform(article, platform):
payload = {
"platform": platform, # baijiahao / toutiao / sohu
"title": article["title"],
"content": article["content_html"],
"cover_url": article["cover_url"],
"tags": article["tags"],
"category_id": article["category"],
}
resp = requests.post(
f"https://api.xiaoer.com/v1/publish/{platform}",
json=payload,
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=30
)
if resp.status_code != 200:
raise PublishError(f"发布失败 [{platform}]: {resp.text}")
return resp.json()
4.1 标题超长截断 30 字
? 踩坑 #2 — 标题超长:
百家号和头条号限制标题 30 字,超出自动截断导致语意断裂。后来加了 预截断 + 语义校验:生成标题时强制 28 字以内,并检查是否是完整语义单元。
# 标题安全截断
MAX_TITLE_LEN = 28 # 留 2 字余量
title = title[:MAX_TITLE_LEN]
# 移除末尾标点符号以避免不完整感
title = title.rstrip(",。!?;:、,.")
4.2 图片 URL 过期 403 → 转存到稳定 CDN
? 踩坑 #3 — 图片 URL 过期 403:
Seedream 生成的图片 URL 有效期仅为 1 小时。发布时如果图片已过期,百家号/头条号返回 403。解决方案:图片生成后立即上传到 阿里云 OSS + CDN,替换为长期稳定的 CDN URL。
# 图片转存到稳定 CDN
def migrate_to_cdn(image_url):
# 1. 下载图片到内存
img_data = requests.get(image_url, timeout=15).content
# 2. 计算 MD5 文件名,避免重复上传
file_name = hashlib.md5(img_data).hexdigest() + ".jpg"
# 3. 上传到阿里云 OSS
oss.put_object(BUCKET, f"covers/{file_name}", img_data)
# 4. 返回 CDN URL
return f"https://cdn.geekbang.org/covers/{file_name}"
五、ZBlog XML-RPC 发布
ZBlog(4 个独立站点)通过 XML-RPC 协议发布。每个站点有独立的 MetaWeblog API 接口:
# ZBlog XML-RPC 发布
import xmlrpc.client
ZBLOG_SITES = [
{"name": "GeoAI", "url": "https://geoai.com/xmlrpc.php"},
{"name": "TechViz", "url": "https://techviz.cn/xmlrpc.php"},
{"name": "DataPulse","url": "https://datapulse.org/xmlrpc.php"},
{"name": "InsightLab","url": "https://insightlab.net/xmlrpc.php"},
]
def publish_zblog(site, article):
proxy = xmlrpc.client.ServerProxy(site["url"])
post_data = {
"title": article["title"],
"description": article["content_html"],
"categories": [article["category"]],
"mt_keywords": ",".join(article["tags"]),
}
post_id = proxy.metaWeblog.newPost(
1, USERNAME, PASSWORD, post_data, True # publish=True
)
return post_id
ZBlog 发布的特点:每个站点独立 XML-RPC 端点,支持分类、标签、发布时间设定。Geo SEO 风格文章优先发往 ZBlog 站点,利用其搜索引擎友好性获取长尾流量。
六、整体流水线编排
整个流水线从触发到发布完毕,串行关键路径约 3-5 分钟:
# 完整流程(伪代码)
def daily_pipeline():
# 1. 七武器选题分析
topics = seven_weapons_analyze()
# 2. 并行生成双文章
news_article = generate_news_style(topics[0]) # 卡兹克风格
geo_article = generate_geo_style(topics[0]) # SEO 风格
# 3. 封面图生成 + 转存 CDN
news_cover = generate_cover(news_article, style="news")
geo_cover = generate_cover(geo_article, style="geo")
news_article["cover_url"] = migrate_to_cdn(news_cover)
geo_article["cover_url"] = migrate_to_cdn(geo_cover)
# 4. 蚁小二发布(3 平台)
for platform in ["baijiahao", "toutiao", "sohu"]:
publish_to_platform(news_article, platform)
# 5. ZBlog XML-RPC 发布(4 站点)
for site in ZBLOG_SITES:
publish_zblog(site, geo_article)
错误处理策略
- 任意单平台发布失败 → 不影响其他平台,但记录详细错误到飞书告警
- 全部平台发布失败 → 飞书发送紧急告警,第二天重试
- 标题/封面缺失 → 直接终止该篇文章的整个发布流程
- 模型降级 → 只换模型不换 prompt,保证风格一致性
七、监控与看板
每个环节有独立的监控指标:
- 选题命中率:七武器产出被采纳的比例
- 模型可用率:MiniMax / DeepSeek / GPT-4o-mini 各自成功率
- 图片生成成功率:Seedream 4.0 成功 + 转存 CDN 成功
- 发布成功率:按平台拆分的发布成功/失败计数
- 平均耗时:从触发到全平台发布完毕的总耗时
✅ 当前运行数据:
已稳定运行 47 天,累计发布 94 篇文章,平台发布成功率 96.8%,日均耗时 4.2 分钟。
八、踩坑总结
| 踩坑 |
根因 |
解决方案 |
| WAN 配额用完 403 |
Seedream 免费额用尽 |
配额预检 + 备用封面池 |
| 标题超长被截断 |
平台限制 30 字 |
生成时强制 ≤28 字 + 语义校验 |
| 图片 URL 过期 403 |
Seedream URL 有效期 1h |
生成后立即转存阿里云 OSS + CDN |
| XML-RPC 连接超时 |
ZBlog 服务器响应慢 |
增加超时到 30s + 指数退避重试 |
| 蚁小二 API 限流 |
单 IP 每分钟请求限制 |
每个平台间隔 10s 发布 |
九、结语
这套系统最核心的设计理念是:宁可中止也不降级。在内容自动化的道路上,质量比数量重要得多。一个发布失败的平台可以第二天补发,但一篇低质量的文章会长期损害品牌和搜索排名。
下一步规划:引入 发布后数据回传(阅读量、点赞数、评论数),用真实反馈反哺选题模型,形成完整的"选题 → 生成 → 发布 → 反馈 → 优化"闭环。
— 本博客由自动化发布流水线生成并发布 · 2026.05