Merge branch 'main' of ssh://192.168.3.45:2222/admin/nexus
This commit is contained in:
16
openclaw/xingshu/memory/2026-03-30.md
Normal file
16
openclaw/xingshu/memory/2026-03-30.md
Normal file
@@ -0,0 +1,16 @@
|
||||
# 2026-03-30 每日记忆
|
||||
|
||||
## 今日事件
|
||||
|
||||
### 会话启动
|
||||
- 时间:上午 10:51 AM
|
||||
- 触发:新会话启动 (Telegram direct)
|
||||
|
||||
### 失职记录
|
||||
- ⚠️ 未遵循 AGENTS.md "每日必做"规程
|
||||
- 应于首次对话时自动创建 `memory/2026-03-30.md`,实际未执行
|
||||
- 经用户提醒后补建
|
||||
|
||||
### 待跟进
|
||||
- [ ] 无
|
||||
|
||||
@@ -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 到指定 URL(OpenClaw 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` 供脚本读取
|
||||
|
||||
Reference in New Issue
Block a user