PHP 协同 n8n 实现跨平台分发:从 50万+ 文章库到 YouTube/TikTok 的自动化内容闭环

各位好,我是你们的资深老码农,今天咱们不聊那些虚头巴脑的架构模式,咱们聊聊怎么让死气沉沉的文字“活”过来。

想象一下,你有一个仓库,里面堆满了50万篇文章。这听起来是不是很爽?像是一个守着金山银山的暴发户。但实际上,这50万篇文章大部分都在你的数据库里长毛了。没人看,没人在乎,它们就像是被遗忘在阁楼里的旧报纸,唯一的用途就是垫桌脚。

但今天,我要带你们干一件酷毙了的事:把这50万份“旧报纸”,通过自动化流,撕碎、重组成短视频,扔进 YouTube 和 TikTok 的海洋里。

我们的工具组合很简单:PHP(那个脾气有点倔但干活极稳的老大哥)n8n(那个长着人脸、说话流利、不需要五险一金的数字实习生)

别眨眼,这场技术大秀马上开始。


第一部分:现状——数据的坟墓

我们先看看这个“坟墓”长什么样。

50万篇文章,如果是纯文本,大概能铺满半个足球场。每篇文章都有一个标题、正文、标签、发布时间。我们怎么把这些静态的东西变成动态的视频脚本?

如果靠人工?别逗了,那得从明朝写到2099年。你需要一个流水线,一个能把“文字”和“视频”强行拉郎配的流水线。

我们的策略是:PHP 负责从数据库里把“尸体”挖出来,清洗一下,打个包;然后把包扔给 n8n;n8n 接过包,里面的内容被 AI 魔法棒一挥,变成了脚本;最后,n8n 拿着脚本,像递情书一样递给 YouTube 和 TikTok 的 API。

听起来很复杂?其实不然,代码就是这么诚实。

1. PHP 端的数据抓取与清洗

首先,我们需要一个 PHP 脚本,定期去把那50万条数据里最“活跃”的(比如最近更新的,或者阅读量高的)挑出来。咱们写个简单的 CLI 脚本,别搞那些 MVC 的框架了,太重,咱们要的是轻装上阵。

<?php
// grab_articles.php
require 'vendor/autoload.php';

// 模拟数据库连接,别在生产环境直接这么写,拜托了
$pdo = new PDO('mysql:host=localhost;dbname=content_db', 'user', 'pass');

// 核心逻辑:获取待处理文章
$sql = "SELECT id, title, content, slug, created_at 
        FROM articles 
        WHERE published = 1 
        ORDER BY created_at DESC 
        LIMIT 100"; // 每次只抓100条,别把服务器搞崩了

$stmt = $pdo->query($sql);
$articles = $stmt->fetchAll(PDO::FETCH_ASSOC);

// 数据清洗工厂
$data = [];
foreach ($articles as $article) {
    // 去除 HTML 标签,只留干货
    $cleanContent = strip_tags($article['content']);

    // 截取前 300 个字作为“钩子”,这是短视频的灵魂
    $hook = mb_substr($cleanContent, 0, 300, 'UTF-8') . '...';

    $data[] = [
        'article_id' => $article['id'],
        'title' => $article['title'],
        'hook' => $hook,
        'slug' => $article['slug'],
        'timestamp' => time()
    ];
}

// 转成 JSON,准备给 n8n 送去
echo json_encode($data, JSON_UNESCAPED_UNICODE);

看,这段代码只有 30 行,但它干了三件事:查询、清洗、格式化。这就是 PHP 的拿手好戏,它不漂亮,但非常实用,就像你衣柜里那件洗得发白的T恤。

第二部分:n8n——那个不知疲倦的实习生

好了,PHP 把数据打包好了,现在怎么办?把它发到微信群里?发给隔壁老王?不,我们要发给 n8n

n8n 是一个开源的自动化工具,你可以把它理解为“可编程的 Zapier”。它的界面长这样:左边是输入,中间是各种怪异的图标,右边是输出。

1. 设置 Webhook 触发器

首先,我们需要一个入口。我们把这个 PHP 脚本通过 cron 或者简单的定时任务执行,然后把输出扔进 n8n 的 Webhook 里。

在 n8n 里,新建一个 Workflow,添加一个 Webhook 节点。
方法选 POST,路径随便写,比如 /webhook/content-pipeline

接下来,我们就在这个 Webhook 后面挂上我们的自动化流程。

2. AI 魔法棒:OpenAI 节点

光有个标题和摘要不行,视频脚本需要结构。我们需要 AI 帮我们把一段干巴巴的文字,变成一个 60 秒的视频脚本。

在 n8n 里,加一个 OpenAI 节点。
Model 选 gpt-4o-mini 或者 gpt-3.5-turbo,便宜又好用。
System Prompt 怎么写?这可是个技术活。

