From 7e9689bcf3e8169d350bd49075886bfc7cc3051c Mon Sep 17 00:00:00 2001 From: weishen Date: Sun, 29 Mar 2026 16:24:41 +0800 Subject: [PATCH] =?UTF-8?q?yunce:=20TOOLS.md=E6=96=B0=E5=A2=9EN8N=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E7=BF=BB=E8=AF=91=E6=B5=81=E6=B0=B4=E7=BA=BF=E5=AE=8C?= =?UTF-8?q?=E6=95=B4=E8=B0=83=E7=94=A8=E6=8C=87=E5=8D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- openclaw/yunce/TOOLS.md | 241 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 240 insertions(+), 1 deletion(-) diff --git a/openclaw/yunce/TOOLS.md b/openclaw/yunce/TOOLS.md index 3fb8b4e3..4b8c06a7 100644 --- a/openclaw/yunce/TOOLS.md +++ b/openclaw/yunce/TOOLS.md @@ -294,4 +294,243 @@ message \ 7. 如果pull成功,也可以告诉用户目录已经更新。 ### 异常处理 -如果在处理git命令过程中出现任何问题,请第一时间联系用户。并把错误消息贴给用户看。 \ No newline at end of file +如果在处理git命令过程中出现任何问题,请第一时间联系用户。并把错误消息贴给用户看。 + +## N8N 工作流管理 (2026-03-29) +用户可能说: "帮我看看n8n上的工作流"、"触发n8n工作流"、"查看n8n执行记录" + +### 连接配置 +| 配置项 | 值 | +|--------|-----| +| **Base URL** | `https://n8n.ishenwei.online` | +| **API Key** | `~/.openclaw/.env` 中的 `N8N_API_KEY` | +| **管理界面** | https://n8n.ishenwei.online | + +### 核心脚本路径 +- **技能位置**: `~/.openclaw/skills/n8n/` +- **n8n_api.py**: 工作流管理、触发执行、查看状态 +- **n8n_tester.py**: 验证工作流、dry-run 测试 +- **n8n_optimizer.py**: 性能分析与优化建议 + +### 环境变量(已在 `~/.openclaw/.env`) +``` +N8N_API_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +N8N_BASE_URL=https://n8n.ishenwei.online +``` + +### 常用操作 +```bash +# 查看工作流列表 +python3 ~/.openclaw/skills/n8n/scripts/n8n_api.py list-workflows --pretty + +# 查看执行记录 +python3 ~/.openclaw/skills/n8n/scripts/n8n_api.py list-executions --id --limit 20 --pretty + +# 手动触发工作流 +python3 ~/.openclaw/skills/n8n/scripts/n8n_api.py execute --id + +# 带数据触发 +python3 ~/.openclaw/skills/n8n/scripts/n8n_api.py execute --id --data '{"key": "value"}' + +# 激活/停用 +python3 ~/.openclaw/skills/n8n/scripts/n8n_api.py activate --id +python3 ~/.openclaw/skills/n8n/scripts/n8n_api.py deactivate --id +``` + +### 测试与验证 +```bash +# 验证工作流结构 +python3 ~/.openclaw/skills/n8n/scripts/n8n_tester.py validate --id --pretty + +# Dry Run 测试 +python3 ~/.openclaw/skills/n8n/scripts/n8n_tester.py dry-run --id --data '{}' +``` + +### 创建工作流 +```bash +# 从 JSON 文件创建 +python3 ~/.openclaw/skills/n8n/scripts/n8n_api.py create --from-file workflow.json + +# 创建后激活 +python3 ~/.openclaw/skills/n8n/scripts/n8n_api.py activate --id +``` + +### 性能分析 +```bash +# 分析性能 +python3 ~/.openclaw/skills/n8n/scripts/n8n_optimizer.py analyze --id --pretty + +# 获取优化建议 +python3 ~/.openclaw/skills/n8n/scripts/n8n_optimizer.py suggest --id --pretty +``` + +### Webhook 触发 +```bash +# 直接调用 Webhook +curl -X POST "https://n8n.ishenwei.online/webhook/" \ + -H "Content-Type: application/json" \ + -d '{"key": "value"}' +``` + +--- + +## N8N 内容翻译流水线 (2026-03-29) + +**用途**:英文文章 → 中文(公众号Markdown + HTML)+ Twitter文案 + 视频脚本 + +**架构说明**: +- n8n 只能读写容器内的 `/home/node/.n8n-files/` 目录 +- OpenClaw 负责文件搬运:复制到 n8n → 触发 → 复制回 Obsidian +- 完整设计文档:`~/Obsidian/shenwei/openclaw/yunce/n8n-content-pipeline-workflow.md` + +### 工作流版本 +| 版本 | ID | 状态 | 说明 | +|------|-----|------|------| +| **v5(最新)** | `iOf32aOKvTjfTDSM` | 未激活 | 双输出:Markdown + HTML | +| v3 | `tOGMiC6qOJPOY89E` | 活跃 | 单输出(Markdown) | + +### 调用前的文件准备 +n8n 的 Read/Write File 节点使用 `/home/node/.n8n-files/` 目录,**不是** Obsidian 目录。 + +``` +n8n 容器内路径: /home/node/.n8n-files/ +MacMini Obsidian: /Users/weishen/Workspace/nexus/openclaw/ +``` + +### OpenClaw 完整调用流程 + +#### 第一步:复制原文到 n8n-files +```bash +# SSH 到 MacMini,将源文件复制到 n8n 容器可访问的目录 +scp /Users/weishen/Workspace/nexus/openclaw/content-queue/{文件名}.md \ + macmini:/home/node/.n8n-files/{文件名}.md +``` + +#### 第二步:触发 Webhook +```bash +# 注意:v5 使用 /content-translation-v5 +# note_name = n8n-files 里的文件名 +# output_name = 输出的文件名(不含扩展名) +# source_path = Obsidian 原文路径(用于记录溯源) + +curl -X POST "https://n8n.ishenwei.online/webhook/content-translation-v5" \ + -H "Content-Type: application/json" \ + -d "{ + \"note_name\": \"{文件名}.md\", + \"output_name\": \"{文件名}\", + \"source_path\": \"/Users/weishen/Workspace/nexus/openclaw/content-queue/{文件名}.md\", + \"callback_url\": \"http://192.168.3.189:18789/webhook/yunce\" + }" +``` + +#### 第三步:等待 Telegram 通知 +- Telegram Bot (`y1NdRSaJwl0LoY37`) 会发送完成消息 +- 消息格式:`✅ 文章转换完成!📝 标题:xxx` + +#### 第四步:复制输出回 Obsidian +```bash +# 复制 Markdown 成品 +scp macmini:/home/node/.n8n-files/{output_name}_output.md \ + /Users/weishen/Workspace/nexus/openclaw/content-output/{output_name}.md + +# 复制 HTML 成品(公众号用) +scp macmini:/home/node/.n8n-files/{output_name}_output.html \ + /Users/weishen/Workspace/nexus/openclaw/content-output/{output_name}.html +``` + +#### 第五步:清理 n8n-files 临时文件 +```bash +ssh macmini "rm /home/node/.n8n-files/{文件名}.md \ + /home/node/.n8n-files/{output_name}_output.md \ + /home/node/.n8n-files/{output_name}_output.html" +``` + +### 完整 Python 调用示例 +```python +import subprocess +import time +import json + +def trigger_content_translation(source_note_name, source_path, output_name): + """完整的内容翻译流水线调用""" + + n8n_files_dir = "/home/node/.n8n-files" + obsidian_root = "/Users/weishen/Workspace/nexus/openclaw" + + # ========== 第一步:复制原文到 n8n ========== + source_full_path = f"{obsidian_root}/content-queue/{source_note_name}" + print(f"[1/5] 复制原文到 n8n-files: {source_note_name}") + subprocess.run([ + 'scp', source_full_path, + f'macmini:{n8n_files_dir}/{source_note_name}' + ], check=True) + + # ========== 第二步:触发 Webhook ========== + print(f"[2/5] 触发 n8n 工作流...") + webhook_url = "https://n8n.ishenwei.online/webhook/content-translation-v5" + payload = json.dumps({ + "note_name": source_note_name, + "output_name": output_name, + "source_path": source_path, + "callback_url": "http://192.168.3.189:18789/webhook/yunce" + }) + subprocess.run([ + 'curl', '-X', 'POST', webhook_url, + '-H', 'Content-Type: application/json', + '-d', payload + ], check=True) + + # ========== 第三步:等待处理 ========== + print("[3/5] 等待 Telegram 完成通知...") + # Agent 应等待 Telegram 消息后再继续 + time.sleep(5) # 示意用,实际应监听 Telegram + + # ========== 第四步:复制输出回 Obsidian ========== + print(f"[4/5] 复制输出到 content-output...") + output_md = f"{n8n_files_dir}/{output_name}_output.md" + output_html = f"{n8n_files_dir}/{output_name}_output.html" + dest_root = f"{obsidian_root}/content-output" + + subprocess.run(['scp', f'macmini:{output_md}', f'{dest_root}/{output_name}.md'], check=True) + subprocess.run(['scp', f'macmini:{output_html}', f'{dest_root}/{output_name}.html'], check=True) + + # ========== 第五步:清理 ========== + print(f"[5/5] 清理 n8n-files...") + subprocess.run(['ssh', 'macmini', f'rm {n8n_files_dir}/{source_note_name} {output_md} {output_html}']) + + print(f"✅ 完成!输出: {dest_root}/{output_name}.md + .html") + +# 调用示例 +trigger_content_translation( + source_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" +) +``` + +### Obsidian 目录结构 +``` +~/Workspace/nexus/openclaw/ +├── content-queue/ # 原始英文文章 +│ └── article-2026-03-29.md +│ +└── content-output/ # 翻译成品(Markdown + HTML) + ├── article-2026-03-29.md # 中文 Markdown(留存溯源) + └── article-2026-03-29.html # 公众号 HTML(直接复制粘贴) +``` + +### 输出文件说明 +| 文件 | 格式 | 用途 | +|------|------|------| +| `*.md` | 中文 Markdown | Obsidian 留存、溯源、可修改 | +| `*.html` | 带样式 HTML | 复制到公众号编辑器,几乎零调整 | + +### 常见问题 +**Q: n8n API 返回 401?** +A: 检查 `~/.openclaw/.env` 里的 `N8N_API_KEY` 是否完整(应为 3 段 JWT) + +**Q: 文件复制到 n8n-files 失败?** +A: 确认 MacMini 上 `/home/node/.n8n-files/` 目录存在且有写权限 + +**Q: 如何查看工作流状态?** +A: 用 `n8n_api.py list-executions --id --limit 10 --pretty` 查看最近执行 \ No newline at end of file