给博客文章配一张好看的封面图,过去是一件费时的事——找素材、调尺寸、压缩、上传、设为特色图片,一...
给博客文章配一张好看的封面图,过去是一件费时的事——找素材、调尺寸、压缩、上传、设为特色图片,一套流程下来至少 10 分钟。现在我用一个 Shell 脚本把这整个过程自动化了,一条命令搞定。
效果演示
输入一条命令:
blog-publish.sh --auto-prompt --post-id 127
脚本会自动完成三件事:
- 从 WordPress 读取文章标题
- 调用 LLM(GLM-4-Flash)生成英文图片提示词
- 调用智谱 GLM-Image 生成 1728×960 高清封面图
- 上传到 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 自动化的组合,在内容创作场景下的提效是实打实的。
