OpenClaw & n8n社交媒体自动化:带人工审批的发布流
- Xuebin Wei

- 6月7日
- 讀畢需時 10 分鐘
每次发布新的 YouTube 教程时,你是否都会陷入复制链接、提取标题、撰写描述,然后再手动交叉发布到各个社交网络的繁琐循环中?今天,我们将彻底解决这个问题。在这篇详尽的教程中,我们将使用 OpenClaw 作为我们的自然语言智能体交互界面,n8n 作为编排引擎,Gemini 负责创意起草,以及一个 Telegram 管理员机器人作为我们的绝对检查点,来构建一个实用的、企业级的 n8n社交媒体自动化 工作流 (n8n social media automation) 工作流。

正如上方架构图所示,整个工作流形成了一个无缝的闭环管道。当你通过 Telegram 发送请求时,OpenClaw 会理解你的意图,选择合适的 Skill,并向 n8n 执行 POST Webhook 调用。
随后,n8n 会自动提取 YouTube 元数据,提示 Gemini 起草一篇专业的推广帖子,并暂停以等待你的人工审批。只有在你审阅草稿并点击“Approve(批准)”后,帖子才会被推送到你的社交媒体平台,同时最终的发布状态会直接路由返回给你。
1. API 授权生态:为什么选择 LinkedIn 个人账号?
在深入搭建工作流之前,必须了解社交平台的现代 API 环境。不同的渠道在自动发布和个人资料集成方面施加了截然相反的限制。
你可以通过下方的交互式组件,探索 X (Twitter)、Facebook 和 LinkedIn 在准入门槛和凭证规则上的显著差异:
基于上方展示的授权生态,本教程的战略边界定义如下:
X (Twitter): 虽然技术上可行,但官方 X API 已经转为付费使用模式。为了确保本实现方案的可复现性,X 被排除在我们的活跃环境之外。
Facebook: Meta 使得向 Facebook 公共主页(Page)发布内容在审批通过后相对顺畅,但严格限制对个人主页(Profile)时间线进行无人值守的自动化操作。
LinkedIn: 创建一个 LinkedIn 开发者应用非常容易上手。它允许使用标准的会员 OAuth2 授权流程进行简化的个人账号发布,无需复杂的应用审核,这使其成为本教程的完美焦点。
2. 核心架构:人机协同 (Human-in-the-Loop) 自动化
在这个架构中,我们的指导性运营原则非常简单:AI 负责处理繁琐的后台重复迭代,而人类则保留对最终执行的绝对控制权。任何推广文案都绝不会在没有明确的人工签字确认的情况下被盲目部署。
3. 环境准备与安全接入 (Tailscale Serve)
为了让外部 Webhook(例如来自 LinkedIn 的 OAuth 重定向回调或来自你虚拟机的入站触发请求)安全地访问你内部的 n8n 实例,我们使用 Tailscale Serve 提供一个加密的 HTTPS 隧道。
假设你的 Google Cloud 虚拟机已经在端口 8443 托管了 OpenClaw 仪表盘,我们将追加端口 8444 以将流量安全地转发到你本地的 n8n 服务(在端口 5678 本地运行)。在你的主机终端执行以下命令:
# 1. Inspect existing Tailscale ingress configurations
tailscale serve status
# 2. Verify that local n8n is alive and listening
curl -I http://127.0.0.1:5678
# 3. Expose port 8444 over HTTPS and reverse proxy it to local n8n in the background
sudo tailscale serve --bg --https=8444 http://127.0.0.1:5678
# 4. Confirm the new secure route is registered alongside your dashboard
tailscale serve status