{
  "role": "system",
  "content": "你是一个精通短视频制作的剧本编剧。请根据以下文章标题和摘要,生成一个抖音/TikTok 风格的短视频脚本。要求:n1. 生成 3 个不同风格的标题(吸引眼球型、疑问型、干货型)。n2. 生成一个 60 秒的视频口播文案,分为开头 5 秒钩子、中间干货输出、结尾引导。n3. 输出格式必须是纯 JSON,包含 title, hashtags, script。nn输入数据:{{ $json.title }} - {{ $json.hook }}"
}

当 n8n 接收到 PHP 扔过来的数据时,这个 AI 节点就会像变魔术一样,吐出结构化的 JSON。

3. 决策节点:谁是主角?

现在我们有了脚本,是发 YouTube 还是 TikTok?这时候就需要 Decision 节点来掌舵了。

我们可以根据文章的标签来决定。比如,如果标签里有 youtube,就往 YouTube 发;如果是 tiktok,就往 TikTok 发。

// Decision 节点的逻辑代码
return $json.tags.some(tag => tag === 'youtube');

n8n 会自动解析这个 JS 代码。如果为 true,数据流向红色的 YouTube 分支;否则流向蓝色的 TikTok 分支。

第三部分:YouTube —— 那个挑剔的富豪老板

YouTube 的 API 比较复杂,你需要申请 Google Cloud 的凭证。这过程比跟丈母娘谈条件还难。不过,一旦你拿到了 Client IDClient Secret,我们就可以开始干活了。

1. 准备视频文件

YouTube 需要视频文件。我们怎么生成视频文件?这时候,纯 PHP 可就有点吃力了。我们需要用 FFmpeg 把文字变成视频。

n8n 提供了一个 Execute Command 节点。我们可以在服务器上安装 FFmpeg,然后让 n8n 去调用它。

或者,更高级一点,我们可以调用一个第三方服务(比如 Runway 或 HeyGen)的 API,上传文字,生成 AI 数字人视频。

假设我们在服务器上已经用 PHP 生成好了个 .mp4 文件,路径是 /videos/12345.mp4。n8n 需要把这个文件传给 YouTube。

2. 上传视频

在 YouTube 分支里,添加一个 HTTP Request 节点。

  • Method: POST
  • URL: https://www.googleapis.com/upload/youtube/v3/videos?uploadType=multipart&part=snippet,status
  • Headers:
    • Authorization: Bearer YOUR_ACCESS_TOKEN
    • Content-Type: multipart/related

Body 部分,需要用 multipart/form-data 的格式,包含视频文件和元数据。

{
  "part": [
    "snippet",
    "status"
  ],
  "resource": {
    "snippet": {
      "title": "{{ $json.script.title }}",
      "description": "{{ $json.script.script }}",
      "tags": "{{ $json.script.hashtags }}",
      "categoryId": "22" // 主题:科技
    },
    "status": {
      "privacyStatus": "public",
      "selfDeclaredMadeForKids": false
    }
  },
  "media": {
    "body": "文件流",
    "mimeType": "video/mp4",
    "filename": "video.mp4"
  }
}

注意这里的 media.body,n8n 处理文件上传比较麻烦,很多时候需要配合 ReadBinaryFile 节点。这部分代码量稍微大一点,你要确保文件确实被读取到了。

3. 处理上传后的回调

上传成功后,YouTube 会返回一个 videoId。我们需要把这个 ID 存回我们的数据库,或者发送到 Slack 通知一下“老板,视频发好了”。

第四部分:TikTok —— 那个喧闹的夜店DJ

TikTok 的 API 相比 YouTube 来说,更像是一个喜欢捉迷藏的顽童。它的“创建发布” API 界面非常友好,甚至可以在网页上直接操作,但如果你想通过 API 程序化操作,那难度系数直接爆表。

好消息是,我们不需要用官方的 TikTok API 来上传。我们要用“曲线救国”的方法。

1. 构造 TikTok 的请求

TikTok 的上传接口通常是 POST 到一个特定的 API 端点。你需要准备好 Access Token(通过 TikTok Pixel 或者登录账号获取的)。

我们在 n8n 里再加一个 HTTP Request 节点。

  • URL: https://open.tiktokapis.com/v2/post/video/
  • Method: POST

Body 结构大致如下:

{
  "post": {
    "video": {
      "source": "FILE_URL", // 或者 UPLOAD
      "video_id": "上传后返回的视频ID" 
    },
    "post_text": "{{ $json.script.title }}",
    "hashtags": [
      {"id": "1234567890"},
      {"id": "9876543210"}
    ]
  }
}

这里有个坑:TikTok 对视频格式、时长、分辨率要求极其严格。如果你的视频是 16:9 的,TikTok 可能会把它裁剪成 9:16 的,或者直接拒绝。

