我用 Python 搭了一条"AI 写稿→自动配图→定时发布"的流水线,每天 3 篇不用管
很多人问我:你公众号/博客天天更新,哪来那么多时间?
答案很简单:写一篇内容的是人,但把内容变成"每天稳定产出"的,是一套代码流水线。
这篇文章把我的完整方案拆开讲:AI 写稿、自动配图、定时发布三个环节怎么串起来,每一步给出可复用的思路和关键代码片段。不求你能一次抄完,但至少你抄走其中一环,就值回票价。
一、整体架构:一句话版
定时器触发 ↓ ① AI 写稿(大模型 API,按 Prompt 模板生成正文) ↓ ② 自动配图(AI 生图 API,生成无文字封面) ↓ ③ 定时发布(调度器 + 浏览器自动化,上传发布) ↓ 日志记录(每天产出自动归档)核心思想就四个字:管道化(Pipeline)。每个环节只做一件事,环节之间用"产物文件"交接(正文 md、封面 png),互不耦合。这样任何一个环节挂了,替换掉它就行,不会整条线瘫痪。
二、环节①:AI 写稿
写稿不是"丢一句话给模型"就完事。稳定产出的关键是Prompt 模板化 + 输出校验。
2.1 固定一个高质量 Prompt 模板
以"科技 AI 新闻解读"类文章为例,我会给模型明确的角色、结构、风格要求:
你是一名科技编辑,请根据以下素材写一篇 CSDN 技术博客文章: 1. 标题:紧扣主题,含具体信息点(如模型名、数字),不超过 60 字 2. 开头:一句话点题,交代"为什么值得读" 3. 正文:分 3-5 个小节,每节一个小标题;技术点用列表或代码块呈现 4. 结尾:一句话总结 + 提示关注 5. 全文 1000-1500 字,口语化,避免空洞套话 素材:<粘贴新闻/资料>用 Python 调用时,把模板放进一个函数:
import openai def generate_article(material: str, prompt_template: str = PROMPT_TEMPLATE) -> str: """调用大模型生成文章正文,返回 Markdown 文本""" resp = openai.ChatCompletion.create( model="gpt-4o-mini", messages=[ {"role": "system", "content": "你是一名资深科技编辑。"}, {"role": "user", "content": prompt_template.format(material=material)}, ], temperature=0.7, max_tokens=2000, ) return resp["choices"][0]["message"]["content"] article = build_article(material="OpenAI 发布 GPT-6 Astra……")关键经验:
- 把"角色设定 + 结构约束 + 风格要求"写死在 Prompt 里,而不是每次重新口述
- 生成后必做校验:标题长度、是否含关键数字、段落数。校验不过就重试一次(最多 2 次),别让坏稿进入流水线
def validate_article(text: str) -> bool: """简单校验:有标题、有代码块或列表、字数达标""" if len(text) < 800: return False if not text.startswith("# "): return False return True三、环节②:自动配图
配图是很多人的痛点:不会设计,又不想用有版权风险的图。我的方案是直接调文生图 API 生成无文字科技风封面。
3.1 用图像生成接口,一行代码出封面
def gen_cover(topic: str, out_path: str = "cover.png") -> str: """按主题生成封面图,返回文件路径""" prompt = ( f"科技风封面,无任何文字。主题:{topic}。" "深蓝黑背景,冷光蓝与青色霓虹点缀,高细节,扁平插画+3D混合风格。" ) # 调用你的生图 API(如 Seedream / DALL·E / SD),保存到 out_path save_image(api_generate(prompt), out_path) return out_path要点:
- Prompt 里写死"无任何文字"——AI 生图最容易翻车的点就是画面里的文字乱码,直接避免
- 封面尺寸按平台要求(如 16:9 或 3:1),生成时指定,避免上传后被裁切
- 封面风格固定一套(深蓝科技风),形成账号视觉一致性,读者一眼认出你
3.2 为什么"无文字封面"更专业
平台封面位通常很小,一堆字上去反而看不清。纯视觉封面 + 标题文字由平台渲染,观感干净,点击率反而更高。这也是大厂科技号通用的做法。
四、环节③:定时发布
写稿和配图都在本地,发布必须上平台。这里有两个层次:
4.1 层次 A:简单方案——定时任务 + 浏览器自动化
用浏览器自动化(如 Playwright)模拟人工操作,把"打开编辑器→填标题→贴正文→传封面→选标签→点发布"这一串动作脚本化:
from playwright.sync_api import sync_playwright def publish(article: dict): with sync_playwright() as p: browser = p.chromium.launch(headless=True) page = browser.new_page() page.goto("https://editor.example.com") page.fill("#title", article["title"]) page.fill("#content", article["content"]) page.set_input_files("#cover", article["cover_path"]) page.click("button:has-text('发布')") browser.close()注意:这类脚本要处理登录态(Cookie 复用)、弹窗、网络延迟,属于"能用但需要维护"的方案。适合个人日常。
4.2 方案 B:平台官方 API(如果有)
如果平台提供 API 就更干净。CSDN 这类社区有开放能力的话,直接 POST 文章 JSON 即可,稳定性远高于浏览器模拟。有 API 优先用 API。
4.3 定时器:三个典型时段
# cron 表达式:分钟 小时 日 月 周 0 8 * * * # 每天 08:00 发晨间文 30 12 * * * # 每天 12:30 发午间文 0 20 * * * # 每天 20:00 发晚间文注意:发布频率要低于平台风控阈值(如每天 3 篇封顶),不要贪多,稳定才长久。
五、流水线运行与容错
流水线跑起来之后,要盯的不是"成功",而是"失败"。我的经验:
1.每一步都留日志:正文 md、封面 png、发布结果,全落盘到 `output/` 目录,随时可查
2.失败重试:写稿失败重试 2 次,配图失败换一个 prompt 再试,发布失败则标记为"待人工处理"
3.人工兜底:发布前留一个"人工确认"开关。特别涉及平台规则的内容,宁可慢一点
六、效果与心得
这套流水线跑下来,我的实际体感:
| 指标 | 自动化前 | 自动化后 |
|---|---|---|
| 每天产出 | 0-1 篇(看状态) | 3 篇稳定 |
| 每篇耗时 | 2-3 小时 | 30 分钟(审核+微调) |
| 配图一致性 | 无 | 固定风格 |
最大的收获不是"省时间",而是"建立了确定性"——内容生产从"靠灵感"变成"靠系统"。灵感会枯竭,系统不会。
写在最后
如果你也想跑这套流水线,从最简单的一步开始:先把你的发文流程拆成 3 个环节,再一个个自动化。不要一上来就想全自动,先做"半自动"(人点一下触发),跑顺了再全自动。
如果这篇对你有帮助,欢迎收藏。下一篇我准备写:智能体如何自己"联网检索"再回答,彻底告别胡说八道(附 RAG 实战),想看的评论区扣 1。