映射验证无误后,更新你的 n8n 工作区环境变量文件 (.env) 以映射新的安全外部路由。
⚠️ 关键步骤: 千万不要盲目复制下方代码块中的 URL。你必须将 YOUR-MACHINE-NAME.ts.net 替换为你实际的 Tailscale 域名 URL,你可以在刚才运行的 tailscale serve status 命令的输出中找到它。
N8N_EDITOR_BASE_URL=https://YOUR-MACHINE-NAME.ts.net:8444
WEBHOOK_URL=https://YOUR-MACHINE-NAME.ts.net:8444通过重启容器来应用更改:
docker compose restart4. LinkedIn 开发者应用设置与 n8n 凭证
在构建工作流之前,我们需要建立 n8n 与 LinkedIn 之间的连接。虽然我们要发布到个人主页,但 LinkedIn 需要一个开发者应用来生成必要的 API 凭证。
请严格按照以下步骤操作以获取你的授权:
第 1 步:创建 LinkedIn 公司主页 (Company Page): 要创建 LinkedIn 应用,你必须首先拥有一个 LinkedIn 公司主页。如果你没有,创建一个是完全免费的。
第 2 步:创建开发者应用: 前往 LinkedIn 开发者门户并创建一个新应用。为其命名、上传 Logo,并将其与你的公司主页关联。
第 3 步:申请产品访问权限: 导航至“Products”(产品)选项卡,申请两个特定产品的访问权限:Share on LinkedIn 和 Sign In with LinkedIn using OpenID Connect。这两个申请应该会立即获批。
第 4 步:配置 n8n 回调 URL: 回到你的 n8n 仪表盘,前往 Credentials(凭证),搜索 LinkedIn OAuth2 API。n8n 会为你提供一个 OAuth 重定向(回调)URL。复制此 URL,返回你 LinkedIn 开发者门户中的 Auth 选项卡,将其粘贴到 authorized redirect URLs 部分,然后点击保存。
第 5 步:连接你的账号: 在同一个 LinkedIn Auth 页面上,复制你新生成的 Client ID 和 Client Secret。将这些粘贴回你的 n8n 凭证设置中。
重要提示: 请务必关闭 n8n 中的“Organization Support”(组织支持)开关,因为我们要发布到个人账号,而不是管理一个组织主页。最后,点击“Connect my account”(连接我的账号)并使用你的个人 LinkedIn 凭证登录。连接后,你的授权就可以使用了。
5. 搭建 n8n社交媒体自动化 引擎
我们不需要从零开始搭建一个全新的管道,而是将在我们上一期教程中创建的 YouTube 元数据工作流的基础上进行扩展。本节将一步步引导你配置完整的、企业级的 n8n 社交媒体自动化 引擎。
5.1 复制并清理基础工作流
首先,复制你现有的 YouTube 元数据工作流,并将其明确重命名为 social-publishing-human-approval。对于这个特定的自动化任务,我们将删除之前使用的任何多余的下游数据库或导出节点。我还建议在我们构建和测试新模块时,暂时断开 Webhook 触发节点的连接。
你的基础布局现在应该干净地执行以下四个初始步骤: Edit Fields -> get video id -> request meta -> clean data -> build_document_text。

5.2 提示 Gemini 生成结构化草稿
我们的下一步是调用大语言模型来生成我们的推广文案。添加一个基础的 LLM 文本节点,命名为 gemini draft,选择 Message a Model 操作。我们部署高性价比的 Gemini 2.5 Flash 模型。
为了确保 n8n 能够通过程序解析响应,请将以下提示词粘贴到节点参数中,以强制执行严格的纯 JSON 返回格式,不带 markdown 代码围栏:
Create a concise LinkedIn promotional post for the following YouTube tutorial.
Return only valid JSON using exactly this structure:
{
"linkedin": {
"post_text": "..."
}
}
Requirements:
- Use a professional but natural tone.
- Clearly explain the tutorial topic.
- Include the exact YouTube video URL.
- Keep the post concise.
- Do not use Markdown code fences.
- Do not add any text before or after the JSON.
- Use the exact video URL provided below. Do not replace it with a playlist URL.
YouTube tutorial information:
{{ $json.document_text }}
Exact video URL:
{{ $json.url }}

