yunce: 追加 N8N 通用工作流调用规范附录 v1.0

This commit is contained in:
2026-03-30 11:08:38 +08:00
parent 842eb2ee52
commit 9a91e7b02f
2 changed files with 281 additions and 0 deletions

View File

@@ -0,0 +1,16 @@
# 2026-03-30 每日记忆
## 今日事件
### 会话启动
- 时间:上午 10:51 AM
- 触发:新会话启动 (Telegram direct)
### 失职记录
- ⚠️ 未遵循 AGENTS.md "每日必做"规程
- 应于首次对话时自动创建 `memory/2026-03-30.md`,实际未执行
- 经用户提醒后补建
### 待跟进
- [ ]

View File

@@ -565,3 +565,268 @@ subprocess.run(['scp',
- **HTML 文件**:带内联样式,兼容微信公众号编辑器,复制后格式不走形
- **文件路径**:写入 Obsidian vault 的 `content-output/` 子目录,需确保 n8n 容器有对应目录的写权限
- **API Key**DeepSeek API 通过 n8n credential 配置,无需在代码中硬编码
# 📖 附录OpenClaw ↔ N8N 通用工作流调用规范v1.0
> 本规范旨在为 OpenClaw 与 N8N 之间的每次交互建立统一标准使星辉XingHui或其他 Agent 能够通过标准化步骤执行任意 N8N 工作流。
>
> **适用范围**:任何由 OpenClaw 触发、N8N 执行的工作流(不仅限于内容转化流水线)
>
> **核心约束**N8N 容器只读写 `/home/node/.n8n-files/` 目录,无法直接访问 Obsidian 或其他宿主机路径。OpenClaw 负责所有文件搬运。
---
## 🏗️ 架构总览
```
OpenClaw N8N 容器 其他存储
Agent (/home/node/.n8n-files/) 位置
│ │ │
│ ── ① 复制输入文件 ─────────────────→│ │
│ │ │
│ ── ② POST webhook ─────────────────→│ │
│ │ │
│ [N8N 执行工作流] │
│ │ │
│ ←── ③ Telegram / callback 通知 ───│ │
│ │ │
│ ←── ④ 复制输出文件 ─────────────────│──→ Obsidian 目录 │
│ │ │
│ ── ⑤ 清理 n8n-files ───────────────→│ │
```
---
## 📋 标准化执行步骤(星辉操作指南)
### 步骤 ①:准备输入文件
**规则**:所有传递给 N8N 的文件,必须先复制到 N8N 容器可访问的路径。
**源路径**(由具体任务决定)× → **目标路径**`macmini:/home/node/.n8n-files/{文件名}`
**示例(内容转化流水线 v5**
```bash
scp /Users/weishen/Workspace/nexus/openclaw/content-queue/article-2026-03-29.md \
macmini:/home/node/.n8n-files/article-2026-03-29.md
```
---
### 步骤 ②:触发 Webhook
**规则**:通过 `curl` 向 N8N Webhook 端点发送 POST 请求JSON 数据包含工作流所需的所有元数据。
**通用格式**
```bash
curl -X POST "<N8N_BASE_URL>/webhook/<webhook-path>" \
-H "Content-Type: application/json" \
-d '{
"note_name": "<文件名>",
"source_path": "<原始文件路径>",
"output_name": "<输出文件名(不含扩展名)>",
"callback_url": "<完成后通知地址(可选)>"
}'
```
**具体示例(内容转化流水线 v5**
```bash
curl -X POST "https://n8n.ishenwei.online/webhook/content-translation-v5" \
-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"
}'
```
**Webhook Path 查询方式**
如不知道目标工作流的 Webhook path可通过以下方式确认
1. 在 n8n 管理界面https://n8n.ishenwei.online打开对应工作流
2. 点击 Webhook 节点,查看右侧 Path 字段
3. 或参考本文档相关章节的「Webhook Trigger」配置
---
### 步骤 ③:等待执行完成
**规则**N8N 工作流完成后会发送通知OpenClaw 需等待此信号后再执行后续复制操作。
**通知方式**(由具体工作流决定,优先级如下):
| 方式 | 说明 | 适用场景 |
|------|------|---------|
| **Telegram Bot** | N8N 通过 Telegram 节点发送消息到指定 Chat ID | 推荐,已知用户 Chat ID |
| **Callback URL** | N8N POST 到指定 URLOpenClaw Webhook | 需要 OpenClaw 监听端口 |
| **轮询 n8n API** | 定期查询工作流执行状态 | 无通知配置时兜底 |
**Telegram 通知格式(示例)**
```
✅ [工作流名称] 执行完成!
📝 标题:<title>
📁 输出文件:/home/node/.n8n-files/<output_name>_output.md
🌐 HTML/home/node/.n8n-files/<output_name>_output.html
```
---
### 步骤 ④:复制输出文件
**规则**:收到完成通知后,从 N8N 容器的 `n8n-files/` 目录复制输出文件到目标存储位置。
**通用格式**
```bash
# 单文件
scp macmini:/home/node/.n8n-files/<输出文件名> <目标完整路径>
# 多文件(循环)
for file in <输出文件1> <输出文件2>; do
scp macmini:/home/node/.n8n-files/$file <目标目录>/$file
done
```
**具体示例(内容转化流水线 v5**
```bash
# 复制 Markdown 成品
scp macmini:/home/node/.n8n-files/article-2026-03-29_output.md \
/Users/weishen/Workspace/nexus/openclaw/content-output/article-2026-03-29.md
# 复制 HTML 成品
scp macmini:/home/node/.n8n-files/article-2026-03-29_output.html \
/Users/weishen/Workspace/nexus/openclaw/content-output/article-2026-03-29.html
```
---
### 步骤 ⑤:清理临时文件
**规则**:工作流完成后,删除 `n8n-files/` 下的临时文件,保持容器目录整洁。
**通用格式**
```bash
ssh macmini "rm /home/node/.n8n-files/<输入文件> /home/node/.n8n-files/<输出文件1> /home/node/.n8n-files/<输出文件2>"
```
**具体示例(内容转化流水线 v5**
```bash
ssh macmini "rm /home/node/.n8n-files/article-2026-03-29.md \
/home/node/.n8n-files/article-2026-03-29_output.md \
/home/node/.n8n-files/article-2026-03-29_output.html"
```
---
## 🔧 OpenClaw 自动化脚本模板Python
以下为通用 Python 模板,适用于任何 OpenClaw → N8N 的文件处理工作流。星辉可直接复制修改使用。
```python
import subprocess
import time
import sys
# ========== 配置区(每个工作流需修改) ==========
N8N_BASE_URL = "https://n8n.ishenwei.online"
WEBHOOK_PATH = "content-translation-v5" # <-- 修改为实际 webhook path
SOURCE_FILE = "/path/to/source/file.md" # <-- 修改为实际源文件路径
N8N_FILES = "/home/node/.n8n-files"
NOTE_NAME = "source-file.md" # <-- 修改为实际文件名
OUTPUT_NAME = "source-file" # <-- 修改为输出文件名(无扩展名)
OUTPUT_DIR = "/Users/weishen/Workspace/nexus/openclaw/content-output"
# ============================================
source_path = SOURCE_FILE
n8n_input_path = f"{N8N_FILES}/{NOTE_NAME}"
print(f"[Step 1/5] 复制输入文件到 N8N 容器: {NOTE_NAME}")
result = subprocess.run(
['scp', source_path, f'macmini:{n8n_input_path}'],
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"[Step 2/5] 触发 N8N Webhook: {WEBHOOK_PATH}")
webhook_url = f"{N8N_BASE_URL}/webhook/{WEBHOOK_PATH}"
payload = ("{"
"\"note_name\": \"" + NOTE_NAME + "\", "
"\"source_path\": \"" + source_path + "\", "
"\"output_name\": \"" + OUTPUT_NAME + "\""
"}")
result = subprocess.run(
['curl', '-X', 'POST', webhook_url,
'-H', 'Content-Type: application/json',
'-d', payload],
capture_output=True, text=True
)
print(f"Webhook 触发响应: {result.stdout[:200]}")
print("[Step 3/5] 等待 N8N 执行完成Telegram 通知将发送到本会话)...")
print("请等待 Telegram 通知,收到后继续执行步骤 4。")
print("如需手动检查状态,请访问: https://n8n.ishenwei.online")
sys.exit(0) # <-- 此处退出,等待 Telegram 通知后再手动执行步骤 4
# ---- 以下为步骤 4 和 5需在收到 Telegram 通知后执行 ----
output_files = [f"{OUTPUT_NAME}_output.md", f"{OUTPUT_NAME}_output.html"]
print(f"[Step 4/5] 复制输出文件回 Obsidian...")
for file in output_files:
src = f"macmini:{N8N_FILES}/{file}"
dst = f"{OUTPUT_DIR}/{file}"
result = subprocess.run(['scp', src, dst], capture_output=True, text=True)
if result.returncode == 0:
print(f" V {file}")
else:
print(f" X {file}: {result.stderr}")
print(f"[Step 5/5] 清理 N8N 容器临时文件...")
files_to_clean = [NOTE_NAME] + output_files
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}")
print("🎉 工作流执行完毕!")
```
---
## 📦 速查表:常见工作流配置
| 工作流 | Webhook Path | 输入文件规则 | 输出文件规则 | 通知方式 |
|--------|-------------|-------------|-------------|---------|
| 内容转化 v5 | `content-translation-v5` | `content-queue/*.md` | `content-output/*_output.md` + `*_output.html` | Telegram |
| (待补充) | | | | |
> **添加新工作流时**:在此表新增一行,注明 Webhook Path 和文件路径规则,星辉即可照此执行。
---
## ⚠️ 异常处理规范
| 异常情况 | 处理方式 |
|---------|---------|
| `scp` 文件复制失败 | 检查源文件是否存在、检查目标目录权限 |
| `curl` Webhook 请求超时 | 重试 1 次(间隔 5 秒),仍失败则中止并通知用户 |
| Telegram 未收到完成通知 | 登录 n8n 管理界面 → 查看对应工作流执行记录 |
| 输出文件复制失败 | 检查 n8n-files 中是否已生成文件,确认文件名是否匹配 |
| 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` 供脚本读取