零成本自动化 TikTok 幻灯片内容创作:从灵感采集到定时发布的完整工作流
核心问题:如何在不依赖昂贵工具或 AI 生成图片的前提下,搭建一套可批量产出的 TikTok 幻灯片自动化流水线?
答案很简单:用已经验证的病毒式内容做灵感来源,从 Pinterest 获取免费高质量图片,通过脚本自动生成幻灯片,最后借助开源工具完成定时发布。整个流程可以控制在每周两小时内完成 30 条内容的批量生产,且几乎零成本。
一、为什么选择这套工作流?
核心问题:市面上已有那么多社交媒体工具,为什么还要自己搭一套自动化流程?
因为大多数创作者仍在手工完成从选题、设计到发布的每一个环节,这不仅耗时,而且难以保持一致性。更重要的是,主流工具如 Buffer、Later、Hootsuite 的免费版都有严格限制,而这套方案完全基于开源或免费服务,没有天花板。
这套方案的三个核心优势
| 维度 | 传统手动流程 | 本自动化工作流 |
|---|---|---|
| 成本 | Canva Pro + 付费排期工具,月费 $10-50 | 几乎为零,仅需 Claude 订阅(可选) |
| 规模 | 每天 1-2 条,难以批量 | 每周 30 条,2 小时内完成 |
| 数据驱动 | 凭感觉写文案,命中率低 | 从已验证的病毒视频提取钩子,成功率更高 |
反思: 我最初也尝试过用 Midjourney 生成图片,但发现成本累积很快,而且 AI 生成的”完美”图片反而缺少 Pinterest 上真实生活场景带来的共鸣感。真实用户的卧室、书桌、咖啡杯——这些才是 TikTok 上真正让人停下滑动的视觉元素。
二、整体工作流概览
核心问题:从零到发布,整个流程需要经过哪些步骤?
整个流水线分为五个阶段,形成一条清晰的内容生产线:
[TikTok 浏览采集] → [SnapTik 下载] → [Claude Opus 提取钩子]
↓
[Pinterest 挑选图片] → [Node.js Canvas 脚本生成 PNG 幻灯片]
↓
[Postiz Agent CLI 定时草稿]
↓
[TikTok App 草稿箱 → 在最佳时间点击发布]
每个环节都有明确输入和输出,确保你可以像工厂流水线一样批量运作,而不是每次都从零开始。
三、第一步:从 TikTok 挖掘已验证的钩子
核心问题:如何找到真正有效的开头文案,而不是凭空猜测?
钩子(Hook)是决定用户是否停下滑动的头 3 秒内容。与其自己绞尽脑汁,不如直接从已经爆火的视频里学习。TikTok 的算法已经帮你验证了哪些开头有效。
3.1 如何有目的地浏览 TikTok
打开 TikTok,搜索你所在领域的细分关键词。不同领域有各自的”Tok”标签:
-
学习类:StudyTok、BookTok -
健身类:GymTok、FitTok -
理财类:MoneyTok、FinanceTok
筛选时选择”最多点赞”或”最新发布”,观察当前正在趋势中的内容。浏览时重点关注三个元素:
-
头 2 秒出现的文字叠加层——通常是最核心的钩子 -
开场白——一般是问句或令人震惊的陈述 -
重复出现的格式模式——例如”你做 X 的方式错了”、”Y 从不告诉你的 X 件事”、”我做了 X,结果如下”
3.2 下载视频以便深入分析
使用 SnapTik 或 SSSTik 下载无水印视频,便于后续分析:
-
复制 TikTok 视频链接 -
访问 SnapTik.app 或 sss.tiktok.ws -
粘贴链接 → 下载(选择”无水印”版本)
将视频保存到本地,下一步将上传到 Claude 进行深度拆解。
四、第二步:用 Claude Opus 提取并生成钩子
核心问题:拿到病毒视频后,如何系统化地提取其中的文案规律,并批量生成可用的新钩子?
这是大多数人跳过的关键步骤。与其凭感觉写文案,不如让 Claude 分析病毒幻灯片的模式,然后基于这些模式为你生成新的钩子。
4.1 从幻灯片图片中提取钩子的提示词
将幻灯片图片(或 PDF/轮播图)上传到 Claude Opus,然后使用以下提示词:
分析这个 TikTok 幻灯片并:
1. 识别第一张幻灯片使用的主要钩子(关注文字叠加层、标题和视觉构图)
2. 解释这个钩子为什么有效(好奇心 / 痛点 / 惊喜感 / 共鸣感)
3. 拆解钩子结构(例如:数字 + 结果、负面框架、身份定位)
4. 为 [你的细分领域] niche 写 5 个类似的钩子变体
- 每个钩子不超过 10 个词
- 格式:问句 或 强有力的陈述句
- 避免使用"你知道吗"这类通用开头
以编号列表输出,每行一个钩子。
4.2 仅有文字内容时的提示词
如果你已经手动提取了幻灯片文字:
这是一个 [细分领域] 病毒式 TikTok 幻灯片的内容:
[在此粘贴内容]
任务:
- 从第一张幻灯片识别核心钩子
- 写 7 个类似幻灯片的钩子变体
- 每个钩子必须触发以下 3 种情绪之一:好奇心 / FOMO(错失恐惧)/ 共鸣感
- 每个钩子最多 8 个词
- 附上简短说明,解释每个钩子为什么有效
4.3 实际输出示例
以理财领域为例,Claude 可能会返回类似以下的钩子:
-
“我 6 个月存了 $5,000,只做了一件事” —— 数字 + 具体结果,制造好奇心 -
“你存钱的方式从根本上就是错的” —— 负面框架,挑战现有认知 -
“90% 的人到 30 岁还没学会这件事” —— 身份定位 + FOMO -
“为什么你的工资永远不够花?” —— 直接痛点提问 -
“我放弃了这 3 个习惯,存款翻倍” —— 具体数字 + 转变承诺
4.4 建立你的钩子库
将所有提取和生成的钩子保存到:
-
Obsidian(推荐,支持双向链接和图谱视图) -
Notion(适合团队协作) -
Google Sheets(最简单直接)
随着时间推移,你会积累一个钩子数据库。这意味着未来的内容创作会越来越快,命中率也会越来越高。
反思: 我花了三周时间积累第一批 200 个钩子,现在写一条新内容的钩子只需要 2 分钟。最宝贵的不是单个钩子,而是你开始看出”什么结构在什么时候有效”的直觉。
五、第二步 bonus:提取视觉风格与 Pinterest 搜索词
核心问题:如何确保找到的图片与文案情绪匹配,而不是随机搜索?
在 Claude 分析完幻灯片后,继续让它分析视觉风格,这样你进入 Pinterest 时就有了精确的搜索方向,而不是盲目尝试。
5.1 视觉分析与搜索词生成提示词
现在分析这个幻灯片的视觉风格:
1. 描述配色方案、光线和整体美学(暗调/情绪化、明亮/干净、奢华感、极简等)
2. 什么样的图片适合作为你刚写的那些钩子的幻灯片背景?
3. 给我 5 个具体的 Pinterest 搜索查询来找到这些图片
- 格式:简短关键词短语,2-4 个词
- 针对 Pinterest 搜索优化,而非 Google
5.2 实际输出示例
针对理财类幻灯片,Claude 可能建议:
-
暗调奢华:dark aesthetic desk -
极简理财:minimal finance flatlay -
咖啡工作:coffee workspace moody -
存钱视觉:money saving aesthetic -
办公场景:clean office setup
将这些关键词直接复制到 Pinterest 搜索框,结果会比泛泛搜索”finance”精准得多。
六、第三步:从 Pinterest 获取图片素材
核心问题:在哪里找到免费、高质量、且适合 TikTok 竖屏比例的图片?
Pinterest 是一个几乎无穷尽的免费图片库。与 AI 生成图片相比,Pinterest 上的真实摄影往往更容易引发共鸣,而且成本为零。
6.1 适合 TikTok 的图片标准
| 属性 | 建议 | 原因 |
|---|---|---|
| 比例 | 优先竖版 9:16 | TikTok 原生竖屏体验最佳 |
| 色彩 | 高对比度、 bold 色调 | TikTok 信息流竞争激烈,需要第一眼抓住注意力 |
| 文字 | 图片本身文字越少越好 | 你将在上面叠加自己的文字 |
| 氛围 | 与钩子情绪匹配 | 理财钩子配生活方式图,健身钩子配动作抓拍 |
6.2 使用 Claude 提供的搜索词
将在上一步获得的 5 个 Pinterest 搜索查询直接输入搜索框。每个查询针对特定视觉氛围而非宽泛主题,因此结果更一致、更符合品牌调性。
6.3 下载 Pinterest 图片的三种方法
方法一:PinDown Chrome 扩展(推荐)
-
在 Chrome 安装 PinDown 扩展 -
打开 Pinterest 图片 → 点击 PinDown 图标 → 下载全分辨率版本
方法二:直接右键保存
-
点击图片打开全尺寸视图 -
右键 → “在新标签页打开图片” -
右键图片 → “图片另存为”
方法三:Python 批量下载(面向全自动化的进阶方案)
# pinterest_downloader.py
import requests
from pathlib import Path
def download_image(url: str, filename: str, folder: str = "pinterest_images"):
Path(folder).mkdir(exist_ok=True)
response = requests.get(url, stream=True)
if response.status_code == 200:
with open(f"{folder}/{filename}.jpg", "wb") as f:
for chunk in response.iter_content(1024):
f.write(chunk)
print(f"Downloaded: {filename}")
# 粘贴 Pinterest 的直接图片链接
urls = [
"https://i.pinimg.com/originals/...", # 链接 1
"https://i.pinimg.com/originals/...", # 链接 2
]
for i, url in enumerate(urls):
download_image(url, f"image_{i+1:03d}")
6.4 按细分领域组织文件夹
pinterest_images/
├── finance/
├── fitness/
└── lifestyle/
这样当你切换到不同领域时,可以快速找到匹配的图片资源。
七、第四步:用 Node.js Canvas 自动生成幻灯片
核心问题:如何在不打开 Canva 的情况下,批量生成 1080×1920 的 TikTok 幻灯片?
通过 Node.js 脚本,你可以程序化地将钩子文字叠加到 Pinterest 图片上,导出标准尺寸的 PNG 文件。整个过程完全自动化,无需手动设计。
7.1 幻灯片标准结构
一个典型的 6 页 TikTok 幻灯片遵循以下结构:
| 页码 | 内容 | 作用 |
|---|---|---|
| 第 1 页 | 钩子 | 抓住注意力,决定用户是否继续滑动 |
| 第 2 页 | 问题 / 背景设定 | 建立共鸣,让读者觉得”这说的就是我” |
| 第 3 页 | 要点 1 | 第一个可操作建议 |
| 第 4 页 | 要点 2 | 第二个可操作建议 |
| 第 5 页 | 要点 3 | 第三个可操作建议 |
| 第 6 页 | 行动号召 (CTA) | 关注、收藏、评论、下载应用 |
7.2 环境准备
mkdir tiktok-slide-gen && cd tiktok-slide-gen
npm init -y
npm install canvas @napi-rs/canvas sharp
@napi-rs/canvas 是一个高性能的本地 Node.js Canvas 实现,不需要浏览器环境。
7.3 核心生成脚本
// generate-slides.js
import { createCanvas, loadImage, GlobalFonts } from '@napi-rs/canvas'
import { writeFileSync, mkdirSync } from 'fs'
import { join } from 'path'
// ─── 配置 ───────────────────────────────────────────────
const OUTPUT_DIR = './output'
const CANVAS_W = 1080
const CANVAS_H = 1920
const OVERLAY_OPACITY = 0.52 // 图片上的暗色遮罩,0-1
const OVERLAY_COLOR = '0,0,0' // 遮罩的 RGB 值
// 可选:加载自定义字体(TTF/OTF)
// GlobalFonts.registerFromPath('./fonts/Inter-Bold.ttf', 'InterBold')
// ─── 幻灯片定义 ──────────────────────────────────────────
// 每张幻灯片:{ imagePath, lines: [{ text, size, weight, y }] }
const slides = [
{
imagePath: './pinterest_images/finance/image_001.jpg',
lines: [
{ text: 'I saved $5k in 6 months', size: 88, weight: 'bold', y: 860 },
{ text: 'doing this one thing', size: 72, weight: 'normal', y: 970 },
],
},
{
imagePath: './pinterest_images/finance/image_002.jpg',
lines: [
{ text: 'Most people spend', size: 64, weight: 'normal', y: 820 },
{ text: 'before they save.', size: 64, weight: 'bold', y: 910 },
{ text: "Here's why that's a trap.", size: 56, weight: 'normal', y: 990 },
],
},
{
imagePath: './pinterest_images/finance/image_003.jpg',
lines: [
{ text: '01. Pay yourself first', size: 72, weight: 'bold', y: 900 },
{ text: 'Move 20% to savings on payday.', size: 52, weight: 'normal', y: 990 },
{ text: 'Before any expense hits.', size: 52, weight: 'normal', y: 1060 },
],
},
{
imagePath: './pinterest_images/finance/image_004.jpg',
lines: [
{ text: '02. Kill subscriptions', size: 72, weight: 'bold', y: 900 },
{ text: 'Audit every recurring charge.', size: 52, weight: 'normal', y: 990 },
{ text: 'Cancel what you forgot existed.', size: 52, weight: 'normal', y: 1060 },
],
},
{
imagePath: './pinterest_images/finance/image_005.jpg',
lines: [
{ text: '03. Use cash envelopes', size: 72, weight: 'bold', y: 900 },
{ text: 'Allocate per category, in cash.', size: 52, weight: 'normal', y: 990 },
{ text: 'When it runs out, it runs out.', size: 52, weight: 'normal', y: 1060 },
],
},
{
imagePath: './pinterest_images/finance/image_006.jpg',
lines: [
{ text: 'Save this post 🔖', size: 80, weight: 'bold', y: 860 },
{ text: 'Follow for more money tips', size: 56, weight: 'normal', y: 970 },
{ text: 'every week →', size: 56, weight: 'normal', y: 1050 },
],
},
]
// ─── 辅助函数 ──────────────────────────────────────────
function wrapText(ctx, text, maxWidth) {
const words = text.split(' ')
const lines = []
let current = ''
for (const word of words) {
const test = current ? `${current} ${word}` : word
if (ctx.measureText(test).width > maxWidth && current) {
lines.push(current)
current = word
} else {
current = test
}
}
if (current) lines.push(current)
return lines
}
async function generateSlide(slide, index) {
const canvas = createCanvas(CANVAS_W, CANVAS_H)
const ctx = canvas.getContext('2d')
// 1. 绘制背景图片,cover 模式填充
const img = await loadImage(slide.imagePath)
const scale = Math.max(CANVAS_W / img.width, CANVAS_H / img.height)
const drawW = img.width * scale
const drawH = img.height * scale
const offsetX = (CANVAS_W - drawW) / 2
const offsetY = (CANVAS_H - drawH) / 2
ctx.drawImage(img, offsetX, offsetY, drawW, drawH)
// 2. 暗色遮罩
ctx.fillStyle = `rgba(${OVERLAY_COLOR},${OVERLAY_OPACITY})`
ctx.fillRect(0, 0, CANVAS_W, CANVAS_H)
// 3. 绘制每行文字
const PADDING = 80
const MAX_TEXT_W = CANVAS_W - PADDING * 2
for (const line of slide.lines) {
ctx.font = `${line.weight} ${line.size}px sans-serif`
ctx.fillStyle = '#ffffff'
ctx.textAlign = 'center'
ctx.textBaseline = 'middle'
// 文字阴影
ctx.shadowColor = 'rgba(0,0,0,0.75)'
ctx.shadowBlur = 12
ctx.shadowOffsetY = 4
const wrapped = wrapText(ctx, line.text, MAX_TEXT_W)
const lineHeight = line.size * 1.2
wrapped.forEach((l, i) => {
ctx.fillText(l, CANVAS_W / 2, line.y + i * lineHeight)
})
}
// 4. 导出 PNG
mkdirSync(OUTPUT_DIR, { recursive: true })
const outPath = join(OUTPUT_DIR, `slide_${String(index + 1).padStart(2, '0')}.png`)
const buffer = canvas.toBuffer('image/png')
writeFileSync(outPath, buffer)
console.log(`✓ ${outPath}`)
}
// ─── 主程序 ─────────────────────────────────────────────
async function main() {
console.log(`Generating ${slides.length} slides...`)
for (let i = 0; i < slides.length; i++) {
await generateSlide(slides[i], i)
}
console.log(`\nDone → ${OUTPUT_DIR}/`)
}
main().catch(console.error)
7.4 运行脚本
node generate-slides.js
预期输出:
Generating 6 slides...
✓ output/slide_01.png
✓ output/slide_02.png
✓ output/slide_03.png
✓ output/slide_04.png
✓ output/slide_05.png
✓ output/slide_06.png
Done → output/
7.5 使用自定义字体
下载任意 TTF/OTF 字体(如 Inter Bold、Montserrat Black)并注册:
import { GlobalFonts } from '@napi-rs/canvas'
GlobalFonts.registerFromPath('./fonts/Montserrat-Black.ttf', 'MontserratBlack')
// 然后在 ctx.font 中使用:
ctx.font = `bold 88px MontserratBlack`
7.6 从 JSON 配置批量生成
与其每次修改脚本,不如用 JSON 文件驱动生成:
// slides-config.json
[
{
"imagePath": "./pinterest_images/finance/image_001.jpg",
"lines": [
{ "text": "I saved $5k in 6 months", "size": 88, "weight": "bold", "y": 860 },
{ "text": "doing this one thing", "size": 72, "weight": "normal","y": 970 }
]
}
]
在 generate-slides.js 顶部替换 slides 数组:
import { readFileSync } from 'fs'
const slides = JSON.parse(readFileSync('./slides-config.json', 'utf-8'))
现在内容团队只需编辑 slides-config.json,无需触碰代码。配合 Claude 生成的钩子列表,你就拥有了一条全自动化的内容生产线。
反思: 我第一次运行这个脚本时,6 张幻灯片在 3 秒内生成完毕。那一刻我意识到,内容创作的瓶颈从来不是”做图有多快”,而是”决策有多快”——确定钩子、选对图片、写好文案。脚本只是把已经做好的决定快速执行而已。
八、第五步:安装与配置 Postiz Agent CLI
核心问题:如何自动化地将生成的幻灯片上传到 TikTok 并安排发布时间?
Postiz 是你的分发指挥中心,处理定时发布、跨平台同步和互动自动化。最重要的是,自托管版没有发布数量限制。
8.1 安装与认证
# 全局安装
npm install -g postiz
# 设置 API 密钥(添加到 ~/.zshrc 或 ~/.bashrc 以持久化)
export POSTIZ_API_KEY=your_api_key_here
获取 API 密钥:
-
访问 postiz.com → 免费注册 -
进入 Settings → API Keys → 复制你的密钥
验证安装:
postiz integrations:list
此命令返回所有已连接的社交账号 JSON。如果看到空数组 [],说明需要先连接 TikTok。
8.2 连接 TikTok 到 Postiz
-
访问 postiz.com → Integrations → Add Channel → TikTok -
用你的 TikTok 账号授权 -
再次运行 postiz integrations:list,你会看到类似以下的集成 ID:
[
{
"id": "clx9abc123",
"provider": "tiktok",
"name": "My TikTok Account",
"picture": "https://..."
}
]
复制 id 值,后续的 posts:create 命令都需要用到它。
8.3 TikTok 核心 CLI 命令
# 上传幻灯片(PNG 文件),获取 CDN 链接
SLIDE1=$(postiz upload ./output/slide_01.png | jq -r '.path')
SLIDE2=$(postiz upload ./output/slide_02.png | jq -r '.path')
SLIDE3=$(postiz upload ./output/slide_03.png | jq -r '.path')
# 安排幻灯片发布——每张幻灯片用 -m 参数传递
postiz posts:create \
-c "I saved \$5k in 6 months doing this 💰 #personalfinance #moneytips" \
-m "$SLIDE1" -m "$SLIDE2" -m "$SLIDE3" \
-s "2025-04-21T09:00:00Z" \
-i "clx9abc123"
# 查看所有已安排的帖子
postiz posts:list
# 查看 TikTok 特定设置
postiz integrations:settings clx9abc123
每个命令都输出结构化 JSON,便于在脚本中解析或管道传输到其他工具。
8.4 从 schedule.json 批量安排整周内容
// batch-schedule.js
// 读取 schedule.json,上传每组幻灯片,通过 Postiz Agent CLI 安排发布
import { execSync } from 'child_process'
import { readFileSync } from 'fs'
const INTEGRATION_ID = process.env.TIKTOK_INTEGRATION_ID
const schedule = JSON.parse(readFileSync('./schedule.json', 'utf-8'))
for (const post of schedule) {
// 1. 上传每张 PNG 幻灯片,收集 CDN 链接
const slideFlags = post.slides.map(slide => {
const result = JSON.parse(execSync(`postiz upload ${slide}`).toString())
return `-m "${result.path}"`
}).join(' ')
// 2. 通过 Postiz Agent 安排幻灯片发布
execSync(
`postiz posts:create \
-c "${post.caption}" \
${slideFlags} \
-s "${post.scheduledAt}" \
-i "${INTEGRATION_ID}"`,
{ stdio: 'inherit' }
)
console.log(`✓ Scheduled: ${post.slides.length} slides at ${post.scheduledAt}`)
}
配合以下 schedule.json:
[
{
"slides": ["./output/mon_01.png", "./output/mon_02.png", "./output/mon_03.png", "./output/mon_04.png", "./output/mon_05.png", "./output/mon_06.png"],
"caption": "I saved $5k in 6 months doing this 💰 #personalfinance",
"scheduledAt": "2025-04-21T09:00:00Z"
},
{
"slides": ["./output/tue_01.png", "./output/tue_02.png", "./output/tue_03.png", "./output/tue_04.png", "./output/tue_05.png", "./output/tue_06.png"],
"caption": "Stop putting money in these 3 things 🚫 #moneytips",
"scheduledAt": "2025-04-22T09:00:00Z"
},
{
"slides": ["./output/wed_01.png", "./output/wed_03.png", "./output/wed_04.png", "./output/wed_05.png", "./output/wed_06.png"],
"caption": "The money trap nobody warns you about 😮 #finance",
"scheduledAt": "2025-04-23T09:00:00Z"
}
]
执行:
TIKTOK_INTEGRATION_ID=clx9abc123 node batch-schedule.js
一条命令,整周内容安排完毕。
九、第六步:发布为 TikTok 草稿以规避 spam 检测
核心问题:为什么自动发布可能导致账号被限流,以及如何安全地处理这个问题?
这是大多数自动化设置中被忽视的关键环节。如果直接通过 API 在固定时间从服务器 IP 推送内容,TikTok 的系统最终会将其识别为机器人行为,导致降权、隐形限制甚至封号。
9.1 为什么草稿模式更安全
API 直接发布时,TikTok 看到:
-
服务器 IP 发起发布请求 -
固定机械的发布时间间隔 -
发布前没有人类交互行为
从草稿发布时,TikTok 看到:
-
幻灯片静默进入你的 TikTok 草稿箱 -
你在最佳时间打开 App,预览草稿,点击发布 -
从 TikTok 的视角:一个真实用户在真实设备、真实网络上发布了内容 -
实际发布动作没有服务器指纹
这个改变对新账号或高频发布账号的账号健康度有显著影响。
9.2 混合工作流
[generate-slides.js] → PNG 幻灯片 (slide_01.png ... slide_06.png)
↓
[tiktok-draft-upload.js] → 通过 API 上传幻灯片到 TikTok 草稿箱
↓
[Postiz 通知模式] → 在最佳时间发送推送提醒
↓
[你打开 TikTok App] → 草稿箱 → 预览 → 点击发布
Postiz 管理你的编辑日历和提醒。实际发布来自你的设备,这对算法来说是一个干净的信号。
9.3 将 PNG 幻灯片上传到 TikTok 草稿箱
选项一:在 Postiz 内保存为草稿(保留在 Postiz,不发布)
使用 -t draft 标志:
# 先上传视频
RESULT=$(postiz upload video.mp4)
VIDEO_URL=$(echo "$RESULT" | jq -r '.path')
# 创建草稿帖子
postiz posts:create \
-c "Your caption #fyp" \
-m "$VIDEO_URL" \
-s "2026-04-20T10:00:00Z" \
-t draft \
-p tiktok \
--settings '{
"title": "Video title",
"privacy_level": "PUBLIC_TO_EVERYONE",
"duet": false,
"stitch": false,
"comment": true,
"autoAddMusic": "no",
"brand_content_toggle": false,
"brand_organic_toggle": false,
"video_made_with_ai": false,
"content_posting_method": "DIRECT_POST"
}' \
-i "tiktok-integration-id"
帖子将以草稿状态保留在 Postiz,不会发布,直到你更改状态。使用 postiz posts:status <id> --status schedule 将其加入发布队列,或使用 posts:delete 丢弃。
选项二:推送到 TikTok 收件箱(在 TikTok App 内显示为待处理草稿)
如果你希望帖子出现在 TikTok App 中作为待完成的草稿,设置 content_posting_method 为 "UPLOAD":
postiz posts:create \
-c "Caption shown when you open TikTok app" \
-m "$VIDEO_URL" \
-s "2026-04-20T10:00:00Z" \
-p tiktok \
--settings '{
"privacy_level": "SELF_ONLY",
"content_posting_method": "UPLOAD"
}' \
-i "tiktok-integration-id"
当 Postiz “发布”这个内容时,TikTok 会将视频投递到 App 内的收件箱。你打开 App → 点击通知 → 手动完成并发布。
9.4 将 Postiz 配置为通知模式
将 Postiz 设置为”通知”而非”自动发布”。Postiz 管理你的编辑日历,在安排的时间发送推送通知,提醒你从 App 发布草稿:
-
Postiz Dashboard → New Post -
选择 TikTok → 添加文案并安排时间 -
在发布模式下选择 Notify(而非 Direct Post) -
保存
在安排的时间,Postiz 发送移动端推送通知:”该发布你的 TikTok 了!”打开 App,找到等待中的草稿,点击发布。
反思: 我曾直接 API 发布两周,发现播放量从平均 5000 跌到 200。切换到草稿模式后,数据在三天内恢复到原有水平。平台对”看起来像机器人”的行为非常敏感,这不是阴谋论,而是可观测的事实。
十、常见问题排查
核心问题:遇到技术故障时如何快速定位和解决?
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
POSTIZ_API_KEY environment variable is required |
当前 shell 会话未导出密钥 | 永久添加:echo 'export POSTIZ_API_KEY=your_key_here' >> ~/.zshrc && source ~/.zshrc |
postiz integrations:list 返回 [] |
TikTok 账号尚未连接 Postiz | 访问 postiz.com → Integrations → Add Channel → TikTok 并授权 |
postiz upload 失败 |
API 密钥失效或文件过大 | 检查密钥有效性;对大型 PNG 使用 pngquant --quality=80-90 output/slide_*.png --ext .png --force 压缩 |
| 安排的帖子未发出 | 查看 postiz posts:list 的 status 字段 |
如果状态为 failed,通常是 TikTok OAuth 令牌过期或触发速率限制。重新授权并重新安排 |
重要提醒: 确保你的账号已经正常运营一段时间且状态健康,新账号直接高频自动化发布风险更高。
十一、实用摘要与操作清单
核心问题:如果想立即开始执行,最小可行步骤是什么?
快速启动清单
-
[ ] 在 TikTok 搜索你的细分领域关键词,筛选”最多点赞”,浏览 20-30 个视频 -
[ ] 用 SnapTik 下载 3-5 个病毒式幻灯片视频 -
[ ] 将幻灯片图片上传到 Claude Opus,运行钩子提取提示词 -
[ ] 保存生成的钩子到 Obsidian/Notion/Sheets,建立你的钩子库 -
[ ] 让 Claude 生成 5 个 Pinterest 搜索词 -
[ ] 在 Pinterest 搜索并下载 10-15 张竖版图片,按领域分类存放 -
[ ] 安装 Node.js 依赖: npm install canvas @napi-rs/canvas sharp -
[ ] 复制 generate-slides.js脚本,修改图片路径和文案 -
[ ] 运行 node generate-slides.js生成 PNG -
[ ] 安装 Postiz CLI: npm install -g postiz -
[ ] 注册 Postiz 账号,连接 TikTok,获取集成 ID -
[ ] 上传幻灯片到草稿(使用 -t draft或content_posting_method: "UPLOAD") -
[ ] 设置 Postiz 为通知模式,在最佳时间手动从 App 发布
十二、一页速览(One-page Summary)
| 阶段 | 工具 | 输入 | 输出 | 耗时 |
|---|---|---|---|---|
| 灵感采集 | TikTok + SnapTik | 病毒视频 | 无水印视频文件 | 30 分钟 |
| 钩子提取 | Claude Opus | 幻灯片图片/文字 | 钩子库 + Pinterest 搜索词 | 20 分钟 |
| 素材获取 | 搜索词 | 15-20 张分类图片 | 20 分钟 | |
| 幻灯片生成 | Node.js Canvas | 图片 + 文案 | 6 张 1080×1920 PNG | 5 分钟 |
| 发布安排 | Postiz Agent CLI | PNG + 文案 + 时间 | TikTok 草稿 / 定时通知 | 10 分钟 |
| 最终发布 | TikTok App | 草稿提醒 | 正式上线 | 2 分钟/条 |
总投入: 约 2 小时/周,可产出 30 条内容。
十三、FAQ:你可能还想问
Q1: 没有编程基础能用这套工作流吗?
可以。脚本部分可以请开发者朋友帮忙配置一次,之后你只需要编辑 JSON 文件和运行命令。Pinterest 下载和 Claude 提示词部分完全不需要代码。
Q2: 为什么不用 Canva 而要用 Node.js 脚本?
脚本的优势在于批量和一致性。当你需要一次生成 30 组幻灯片时,手动在 Canva 中操作会消耗大量时间。脚本将设计决策转化为可重复执行的代码。
Q3: Pinterest 图片有版权风险吗?
Pinterest 上的图片版权归原作者所有。建议优先选择明显为分享目的上传的图片,或考虑使用 Unsplash、Pexels 等明确标注可商用的图库作为替代来源。
Q4: Claude Opus 可以用其他 AI 替代吗?
可以。任何支持多模态(能分析图片)且具备足够上下文窗口的模型都可以完成钩子提取任务。关键是提示词结构,而非特定模型。
Q5: 为什么一定要从草稿发布,不能直接定时发布?
TikTok 对自动化行为有检测机制。从服务器 IP 直接发布容易被识别为机器人操作,导致限流。草稿模式让最终发布动作来自真实设备,显著降低风险。
Q6: 这套方案适合哪些细分领域?
理论上适用于任何视觉化内容领域:理财、健身、学习、生活方式、旅行、美食等。核心要求是内容可以通过”钩子 + 要点 + 行动号召”的幻灯片结构呈现。
Q7: 每周 30 条内容不会让观众疲劳吗?
关键在于质量而非数量。这 30 条中可能只有 5-10 条是你真正寄予厚望的”重点内容”,其余是测试不同钩子和视觉风格的实验。数据会告诉你哪些值得加大投入。
Q8: 如果 TikTok 算法变化了,这套流程还适用吗?
流程的核心逻辑——从已验证内容学习、批量生产、数据驱动优化——适用于任何算法平台。具体工具和执行细节可能需要随平台规则调整,但方法论具有持久价值。
最后的反思: 这套工作流最宝贵的不是节省的时间,而是它迫使你建立系统化的内容思维。当你开始用”钩子库”代替”临时想文案”,用”数据反馈”代替”我觉得这个会火”,你就从一个内容消费者变成了一个内容工程师。而工程师的优势,在于可预测、可复现、可优化的产出。
