# Youdaonote Clip

> 网页剪藏到有道云笔记。触发词：剪藏网页、保存网页、收藏网页。

- Skill: `lihanghang/youdaonote-clip` (Agent Skill, multi-file: 12 files)
- Install (CLI): `npx skillmds@latest add lihanghang/youdaonote-clip`
- Raw SKILL.md: https://api.skillmd.com/api/skills/lihanghang/youdaonote-clip/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: lihanghang (https://skillmd.com/u/lihanghang)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/lihanghang/youdaonote-clip

---


# YoudaoNote Clip — 网页剪藏
将网页稳定保存到有道云笔记。核心原则：**优先成功率，其次才是速度**。
**并发限制**：本 Skill **不支持并发执行**。同一次请求里若有多个 URL，必须**逐个串行**处理，前一个完成后再处理下一个。
**先回复**：`正在保存中...`

## 路由判断

按优先级命中第一条即可：

| 优先级 | 条件 | 路径 |
|--------|------|------|
| 1 | URL 为 `x.com` / `twitter.com` 且含 `/status/` | 路径 A |
| 2 | 知乎文章、微信公众号、掘金、36kr、少数派、CSDN、163/qq 资讯正文页（正文可服务端直接抓取）；首页/搜索页/话题流/登录后页面**不走此路径** | 路径 B |
| 3 | **所有其他页面**（默认路径，必须先尝试浏览器提取） | 路径 C |

## 路径 A — Twitter 专用流程

```bash
node {baseDir}/twitter-apify.mjs --url "<URL>"
```
成功标准：stdout 输出 metadata JSON，且 `/tmp/youdaonote-clip-data.json` 已生成。

```bash
bash {baseDir}/clip-note.sh --data-file /tmp/youdaonote-clip-data.json --source-url "<URL>"
```
stdout 含 `{"ok":true` → **进入响应格式**。

## 路径 B — 国内快速路径

```bash
bash {baseDir}/clip-note.sh --clip-web-page --source-url "<URL>"
```
stdout 含 `{"ok":true` → **进入响应格式**。若报超时、MCP 调用失败、unknown tool、内容明显不完整，立即降级到**路径 C**。

## 路径 C — 浏览器提取（含降级）

**第一步**：优先使用浏览器提取（支持 SPA 动态渲染、懒加载图片、JS 生成内容）。不建议直接用 web_fetch 替代，因为 web_fetch 只能获取原始 HTML，无法提取客户端渲染的页面内容。

```bash
bash {baseDir}/collect-page.sh "<URL>"
```
stdout 最后一行为 metadata JSON 且 `contentLength > 0` → **提取成功**，执行：

```bash
bash {baseDir}/clip-note.sh --data-file /tmp/youdaonote-clip-data.json --source-url "<URL>"
```
stdout 含 `{"ok":true` → **进入响应格式**。

**当 collect-page.sh 报错时**（CSP、空内容、browser 不可用、timeout 等），降级为 web_fetch：

1. `web_fetch(url="<URL>", extractMode="markdown")`
2. 写入 `/tmp/youdaonote-clip-data.json`：`{"title":"页面标题","content":"<Markdown>","imageUrls":[],"source":"<URL>"}`

```bash
bash {baseDir}/clip-note.sh --data-file /tmp/youdaonote-clip-data.json --markdown --source-url "<URL>"
```
stdout 含 `{"ok":true` → **进入响应格式**。

## 响应格式

成功后回复：

```markdown
📎 **网页剪藏完成**

| 项目 | 详情 |
|------|------|
| 📌 标题 | {实际页面标题或保存标题} |
| 🔗 来源网址 | {原始 URL} |
| ⏰ 剪藏时间 | {yyyy-MM-dd HH:mm} |

> 标题以实际保存结果为准
```

不要编造“保存位置”或文件夹信息。当前链路默认保存为普通笔记，除非底层命令明确返回了可确认的位置。

## 剪藏后引导（可选）

```bash
mcporter call youdaonote.getRecentFavoriteNotes --args '{"limit":3}' --output json
openclaw cron list --json | jq '.[] | select(.name == "youdaonote-news")'
```

若收藏 ≥3 篇且未设置资讯推送，可追加：`💡 你已经收藏了 N 篇文章，试试说「资讯推送」看看 AI 为你整理的简报吧～`

## 调试

设置环境变量 `YOUDAONOTE_CLIP_DEBUG` 为日志目录路径即可开启调试模式：

```bash
# 在 ~/.zshrc 或 ~/.bashrc 中配置
export YOUDAONOTE_CLIP_DEBUG="~/logs/youdaonote-clip"

# 或临时开启
YOUDAONOTE_CLIP_DEBUG="~/logs/youdaonote-clip" bash clip-note.sh ...
```

`YOUDAONOTE_API_KEY`、`YOUDAONOTE_CLIP_DEBUG` 请在 OpenClaw config 的 `skills.entries["youdaonote-clip"].env` 中配置，执行时会注入为 process.env；或在 shell 中 export。

调试日志按 key 分目录存储：`{DEBUG_DIR}/{key}/main.log`（clip-note）、`twitter.log`、`collect.log`。各 path 首行会输出路径标识（A/B/C/D），便于排查。key 由首个脚本生成并写入 data-file 的 `_debugKey` 字段，串联整条剪藏流程。通过 perf-test/run-clip.sh 测试时，脚本会 export 该变量，日志写入可预期目录。

调试日志经过脱敏处理：不记录完整页面内容，仅记录长度和前 200 字符摘要。

## 安全说明

**浏览器提取**：路径 C 使用 `openclaw browser evaluate` 在目标页面中注入内容解析脚本（inject-sdk.fn.js），用于提取正文、标题和图片列表。该脚本完全内联在 Skill 包中（不加载外部 CDN），代码可审计。注入仅用于读取 DOM 内容，不修改页面、不发送网络请求、不访问 cookie 或 localStorage。

**调试模式**：默认关闭。开启后仅写入脱敏的元数据（标题、URL、内容长度），不写入完整页面内容。

**环境变量**：核心模块 clip-note.mjs 不直接读取 `process.env`，由 `clip-note.sh` 从环境变量读取后通过命令行参数传入。`twitter-apify.mjs` 从 `process.env` 读取 `APIFY_API_TOKEN`（可选，仅 Twitter/X 路径使用）和 `YOUDAONOTE_CLIP_DEBUG`（可选，调试模式）。`collect-page.sh` 内联 Node 代码从 `process.env` 读取 `YOUDAONOTE_CLIP_DEBUG`。所有环境变量均由 OpenClaw 执行时从 `skills.entries["youdaonote-clip"].env` 注入。