所以,在 PHP 阶段,我们最好把所有文章都处理成标准的 9:16 竖屏视频。我们可以在 PHP 脚本里调用 FFmpeg,把宽屏视频“压扁”:

ffmpeg -i input.mp4 -vf "scale=-2:1080" -c:a aac output.mp4

这行命令的意思是:强制高度为 1080,宽度自动计算(保持比例,自动设为-2以保证能被2整除),并且重新编码音频为 AAC。

2. 发布状态同步

TikTok 的发布往往不是即时的。你需要轮询一下发布状态。n8n 里可以用 Wait 节点,等 30 秒,然后查一下 API 看看视频是不是被审核通过了。

第五部分:那个“AI味”的闭环

现在,我们把整个流程串起来:

  1. PHP 脚本:从数据库拉取 50 万条数据,清洗,生成短文案,转码视频。
  2. Cron Job:每分钟触发一次 PHP 脚本。
  3. n8n Webhook:接收数据。
  4. n8n AI 节点:生成标题和脚本。
  5. n8n Decision:分流。
  6. n8n HTTP Request:上传到 YouTube/TikTok。
  7. n8n Database/Email:记录成功日志,发邮件给主人。

第六部分:那些年我们踩过的坑

作为专家,我必须告诉你们,这个系统跑起来不会像诗一样顺滑,它会像一锅乱炖。

坑一:视频转码太慢
如果你用 PHP 调用 FFmpeg,那进程会卡住。n8n 最好挂载在 Docker 容器里,用 Docker 的多阶段构建来处理视频。或者,直接把视频转码任务扔到后台队列(比如 Redis + Supervisor),别让主流程等着。

坑二:n8n 的并发限制
n8n 默认是单线程处理工作流的。如果有 50 万篇文章排队,n8n 可能会累吐血。你需要修改 n8n.config.js,把 concurrency 设置大一点,比如 concurrency: 5。这就像让你的实习生多开几个窗口,多干活。

坑三:API 限流
YouTube 和 TikTok 都有请求频率限制。如果你每分钟请求 100 次,马上就会被封 IP。你需要加一个 Wait 节点,在请求之间休息一下。比如请求一次,就 Wait 2 秒。

坑四:n8n 的 Secret 管理是个灾难
千万别把你的 API Key 写在 n8n 的 JSON 文件里!那就像你在公司群里发银行卡密码一样愚蠢。用 n8n 自带的 Secrets 功能。在 n8n 里右键点击 Secrets -> Add,然后在使用的地方用 {{ $secrets.GOOGLE_CLIENT_ID }} 这种变量引用。PHP 脚本里如果也要用密钥,那就得用环境变量。

第七部分:PHP 与 n8n 的协作艺术

为什么不用纯 n8n?为什么还要 PHP?

因为 PHP 在处理 50 万条数据的批量操作、复杂的正则匹配、以及底层文件系统的 IO 操作时,效率更高。PHP 是 C 语言的扩展,它是底层工程师;n8n 是高级工程师,它负责设计流程。

想象一下,n8n 是那个画图纸的,PHP 是那个搬砖头的。图纸画好了,n8n 指挥 PHP 去搬砖,PHP 搬完砖告诉 n8n:“砖搬好了,拿去用”。

这就是协同效应。

第八部分:从 50 万到 0 的执行路线图

别被“50万”这个数字吓尿了。我们不要一口气吃成个胖子。

第一阶段(1-100):
手动挑选 100 篇最好的文章。
写好 PHP 抓取脚本。
搭建好 n8n Workflow。
手动触发一次。
如果成功了,那个瞬间,你会觉得所有的代码都是甜的。

第二阶段(100-10,000):
调整 FFmpeg 参数,保证视频画质。
优化 AI 提示词,让标题更吸引人。
增加错误处理机制,万一某个 API 挂了,系统不会崩溃,而是记录下来稍后重试。

第三阶段(10,000-500,000):
这就是自动化闭环的威力。这时候,你的 50 万篇文章正在变成 50 万个视频。
你需要监控系统的性能。
你需要关注 YouTube 的浏览量,TikTok 的点赞数。
如果哪个视频火了,恭喜你,你的自动化系统里诞生了一台印钞机。

结语(真正的技术总结)

你看,实现这个闭环,你不需要掌握 3D 渲染,也不需要懂复杂的机器学习模型。你只需要掌握两样东西:

  1. 如何把数据从 A 点搬到 B 点(PHP)。
  2. 如何让机器听懂你的指令(n8n)。

技术不是用来炫技的,技术是用来偷懒的。把重复、枯燥、机械的劳动交给机器,人类应该去做更有创造力的事情——比如去想下一个标题怎么写才更抓人眼球。

代码如诗,行云流水。愿你的 50 万篇文章,早日变成百万级的流量!咱们下期见,别忘了把你的 API Key 收好!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注