5.3 清洗与解析 LLM 输出
在 Gemini 下游直接引入一个名为 “parse LinkedIn draft JSON” 的 JavaScript Code 节点。此处理程序确保在将 JSON 字符串解析为原生对象变量之前,剥离任何残留的格式或空格:
const rawText = $json.content?.parts?.[0]?.text;
if (!rawText) {
throw new Error('Gemini response text is missing');
}
const cleanedText = rawText
.replace(/^```json\s*/i, '')
.replace(/^```\s*/i, '')
.replace(/\s*```$/i, '')
.trim();
let parsed;
try {
parsed = JSON.parse(cleanedText);
} catch (error) {
throw new Error(`Unable to parse Gemini JSON response: ${error.message}`);
}
if (!parsed.linkedin?.post_text) {
throw new Error('Missing linkedin.post_text in Gemini response');
}
return [
{
json: parsed,
},
];
5.4 配置 Telegram 审批节点
为了维持对我们发布管道的人工控制,我们引入了一个 Telegram 节点。这作为我们“人机协同 (human-in-the-loop)”的检查点。
添加一个 Telegram 节点,将 Resource(资源)设置为 Message,并将 Operation(操作)更改为 Send and Wait for Response。因为这是你首次在 n8n 中使用 Telegram,你必须配置你的凭证:
Bot Token: 打开 Telegram,前往 BotFather,选择你的管理员机器人,并复制长串的 HTTP API token。将其直接粘贴到 n8n 的凭证字段中。
Chat ID: 在参数部分输入你个人的、唯一的纯数字 Telegram Chat ID,以确保机器人准确知道该向哪个私人对话发送消息。
接下来,将该节点的其余参数完全设置如下:
Response Type: Approval
Type of Approval: Approve Only
Approve Button Label: ✅ Approve
Message Text:
Please review the generated social media post.
Post draft:
{{ $json.linkedin.post_text }}
This post will be published to:
- LinkedIn personal account
Approve publishing?

5.5 条件路由与 LinkedIn 发布节点
为了根据你的手动响应路由工作流,在 Telegram Approval 节点之后直接插入一个 IF 节点。该节点在触发外部 API 之前,评估是否满足了审批标准。
使用以下逻辑配置 IF 节点条件参数:
添加一个新的条件路由规则。
设置主要变量以评估上一步的布尔输出:{{ $json.data.approved }}。
选择比较运算符为 is true。
接下来,从 IF 节点的 true 分支拖动一条连接到一个原生的 LinkedIn 节点。在 LinkedIn 节点配置面板中,在操作字段下选择 Create a post,然后将 “Post As” 参数设置为 Person。一旦你经过身份验证的凭证处于活动状态,你的个人账号名称将自动填充该工作区。
⚠️ 上下文替换陷阱 (The Context-Swap Trap): 当你与 Telegram 审批卡片交互时,n8n 会更新实时的传入数据集,使其仅包含执行确认元数据(例如,{"approved": true})。如果你只是简单地将简写变量 {{ $json.linkedin.post_text }} 传递到 LinkedIn 文本容器中,它将返回一个空字符串并失败。
为了绕过这种状态重置,你必须实现 n8n 的历史跨节点回溯语法,以明确地从你的解析模块中提取结构化文案:
{{ $('parse LinkedIn draft JSON').first().json.linkedin.post_text }}
5.6 重新连接并发布 Webhook
随着下游发布逻辑得到验证,你现在可以最终确定自动化画布以进行实时生产部署:
删除开发阶段使用的任何临时模拟或静态测试输入。
将你的主 Webhook 触发节点 重新连接到编排链的开头(直接链接到 Edit Fields 节点)。
在成功的 LinkedIn 帖子执行模块之后,立即放置一个 Respond to Webhook 节点。将 Respond With 属性设置为 All Incoming Items,以将实时平台交易 URN 代码返回给初始调用者。
最后,打开你的主 Webhook 节点配置,将 URL 路径从随机的系统生成 UUID 更改为完全一致的 social-publishing-human-approval,然后点击 n8n 编辑器右上角的 Publish 按钮以激活生产路由。

6. OpenClaw Skill 集成
一旦你的后端 n8n 自动化引擎发布并在端口 8444 上监听流量,你就可以将其无缝集成到你 Telegram AI 智能体的 skill 存储库中。访问你的 OpenClaw 管理控制台,激活 Skill Creator 实用工具,并提交以下详尽的配置提示词。
⚠️ 关键合规注意事项: 不要盲目复制下面的文本。在提交之前,请确保将端点和 cURL 负载中的 YOUR-MACHINE-NAME.ts.net 替换为你实际的安全 Tailscale 域名,正如你终端的 tailscale serve status 命令所示。
Use Skill Creator to update or register the skill named:
social-publishing-human-approval
Purpose:
Use this skill whenever the user asks OpenClaw to promote, distribute, or publish a YouTube video link on social media networks.
Current tutorial scope:
- Publish exclusively to the authorized LinkedIn personal account profile.
- Require a Telegram human checkpoint before executing any external publication.
Production webhook endpoint:
https://YOUR-MACHINE-NAME.ts.net:8444/webhook/social-publishing-human-approval
Execution behavior:
1. Extract the raw YouTube video URL parameter from the user's message context.
2. Dispatch a synchronous POST request to the production webhook endpoint.
3. Hold the execution thread open while the n8n workflow generates the draft copy and pauses for the Telegram manual review.
4. Wait for the user to complete the manual verification step.
5. Maintain the active connection thread until n8n transmits the final downstream HTTP response array.
6. Capture and parse the returned JSON status payload.
7. Report the definitive publication success or failure outcome clearly back to the user interface.
Use this precise cURL command architecture:
curl -sS --max-time 900 \
-X POST \
'https://YOUR-MACHINE-NAME.ts.net:8444/webhook/social-publishing-human-approval' \
-H 'Content-Type: application/json' \
-d '{
"video_url": "YOUR_URL"
}'
Critical execution rules:
- Dynamically substitute YOUR_URL with the clean YouTube URL isolated from the incoming request.
- Execute the cURL network process synchronously. Do not append background processing flags such as nohup or &.
- Enforce a strict network connection timeout boundary of 900 seconds (15 minutes) to guarantee adequate human review latency buffer.
- Capture stdout streams directly and evaluate the final JSON array structure.
- Never trigger automated publishing logic without verified human confirmation.
Success parsing:
Upon receiving a valid LinkedIn share URN payload response from the webhook, confirm the deployment status by outputting:
"Approved and published successfully:
- LinkedIn personal account"
Include the matching transaction URN if visible in the telemetry.
7. 端到端测试 (End-to-End Testing)
随着两个系统完全同步,你可以执行一次全面的集成测试,以验证你新管道的运行完整性:
打开你的 Telegram AI Bot 用户界面,并提交一个包含目标链接的自然语言请求:“Promote this YouTube video: https://www.youtube.com/watch?v=hN-9e5iLLHA”。
OpenClaw 将自动分离 URL 参数,将意图与你的自定义 social-publishing-human-approval skill 匹配,并通过你的安全 Tailscale 隧道将负载数组转发给 n8n。
片刻之后,你的管理机器人将发送一张交互式审查卡片,显示由 Gemini 2.5 Flash 生成的结构化文案。
审阅文案和标签。点击 ✅ Approve 按钮,并顺着安全的回调链接恢复执行循环。
导航到你的个人 LinkedIn 动态消息,将确认该推广更新已经上线,并带有你优化后的文本排版和原生的视频播放器预览组件。

总结
这种架构突出了现代企业工作流的最佳运营蓝图:OpenClaw 提供直观的自然语言操作界面,n8n 协调后端逻辑集成,Gemini 扩展创意内容生产,而 Telegram 作为人类把关者让你安全地保持控制。通过采用这种“人机协同”模式,你可以消除重复的数据录入任务,同时确保没有任何内容会盲目地发布到你的生产环境中。



留言