AI 自动生成博客封面图:从脚本到实战

本文摘要

给博客文章配一张好看的封面图,过去是一件费时的事——找素材、调尺寸、压缩、上传、设为特色图片,一...

给博客文章配一张好看的封面图,过去是一件费时的事——找素材、调尺寸、压缩、上传、设为特色图片,一套流程下来至少 10 分钟。现在我用一个 Shell 脚本把这整个过程自动化了,一条命令搞定。

效果演示

输入一条命令:

blog-publish.sh --auto-prompt --post-id 127

脚本会自动完成三件事:

  1. 从 WordPress 读取文章标题
  2. 调用 LLM(GLM-4-Flash)生成英文图片提示词
  3. 调用智谱 GLM-Image 生成 1728×960 高清封面图
  4. 上传到 WordPress 并设为特色图片

技术方案

为什么选 Shell 脚本?

本来可以用 Python 写,但考虑到:

  • 服务器是宝塔环境,WP-CLI 是现成的
  • curl + jq + python3 在 macOS 和 Linux 都有
  • Shell 脚本方便 cron 定时任务调用
  • 依赖最少,维护成本最低

生图流程

整个流程分四步:

第一步:获取文章标题
通过 SSH 连接服务器,用 WP-CLI 读取文章标题:

wp post get 127 --field=post_title --path=/www/wwwroot/saytk.com --allow-root
# 输出: OpenClaw Gemini OAuth 登录失败修复指南

第二步:生成图片提示词
调用智谱 GLM-4-Flash(速度快、便宜),用精心设计的 system prompt 让模型输出适合生图的英文描述。关键规则包括:

  • 必须包含红色龙虾吉祥物(OpenClaw 品牌)
  • 深蓝科技背景风格
  • 现代扁平设计插画
  • 提示词不超过 80 词

第三步:生成图片
调用智谱 GLM-Image API,默认参数:

  • 尺寸:1728×960(16:9 适合博客封面)
  • 质量:HD
  • 水印:关闭

第四步:压缩 + 上传
用 pngquant 压缩(质量 65-85),通常能把 500KB+ 的 PNG 压到 100-150KB。然后 SCP 到服务器,WP-CLI 导入媒体库,更新 _thumbnail_id 元数据。

核心代码实现

JWT Token 生成(智谱 API 认证)

智谱的 API Key 格式为 id.secret,需要用 PyJWT 生成带 sign_type: SIGN 的 JWT:

generate_jwt_token() {
    local api_key="$1"
    python3 -c "
import jwt, time
parts = '$api_key'.split('.')
kid, secret = parts[0], parts[1]
now = int(time.time())
payload = {'api_key': kid, 'exp': now + 3600, 'timestamp': now}
print(jwt.encode(payload, secret, algorithm='HS256',
    headers={'alg': 'HS256', 'sign_type': 'SIGN'}))
"
}

调用 GLM-Image 生图

