零成本自动化 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

筛选时选择”最多点赞”或”最新发布”,观察当前正在趋势中的内容。浏览时重点关注三个元素:

  1. 头 2 秒出现的文字叠加层——通常是最核心的钩子
  2. 开场白——一般是问句或令人震惊的陈述
  3. 重复出现的格式模式——例如”你做 X 的方式错了”、”Y 从不告诉你的 X 件事”、”我做了 X,结果如下”

3.2 下载视频以便深入分析

使用 SnapTik 或 SSSTik 下载无水印视频,便于后续分析:

  1. 复制 TikTok 视频链接
  2. 访问 SnapTik.app 或 sss.tiktok.ws
  3. 粘贴链接 → 下载(选择”无水印”版本)

将视频保存到本地,下一步将上传到 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 可能会返回类似以下的钩子:

  1. “我 6 个月存了 $5,000,只做了一件事” —— 数字 + 具体结果,制造好奇心
  2. “你存钱的方式从根本上就是错的” —— 负面框架,挑战现有认知
  3. “90% 的人到 30 岁还没学会这件事” —— 身份定位 + FOMO
  4. “为什么你的工资永远不够花?” —— 直接痛点提问
  5. “我放弃了这 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 扩展(推荐)

  1. 在 Chrome 安装 PinDown 扩展
  2. 打开 Pinterest 图片 → 点击 PinDown 图标 → 下载全分辨率版本

方法二:直接右键保存

  1. 点击图片打开全尺寸视图
  2. 右键 → “在新标签页打开图片”
  3. 右键图片 → “图片另存为”

方法三: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 密钥:

  1. 访问 postiz.com → 免费注册
  2. 进入 Settings → API Keys → 复制你的密钥

验证安装:

postiz integrations:list

此命令返回所有已连接的社交账号 JSON。如果看到空数组 [],说明需要先连接 TikTok。

8.2 连接 TikTok 到 Postiz

  1. 访问 postiz.com → Integrations → Add Channel → TikTok
  2. 用你的 TikTok 账号授权
  3. 再次运行 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 发布草稿:

  1. Postiz Dashboard → New Post
  2. 选择 TikTok → 添加文案并安排时间
  3. 在发布模式下选择 Notify(而非 Direct Post)
  4. 保存

在安排的时间,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 draftcontent_posting_method: "UPLOAD"
  • [ ] 设置 Postiz 为通知模式,在最佳时间手动从 App 发布

十二、一页速览(One-page Summary)

阶段 工具 输入 输出 耗时
灵感采集 TikTok + SnapTik 病毒视频 无水印视频文件 30 分钟
钩子提取 Claude Opus 幻灯片图片/文字 钩子库 + Pinterest 搜索词 20 分钟
素材获取 Pinterest 搜索词 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 算法变化了,这套流程还适用吗?
流程的核心逻辑——从已验证内容学习、批量生产、数据驱动优化——适用于任何算法平台。具体工具和执行细节可能需要随平台规则调整,但方法论具有持久价值。


最后的反思: 这套工作流最宝贵的不是节省的时间,而是它迫使你建立系统化的内容思维。当你开始用”钩子库”代替”临时想文案”,用”数据反馈”代替”我觉得这个会火”,你就从一个内容消费者变成了一个内容工程师。而工程师的优势,在于可预测、可复现、可优化的产出。