yunce: v6a 勘误 — 修正路径、输出文件名、节点数、Telegram格式

This commit is contained in:
2026-03-30 15:07:09 +08:00
parent 36d794c299
commit af6340fc9d

View File

@@ -1,91 +1,76 @@
# N8N 内容转化流水线工作流设计v6
# N8N 内容转化流水线工作流设计v6 — 与实际部署对齐
> 用于AI 英文文章 → 中文公众号/X/视频 内容转化
> 工作流 ID`iOf32aOKvTjfTDSM`v5 基础)
> 工作流 ID`SjGKBtSnQ0u87mlK`
> 触发方式OpenClaw 通过 Webhook 调用
> 管理平台Mac mini 上的 n8n (`https://n8n.ishenwei.online`)
>
> **v6 变更(相比 v5**
> - ✅ 移除 Node 7Build HTML、Node 8Write HTML
> - ✅ n8n 仅输出 Markdown 文件HTML 转换不再需要
> - ✅ 最终输出纯 Markdown便于在 Obsidian 中编辑后再发布到公众号
> - ⚠️ Telegram 通知中的 HTML 相关字段已移除
> - ⚠️ 验收标准调整为仅检查 Markdown 文件
---
## 核心需求更新v6
## ⚠️ 路径映射说明(重要!
n8n 容器通过 Docker volume mount 访问宿主机文件系统:
| 容器内路径 | 宿主机路径OpenClaw 用这个) |
|-----------|--------------------------|
| `/home/node/.n8n-files/` | `/Users/weishen/docker/n8n/n8n_data/files/` |
> **所有 `scp` / `ssh cp` / `ssh rm` 命令都必须使用宿主机路径。**
> n8n 节点内部配置的是容器路径,两者是同一个目录。
---
## 核心需求
### 输出要求
**单一输出:中文 Markdown 文件**
| 输出文件 | 路径 | 格式 | 用途 |
|---------|------|------|------|
| **Markdown 源文件** | `content-output/{原文件名}.md` | 中文 Markdown | Obsidian 留存、编辑发布 |
> 不再生成公众号 HTML。公众号排版在 Obsidian 中手动完成,或通过其他工具转换。
| 输出文件 | 宿主机路径 | 格式 |
|---------|-----------|------|
| **Markdown 成品** | `content-output/{output_name}_out.md` | 中文 Markdown,可在 Obsidian 编辑发布公众号 |
### Obsidian 目录结构
```
~/Workspace/nexus/openclaw/
├── content-queue/ # 原始英文文章(输入)
│ └── 2026-03-29-ai-solopreneur.md
│ └── 3 Essential Tools for OpenClaw.md
└── content-output/ # 成品(输出v6 仅 Markdown
└── 2026-03-29-ai-solopreneur.md # 翻译后 Markdown ✅
└── content-output/ # 成品(输出)
└── 3 Essential Tools for OpenClaw_out.md # 中文 Markdown ✅
```
---
## 工作流概述
```
OpenClaw (发现文章)
↓ (保存文件到 n8n-files 目录)
↓ (触发 Webhook)
┌─────────────────────────────────────────────────────────────┐
│ N8N 工作流 (v6): content-translation-pipeline-v6 │
│ │
│ [Webhook] → [Read File] → [Extract Text] → [AI Agent] │
│ ↓ ↑ (DeepSeek) │
│ [Build Markdown] → [Write .md] │
│ ↓ │
│ [Send Telegram] │
└─────────────────────────────────────────────────────────────┘
```
---
## 节点详细设计v6
## 节点详细设计v6 实际版本)
### 节点 1Webhook Trigger
**类型:** Webhook
**名称:** `Webhook Trigger`
**Path** `/content-translation-v6`(新建 path
**Path** `/content-translation-v6`
**Method** POST
**接收数据格式:**
**接收数据格式(重要更新)**
```json
{
"note_name": "2026-03-29-ai-solopreneur.md",
"source_path": "/Users/weishen/Workspace/nexus/openclaw/content-queue/2026-03-29-ai-solopreneur.md",
"output_name": "2026-03-29-ai-solopreneur",
"callback_url": "http://192.168.3.189:18789/webhook/yunce"
"note_name": "3 Essential Tools for OpenClaw.md",
"output_name": "3 Essential Tools for OpenClaw"
}
```
> ⚠️ `source_path` 字段可选v6 实际 webhook body 不依赖此字段)。
---
### 节点 2Read Obsidian Note
### 节点 2Read Binary File
**类型:** Read Binary File
**名称:** `Read Obsidian Note`
**配置:**
**配置(容器内路径)**
- File Path: `=/home/node/.n8n-files/{{ $json.body.note_name }}`
---
@@ -98,22 +83,44 @@ OpenClaw (发现文章)
---
### 节点 4AI Agent翻译+改写)
### 节点 4Structured Output Parser
**类型:** Structured Output Parser
**名称:** `Structured Output Parser`
**说明:** n8n 内置的结构化输出解析器,负责将 AI 输出的文本解析为 JSON 供后续节点使用。
**JSON Schema**
```json
{
"wechat_title": "中文标题",
"wechat_excerpt": "公众号摘要100字内",
"wechat_content": "完整公众号文章Markdown格式",
"twitter_copy": "X/Twitter文案280字内带emoji",
"video_title": "视频标题",
"video_script": "口播脚本(含时间戳和字幕)",
"cover_keywords": ["关键词1", "关键词2", "关键词3"]
}
```
---
### 节点 5AI Agent
**类型:** LangChain Agent
**名称:** `AI Agent`
**Version** 3.1
**Model** DeepSeek Chat Model
**Output Parser** `Structured Output Parser`(已连接)
**Prompt 模板:**
**Prompt 模板(与 v6 文档一致,但 JSON 字段名注意小写)**
```
你是一个专业的中文内容编辑,擅长将英文文章转化为适合中国读者的高质量内容。
你是专业的中文内容编辑,擅长将英文文章转化为适合中国读者的高质量内容。
## 你的任务
将以下英文原文转化为:
1. 公众号风格的深度文章2000-3000字
2. X/Twitter 风格的短文案280字内带钩子
2. X/Twitter 风格的短文案280字内emoji钩子)
3. 视频口播脚本3-5分钟适合抖音/YouTube
## 内容要求
@@ -123,11 +130,6 @@ OpenClaw (发现文章)
- 调性公众号大V风格有观点有案例
- 商业化:可自然植入 AI Agent / 知识管理相关内容(软性,不硬广)
## 文章主题方向(供校准时参考)
- AI Agent 落地实践与工具推荐
- AI 赋能商业的最佳实践
- AI 时代的网络安全与运维
## 输出格式(严格按此 JSON 返回)
{
@@ -144,75 +146,77 @@ OpenClaw (发现文章)
{{ $json.data }}
```
> ⚠️ 注意Build Markdown 节点访问 AI 结果用的是 `$input.first().json.output`,不是 `message`。
---
### 节点 5Build Markdownv6 精简版)
### 节点 6Build Markdown
**类型:** Code
**名称:** `Build Markdown`
**功能:** 将 AI 输出的 JSON 组装成结构清晰的 Markdown 文件
**功能:** 将 AI 输出的 JSON 组装成 Markdown 文件
```javascript
const aiResult = $input.first().json.message;
const data = typeof aiResult === 'string' ? JSON.parse(aiResult) : aiResult;
const aiResponse = $input.first().json.output;
const aiResult = typeof aiResponse === 'string' ? JSON.parse(aiResponse) : aiResponse;
const noteName = $('Webhook Trigger').first().json.body.note_name;
const outputName = noteName.replace('.md', '');
const outputName = $('Webhook Trigger').first().json.body.output_name;
const sourcePath = $('Webhook Trigger').first().json.body.source_path || '';
const markdown = `# ${data.wechat_title}
> ${data.wechat_excerpt}
${data.wechat_content}
---
## X/Twitter 文案
${data.twitter_copy}
---
## 视频信息
**标题:** ${data.video_title}
**口播脚本:**
${data.video_script}
---
*封面图关键词:${data.cover_keywords?.join(', ')}*
`;
const markdown = '# ' + aiResult.wechat_title + '\n\n'
+ aiResult.wechat_excerpt + '\n\n'
+ aiResult.wechat_content + '\n\n'
+ '---\n\n'
+ '## X/Twitter 文案\n\n'
+ aiResult.twitter_copy + '\n\n'
+ '---\n\n'
+ '## 视频信息\n\n'
+ '**标题:** ' + aiResult.video_title + '\n\n'
+ '**口播脚本:\n\n'
+ aiResult.video_script + '\n\n'
+ '---\n\n'
+ '*封面图关键词:' + (aiResult.cover_keywords ? aiResult.cover_keywords.join(' | ') : '') + '*\n\n'
+ '*原文路径:' + sourcePath + '*/';
return {
json: {
output_name: outputName,
output_content: markdown,
source_path: $('Webhook Trigger').first().json.body.source_path
markdown_content: markdown,
ai_result: aiResult
}
};
```
---
### 节点 6️⃣:Write .md File
### 节点 7️⃣:Convert to File
**类型:** Write Binary File / ReadWriteFile
**名称:** `Write Markdown Note`
**类型:** Convert to File
**名称:** `Convert to File`
**Operation** `toText`
**Source Property** `markdown_content`
**配置:**
- Operation: `write`
- File Path: `=/home/node/.n8n-files/{{ $json.output_name }}_output.md`
- Content: `={{ $json.output_content }}`
**注意:** 输出到 n8n-files/ 目录,由 OpenClaw 负责复制回 Obsidian。
> 将 Build Markdown 输出的文本(`markdown_content` 字段)转换为二进制文件,供 Write 节点写入。
---
### 节点 7️⃣:Send Telegram Message
### 节点 8️⃣:Write Markdown File
**类型:** Read/Write File
**名称:** `Write Markdown File`
**Operation** `write`
**配置:**
- File Name: `=/home/node/.n8n-files/{{ $('Build Markdown').item.json.output_name }}_out.md`
- Data Property Name: `=data`
> ⚠️ 输出文件名格式:`{output_name}_out.md`(不是 `_output.md`
---
### 节点 9Send Telegram Message
**类型:** Telegram
**名称:** `Send Telegram Message`
@@ -221,120 +225,94 @@ return {
- Chat ID: `5038825565`
- Text:
```
✅ 文章转换完成!
=✅ 文章转换完成!
📝 标题:${$json.wechat_title}
📁 Markdown/home/node/.n8n-files/${$json.output_name}_output.md
🐦 Twitter 文案:${$json.twitter_copy}
🎬 视频标题:${$json.video_title}
📝 标题:{{ $('Build Markdown').item.json.ai_result.wechat_title }}
```
- Credentials: `Telegram XingJiang Bot`
- Parse Mode: `Markdown`
**注意:** OpenClaw 收到通知后负责将 Markdown 文件复制回 Obsidian
> ⚠️ v6 实际通知只含标题不含文件路径。OpenClaw 根据约定的文件命名规则自行定位输出文件
---
## 节点连接图v6
## 节点连接图
```
┌─────────────────────────────────┐
│ Webhook Trigger
POST /content-translation-v6 │
└──────────────┬──────────────────┘
┌─────────────────────────────────┐
│ Read Obsidian Note
│ (Read Binary File)
└──────────────┬──────────────────
┌─────────────────────────────────┐
│ Extract from File │
│ (text operation)
└──────────────┬──────────────────┘
┌──────────┴──────────┐
│ │
│ ┌───────┴────────┐
│ │ DeepSeek
│ │ Chat Model │
│ └───────┬────────┘
┌─────────────────────────────────┐
│ AI Agent (LangChain) │
│ 输出 JSON 格式结果 │
└──────────────┬──────────────────┘
┌─────────────────────────────────┐
│ Build Markdown │
│ 组装中文 Markdown 文件 │
└──────────────┬──────────────────┘
┌─────────────────────────────────┐
│ Write Markdown Note │
│ → content-output/*.md │
└──────────────┬──────────────────┘
┌─────────────────────────────────┐
│ Send Telegram Message │
│ Markdown 文件路径通知 │
└─────────────────────────────────┘
Webhook Trigger
Read Binary File
Extract from File
┌──────────────────────────────────────┐
Structured Output Parser ←────────┤AI Output Parser 连接)
AI Agent ─────────────────────────→│prompt + outputSchema
│ DeepSeek Chat Model │
└──────────────────────────────────────┘
Build Markdown
Convert to File
Write Markdown File
Send Telegram Message
```
---
## 调用方式OpenClaw 侧)
## 调用方式OpenClaw 侧 — 实际测试命令
**核心约束n8n 只能读写 `/home/node/.n8n-files/` 目录OpenClaw 负责文件搬运。**
### 宿主机 n8n-files 目录
```
/Users/weishen/docker/n8n/n8n_data/files/
```
### OpenClaw 完整流程v6
### 完整流程(实际测试版)
```bash
# =============================================
# 步骤 1OpenClaw 复制原文到 n8n-files 目录
# 步骤 1复制原文到 n8n 容器可访问的目录
# =============================================
scp /Users/weishen/Workspace/nexus/openclaw/content-queue/article-2026-03-29.md \
macmini:/home/node/.n8n-files/article-2026-03-29.md
scp "/Users/weishen/Workspace/nexus/openclaw/content-queue/3 Essential Tools for OpenClaw.md" \
"macmini:/Users/weishen/docker/n8n/n8n_data/files/3 Essential Tools for OpenClaw.md"
# =============================================
# 步骤 2OpenClaw 触发 n8n Webhook
# 步骤 2触发 Webhook
# =============================================
curl -X POST "https://n8n.ishenwei.online/webhook/content-translation-v6" \
-H "Content-Type: application/json" \
-d '{
"note_name": "article-2026-03-29.md",
"source_path": "/Users/weishen/Workspace/nexus/openclaw/content-queue/article-2026-03-29.md",
"output_name": "article-2026-03-29",
"callback_url": "http://192.168.3.189:18789/webhook/yunce"
}'
"note_name": "3 Essential Tools for OpenClaw.md",
"output_name": "3 Essential Tools for OpenClaw"
}' \
-m 180 \
-w "\nHTTP_CODE:%{http_code}\n"
# =============================================
# 步骤 3n8n 流程执行中...
# 步骤 3-4复制输出文件回 Obsidian
# =============================================
# n8n 读取 /home/node/.n8n-files/article-2026-03-29.md
# 处理(翻译、改写)
# 输出到 /home/node/.n8n-files/article-2026-03-29_output.md
# 发送 Telegram 通知
# ⚠️ 注意:输出文件名是 {output_name}_out.md不是 _output.md
ssh macmini "cp \"/Users/weishen/docker/n8n/n8n_data/files/3 Essential Tools for OpenClaw_out.md\" \
\"/Users/weishen/Workspace/nexus/openclaw/content-output/3 Essential Tools for OpenClaw_out.md\""
# =============================================
# 步骤 4OpenClaw 复制输出文件回 Obsidian工作流完成后
# 步骤 5清理临时文件
# =============================================
scp macmini:/home/node/.n8n-files/article-2026-03-29_output.md \
/Users/weishen/Workspace/nexus/openclaw/content-output/article-2026-03-29.md
# =============================================
# 步骤 5清理 n8n-files 临时文件(可选)
# =============================================
ssh macmini "rm /home/node/.n8n-files/article-2026-03-29.md \
/home/node/.n8n-files/article-2026-03-29_output.md"
ssh macmini "rm '/Users/weishen/docker/n8n/n8n_data/files/3 Essential Tools for OpenClaw.md'"
ssh macmini "rm '/Users/weishen/docker/n8n/n8n_data/files/3 Essential Tools for OpenClaw_out.md'"
```
### OpenClaw Python 脚本模板v6
---
## Python 自动化脚本模板v6a — 勘误版)
```python
import subprocess
@@ -342,145 +320,120 @@ import sys
# ========== 配置区 ==========
N8N_BASE_URL = "https://n8n.ishenwei.online"
WEBHOOK_PATH = "content-translation-v6" # <-- 实际 webhook path
SOURCE_FILE = "/path/to/source/file.md" # <-- 实际源文件路径
N8N_FILES = "/home/node/.n8n-files"
WEBHOOK_PATH = "content-translation-v6"
SOURCE_FILE = "/path/to/source/file.md" # <-- 修改为实际源文件路径
N8N_FILES_HOST = "/Users/weishen/docker/n8n/n8n_data/files"
NOTE_NAME = "source-file.md" # <-- 实际文件名
OUTPUT_NAME = "source-file" # <-- 输出文件名(无扩展名)
OUTPUT_NAME = "source-file" # <-- output_name(无扩展名)
OUTPUT_DIR = "/Users/weishen/Workspace/nexus/openclaw/content-output"
# ===================================
# ============================
n8n_input_path = f"{N8N_FILES}/{NOTE_NAME}"
n8n_input = f"{N8N_FILES_HOST}/{NOTE_NAME}"
n8n_output = f"{N8N_FILES_HOST}/{OUTPUT_NAME}_out.md" # <-- 命名规则_out.md
print(f"[Step 1/5] 复制输入文件到 N8N 容器: {NOTE_NAME}")
result = subprocess.run(
['scp', SOURCE_FILE, f'macmini:{n8n_input_path}'],
['scp', SOURCE_FILE, f'macmini:{n8n_input}'],
capture_output=True, text=True
)
if result.returncode != 0:
print(f"X 文件复制失败: {result.stderr}")
sys.exit(1)
print(f"V 已复制到 {n8n_input_path}")
print(f"V 已复制到 {n8n_input}")
print(f"[Step 2/5] 触发 N8N Webhook: {WEBHOOK_PATH}")
webhook_url = f"{N8N_BASE_URL}/webhook/{WEBHOOK_PATH}"
payload = ("{"
"\"note_name\": \"" + NOTE_NAME + "\", "
"\"source_path\": \"" + SOURCE_FILE + "\", "
"\"output_name\": \"" + OUTPUT_NAME + "\""
"}")
result = subprocess.run(
['curl', '-X', 'POST', webhook_url,
'-H', 'Content-Type: application/json',
'-d', payload],
'-d', payload,
'-m', '180'],
capture_output=True, text=True
)
print(f"Webhook 触发响应: {result.stdout[:200]}")
print("[Step 3/5] 等待 N8N 执行完成Telegram 通知将发送到本会话)...")
print("请等待 Telegram 通知,收到后继续执行步骤 4。")
sys.exit(0) # <-- 退出等待通知
sys.exit(0)
# ---- 以下为步骤 4 和 5需在收到 Telegram 通知后执行 ----
print(f"[Step 4/5] 复制输出文件回 Obsidian...")
output_file = f"{OUTPUT_NAME}_output.md"
src = f"macmini:{N8N_FILES}/{output_file}"
dst = f"{OUTPUT_DIR}/{output_file}"
src = f"macmini:{n8n_output}"
dst = f"{OUTPUT_DIR}/{OUTPUT_NAME}_out.md"
result = subprocess.run(['scp', src, dst], capture_output=True, text=True)
if result.returncode == 0:
print(f" V {output_file}")
print(f" V {OUTPUT_NAME}_out.md")
else:
print(f" X {result.stderr}")
print("[Step 5/5] 清理 N8N 容器临时文件...")
files_to_clean = [NOTE_NAME, output_file]
result = subprocess.run(
['ssh', 'macmini', 'rm'] + [f"{N8N_FILES}/{f}" for f in files_to_clean],
capture_output=True, text=True
)
if result.returncode == 0:
print(" V 清理完成")
else:
print(f" ! 清理失败(不影响结果): {result.stderr}")
for f in [NOTE_NAME, f"{OUTPUT_NAME}_out.md"]:
r = subprocess.run(['ssh', 'macmini', 'rm', f"{N8N_FILES_HOST}/{f}"],
capture_output=True, text=True)
status = "V" if r.returncode == 0 else f"X ({r.stderr})"
print(f" {status} {f}")
print("🎉 工作流执行完毕!")
```
---
## Obsidian 最终目录结构v6
## 验收标准
```
~/Workspace/nexus/openclaw/
├── content-queue/ # 原始英文输入OpenClaw 放置)
│ └── article-2026-03-29.md
└── content-output/ # 成品v6 仅 Markdown
└── article-2026-03-29.md # 中文 Markdown ✅
```
---
## 验收标准v6
1. 触发后自动完成整个流程,无需人工干预
2. `content-output/` 目录生成 `.md` 文件v6 无 HTML
3. Markdown 文件内容完整,包含:公众号正文 + Twitter 文案 + 视频脚本
4. Telegram 收到完成通知(含标题和文件路径)
1. Webhook 触发后 n8n 自动执行完整流程,无需人工干预
2. `content-output/` 目录生成 `{output_name}_out.md` 文件
3. Markdown 文件包含:标题 + 摘要 + 公众号正文 + Twitter 文案 + 视频脚本 + 封面关键词
4. Telegram 收到含标题的完成通知
5. 错误时 n8n 记录错误节点并停止流程
---
## 备注v6
## 与 v6 文档的差异汇总(本文档为正确版本
- **Markdown 源文件**:保留中文原文,便于在 Obsidian 中编辑、排版后再发布
- **公众号排版**:在 Obsidian 中手动完成,或通过 Markdown→公众号工具转换
- **文件路径**:写入 Obsidian vault 的 `content-output/` 子目录,需确保 n8n 容器有对应目录的写权限
- **API Key**DeepSeek API 通过 n8n credential 配置,无需在代码中硬编码
| 项目 | v6 文档(错) | v6a 实际版本(对) |
|------|-------------|-----------------|
| n8n-files 宿主机路径 | `/home/node/.n8n-files/` | `/Users/weishen/docker/n8n/n8n_data/files/` |
| 输出文件名 | `{output_name}_output.md` | `{output_name}_out.md` |
| 节点数 | 7 个 | 9 个(含 Convert to File + Structured Output Parser |
| Build Markdown JSON 路径 | `$input.first().json.message` | `$input.first().json.output` |
| Telegram 通知内容 | 含文件路径 | 仅含标题 |
| webhook body | 包含 source_path | source_path 可选 |
| Write Markdown File FileName | `...output_name}_output.md` | `...output_name}_out.md` |
---
---
# 📖 附录OpenClaw ↔ N8N 通用工作流调用规范v1.0
# 📖 附录OpenClaw ↔ N8N 通用工作流调用规范v1.1
> 本规范旨在为 OpenClaw 与 N8N 之间的每次交互建立统一标准使星辉XingHui或其他 Agent 能够通过标准化步骤执行任意 N8N 工作流。
>
> **适用范围**:任何由 OpenClaw 触发、N8N 执行的工作流(不仅限于内容转化流水线)
> **适用范围**:任何由 OpenClaw 触发、N8N 执行的工作流
>
> **核心约束**N8N 容器只读写 `/home/node/.n8n-files/` 目录,无法直接访问 Obsidian 或其他宿主机路径OpenClaw 负责所有文件搬运
> **核心约束**必须确认 n8n 容器的 volume mount 宿主机路径,所有 OpenClaw 侧文件操作使用宿主机路径
---
## 架构总览
## 路径映射规则
```
OpenClaw N8N 容器 其他存储
Agent (/home/node/.n8n-files/) 位置
│ │ │
│ ── ① 复制输入文件 ─────────────────→│ │
│ │ │
│ ── ② POST webhook ─────────────────→│ │
│ │ │
│ [N8N 执行工作流] │
│ │ │
│ ←── ③ Telegram / callback 通知 ───│ │
│ │ │
│ ←── ④ 复制输出文件 ─────────────────│──→ Obsidian 目录 │
│ │ │
│ ── ⑤ 清理 n8n-files ───────────────→│ │
```
n8n Docker 部署的 volume mount 映射关系:
- 容器内 `/home/node/.n8n-files/` → 宿主机 `{docker-root}/n8n_data/files/`
- 当前部署:`/Users/weishen/docker/n8n/n8n_data/files/`
> 新增工作流时,先确认 docker-compose.yml 中的 volume 配置,用宿主机路径执行所有 `scp` / `ssh cp` / `ssh rm` 命令。
---
## 标准化执行步骤(星辉操作指南)
## 标准化执行步骤
### 步骤 ①:准备输入文件
**规则**所有传递给 N8N 的文件,必须先复制到 N8N 容器可访问的路径。
**通用格式**`scp <源路径> macmini:/home/node/.n8n-files/<文件名>`
**通用格式**`scp <源路径> macmini:{N8N_FILES_HOST}/<文件名>`
### 步骤 ②:触发 Webhook
@@ -488,40 +441,32 @@ OpenClaw N8N 容器 其他存储
```bash
curl -X POST "<N8N_BASE_URL>/webhook/<webhook-path>" \
-H "Content-Type: application/json" \
-d '{
"note_name": "<文件名>",
"source_path": "<原始文件路径>"
}'
-d '{"note_name": "<文件名>", "output_name": "<输出名>"}' \
-m 180 -w "\nHTTP_CODE:%{http_code}\n"
```
**Webhook Path 查询方式**
1. 在 n8n 管理界面https://n8n.ishenwei.online打开对应工作流
2. 点击 Webhook 节点,查看右侧 Path 字段
### 步骤 ③:等待执行完成
**规则**N8N 工作流完成后会发送通知OpenClaw 需等待此信号后再执行后续复制操作。
**通知方式优先级**Telegram Bot > Callback URL > 轮询 n8n API
**通知方式**Telegram Bot推荐> Callback URL > 轮询 n8n API
### 步骤 ④:复制输出文件
**通用格式**`scp macmini:/home/node/.n8n-files/<输出文件名> <目标完整路径>`
**⚠️ 输出文件名规则因工作流而异,必须对照具体工作流确认(常见规则:`_out.md` / `_output.md` / `{name}_result.md`**
**通用格式**`ssh macmini "cp {N8N_FILES_HOST}/<输出文件名> <目标路径>"`
### 步骤 ⑤:清理临时文件
**通用格式**`ssh macmini "rm /home/node/.n8n-files/<输入文件> /home/node/.n8n-files/<输出文件>"`
**通用格式**`ssh macmini "rm {N8N_FILES_HOST}/<输入文件> {N8N_FILES_HOST}/<输出文件>"`
---
## 速查表:常见工作流配置
## 速查表
| 工作流 | Webhook Path | 输入文件规则 | 输出文件规则 | 通知方式 |
| ------- | ------------------------ | -------------------- | ---------------------------- | -------- |
| 内容转化 v6 | `content-translation-v6` | `content-queue/*.md` | `content-output/*_output.md` | Telegram |
| (待补充) | | | | |
> **添加新工作流时**:在此表新增一行,注明 Webhook Path 和文件路径规则,星辉即可照此执行。
| 工作流 | Webhook Path | 输入文件规则 | 输出文件规则 | 通知方式 |
|--------|-------------|-------------|-------------|---------|
| 内容转化 v6 | `content-translation-v6` | `content-queue/*.md` | `content-output/*_out.md` | Telegram(仅标题) |
| (待补充) | | | | |
---
@@ -529,19 +474,19 @@ curl -X POST "<N8N_BASE_URL>/webhook/<webhook-path>" \
| 异常情况 | 处理方式 |
|---------|---------|
| `scp` 文件复制失败 | 检查源文件是否存在、检查目标目录权限 |
| `curl` Webhook 请求超时 | 重试 1 次(间隔 5 秒),仍失败则中止并通知用户 |
| Telegram 未收到完成通知 | 登录 n8n 管理界面 → 查看对应工作流执行记录 |
| 输出文件复制失败 | 检查 n8n-files 中是否已生成文件,确认文件名是否匹配 |
| N8N 工作流报错 | 登录 n8n 管理界面 → 打开对应工作流 → 查看错误节点日志 |
| `scp` 文件复制失败 | 检查源文件是否存在、检查 docker volume 路径是否正确 |
| `curl` Webhook 超时 | 增加 `-m` 超时时间(如 180 秒),重试 1 次 |
| Telegram 未收到通知 | 登录 n8n 管理界面 → 查看工作流执行记录 |
| 输出文件复制失败 | 确认实际输出文件名(对照工作流的 Write 节点配置) |
| N8N 工作流报错 | 登录 n8n 管理界面 → 查看错误节点日志 |
---
## 关键约束汇总
1. **N8N 容器路径**`/home/node/.n8n-files/`(只读/写此目录)
2. **文件传输方式**`scp` via `macmini` 主机名
3. **Webhook 触发**:统一使用 `curl -X POST`Content-Type 为 `application/json`
4. **通知等待**:必须等待 Telegram/callback 通知后再复制输出文件,不得跳过
5. **清理时机**步骤 4 成功后再执行清理,步骤 4 失败时不清理(保留现场)
6. **配置文件**`~/.openclaw/.env` 中的 `N8N_API_KEY``N8N_BASE_URL` 供脚本读取
1. **n8n volume 宿主机路径**`/Users/weishen/docker/n8n/n8n_data/files/`
2. **文件传输**OpenClaw 侧统一用宿主机路径(`scp` / `ssh cp` / `ssh rm`
3. **输出文件名**:必须对照具体工作流的 Write 节点确认,不得假设
4. **Webhook 触发**`curl -X POST``-m 180` 超时,响应含 `HTTP_CODE`
5. **通知等待**必须等待 Telegram/callback 再复制输出文件
6. **清理时机**步骤 4 成功后再清理,失败时保留现场