generate_glm_image() {
    local prompt="$1" size="$2" model="$3" outfile="$4"
    local token=$(generate_jwt_token "$ZAI_API_KEY")

    local body=$(python3 -c "
import json
d = {'model': '$model', 'prompt': '''$prompt''',
     'size': '$size', 'quality': 'hd', 'watermark_enabled': False}
print(json.dumps(d))")

    local resp=$(curl -s -m 120 -X POST \
        "https://open.bigmodel.cn/api/paas/v4/images/generations" \
        -H "Authorization: Bearer $token" \
        -H "Content-Type: application/json" \
        -d "$body")

    local url=$(echo "$resp" | python3 -c \
        "import json,sys; r=json.load(sys.stdin); \
         print(r['data'][0]['url'])")

    curl -s -m 30 -o "$outfile" "$url"
}

LLM 自动生成提示词

注意日志输出到 stderr,只有最终 prompt 走 stdout

auto_generate_prompt() {
    local post_id="$1"
    local title=$(ssh "$SERVER" \
        "wp post get $post_id --field=post_title \
         --path=$WP_PATH --allow-root")

    # 调用 GLM-4-Flash 生成英文提示词
    local resp=$(curl -s -X POST \
        "https://open.bigmodel.cn/api/paas/v4/chat/completions" \
        -H "Authorization: Bearer $token" \
        -d "$body")

    local prompt=$(echo "$resp" | python3 -c \
        "import json,sys; \
         print(json.load(sys.stdin)['choices'][0]\
               ['message']['content'])")

    echo "📝 生成提示词: $prompt" >&2   # 日志走 stderr
    echo "$prompt"                        # prompt 走 stdout
}

上传到 WordPress

upload_and_set_featured() {
    local img="$1" post_id="$2"
    local basename=$(basename "$img")

    # SCP 上传到服务器
    scp "$img" "${SERVER}:${TMPDIR_REMOTE}/"

    # WP-CLI 导入媒体库
    local media_id=$(ssh "$SERVER" \
        "wp media import ${TMPDIR_REMOTE}/${basename} \
         --porcelain --path=${WP_PATH} --allow-root")

    # 设为特色图片
    ssh "$SERVER" \
        "wp post meta update $post_id _thumbnail_id \
         $media_id --path=${WP_PATH} --allow-root"
}

支持的功能

功能 参数 说明
自动提示词 --auto-prompt 从文章标题自动生成图片描述
手动提示词 -p "prompt" 直接指定英文生图提示词
测试模式 --dry-run 只生成图片不上传,方便预览
批量处理 --from-file articles.csv CSV 文件批量处理多篇文章
模型选择 -m glm-image|cogview-4|kolors 支持多个生图模型
参考图 --ref-image URL Kolors 模型支持参考图

踩过的坑

1. JWT 认证

智谱 API 需要 JWT Token(不是简单的 Bearer Token),API Key 格式是 id.secret,需要用 PyJWT 生成带 sign_type: SIGN header 的 JWT。这个在官方文档里藏得比较深。

2. Bash vs Zsh 环境变量

脚本用 bash 执行,但 API Key 配置在 ~/.zshrc 里。macOS 默认 shell 是 zsh,但 cron 和其他自动化场景用的是 bash。解决方案是在脚本开头自动从 ~/.zshrc 加载环境变量。

3. Prompt 污染

auto_generate_prompt 函数的调试日志(文章标题、生成进度等)和最终 prompt 都输出到 stdout。用 $() 捕获时,日志也被拼进了 prompt 里,导致生成的图片混入了 emoji 和中文文字。修复方法:日志走 stderr>&2)。

4. cleanup 删文件

脚本用 trap cleanup EXIT 自动清理临时文件,但 --dry-run 模式下用户需要保留生成的图片预览。加个判断:DRY_RUN=true 时跳过清理。

成本分析

环节 模型 单价 单篇成本
提示词生成 GLM-4-Flash 免费额度 ≈ ¥0
图片生成 GLM-Image HD ≈ ¥0.10/张 ≈ ¥0.10
图片压缩 pngquant(本地) 免费 ¥0

单篇文章封面图总成本约 ¥0.10,完全可以忽略不计。

效果展示

以下是几张自动生成的博客封面图:

  • 默认测试图:龙虾吉祥物 + 全息屏幕 + 指挥中心
  • OAuth 修复文章:龙虾 + 笔记本电脑 + 400 错误图标

风格统一,尺寸一致,质量稳定。唯一的小问题是 AI 偶尔会把龙虾画得不太像龙虾,但整体效果已经完全够用。

后续优化方向

  • 支持更多生图模型(Flux、DALL-E 等)
  • 添加风格模板(科技风、商务风、手绘风等)
  • 与 WordPress 定时发布联动,自动为即将发布的文章生成封面
  • 支持文章内容分析(不只是标题)来生成更精准的封面

总结

一个 200 行的 Shell 脚本,把「写文章 → 找封面 → 上传」这个重复性工作从 10 分钟压缩到了 30 秒。AI 生图 + API 自动化的组合,在内容创作场景下的提效是实打实的。

0 0 投票数
文章评级
订阅评论
提醒
guest

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理

0 评论
最多投票
最新 最旧
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x