# Yinxiang Notes

> 印象笔记（中国版）集成技能。使用 Developer Token 在印象笔记中创建、整理和搜索笔记。支持笔记本列表、创建笔记、更新笔记内容/标签、删除笔记、搜索内容、增量同步到 Obsidian vault。

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

---


# 印象笔记集成

## 快速开始

### 前置条件

1. **Developer Token**：从 https://app.yinxiang.com/api/DeveloperToken.action 获取
2. **Python 环境**：需要 Python 3.7+
3. **SDK 安装**：
   ```bash
   pip install evernote3 thrift html2text
   ```

### 配置

在 `.env` 文件中设置：
```
EVERNOTE_TOKEN=S=s16:U=xxx:E=xxx:C=xxx:P=xxx:A=en-devtoken:V=2:H=xxx
EVERNOTE_NOTESTORE_URL=https://app.yinxiang.com/shard/s16/notestore
```

## 核心功能

### 1. 获取笔记本列表

```bash
python skills/yinxiang-notes/scripts/list_notebooks.py
python skills/yinxiang-notes/scripts/list_notebooks.py --verbose  # 显示每个笔记本的笔记数量
```

### 2. 获取标签列表

```bash
python skills/yinxiang-notes/scripts/list_tags.py
```

### 3. 创建笔记

```bash
python skills/yinxiang-notes/scripts/create_note.py --title "标题" --content "<en-note>内容</en-note>"
# 指定笔记本
python skills/yinxiang-notes/scripts/create_note.py --title "标题" --content "<en-note>内容</en-note>" --notebook "笔记本名"
# 添加标签
python skills/yinxiang-notes/scripts/create_note.py --title "标题" --content "<en-note>内容</en-note>" --tags "标签1,标签2"
```

ENML 格式说明：
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">
<en-note>
    笔记内容...
    <en-todo checked="false">待办事项</en-todo>
</en-note>
```

### 4. 更新笔记

```bash
# 更新标题
python skills/yinxiang-notes/scripts/update_note.py --guid "笔记GUID" --title "新标题"
# 更新内容
python skills/yinxiang-notes/scripts/update_note.py --guid "笔记GUID" --content "<en-note>新内容</en-note>"
# 添加标签
python skills/yinxiang-notes/scripts/update_note.py --guid "笔记GUID" --add-tags "标签1,标签2"
# 移除标签
python skills/yinxiang-notes/scripts/update_note.py --guid "笔记GUID" --remove-tags "标签3"
# 组合操作
python skills/yinxiang-notes/scripts/update_note.py --guid "笔记GUID" --title "新标题" --add-tags "标签1"
```

### 5. 删除笔记（移至废纸篓）

```bash
# 预览（不实际删除）
python skills/yinxiang-notes/scripts/delete_note.py --guid "笔记GUID"
# 确认删除（移至废纸篓，可在客户端恢复）
python skills/yinxiang-notes/scripts/delete_note.py --guid "笔记GUID" --confirm
```

**删除行为说明**：
- `delete_note.py` 使用 `deleteNote` API，将笔记移至废纸篓，可在印象笔记客户端中恢复
- 清空废纸篓后笔记才永久删除（见下方"清空废纸篓"）

### 6. 搜索笔记

```bash
python skills/yinxiang-notes/scripts/search_notes.py "关键词"
python skills/yinxiang-notes/scripts/search_notes.py "标题:关键词"
python skills/yinxiang-notes/scripts/search_notes.py "any:关键词1 关键词2"
```

搜索语法：
- `关键词` — 在标题和正文中搜索
- `标题:关键词` — 仅搜索标题
- `创建时间:2024-01-01` — 按创建时间筛选
- `any:关键词1 关键词2` — 匹配任一关键词

### 7. 同步到 Obsidian（增量同步）

将印象笔记增量同步到本地 Obsidian vault，保持笔记本层级结构。

**目标 vault**：`C:\Users\adun\Documents\印象笔记同步`

```bash
# 同步全部笔记本
python skills/yinxiang-notes/scripts/sync_to_obsidian.py

# 只同步指定笔记本
python skills/yinxiang-notes/scripts/sync_to_obsidian.py --notebook "笔记本名"
python skills/yinxiang-notes/scripts/sync_to_obsidian.py -n "笔记本名"
```

**同步规则**：

| 笔记类型 | 判断条件 | 处理方式 |
|----------|----------|----------|
| 📎 附件笔记 | 资源有 fileName+扩展名 | enml_to_markdown + 附件 section |
| 🖼 内嵌图片笔记 | 有 en-media 但无 fileName | html2text 转 Markdown + 附件 section |
| 📝 纯文本笔记 | 无大量 HTML 标签和 en-media | 直接转为 Markdown |
| 📄 网页裁剪（短） | HTML ≥3个标签且 < 200KB | html2text 转为 Markdown |
| 🔗 网页裁剪（长） | HTML ≥3个标签且 ≥ 200KB 且纯 HTML（无用户手写内容） | 存 HTML 进 `_clips/` |

**附件存储**：每个笔记本有独立的附件和裁剪目录
```
印象笔记同步/
├── 笔记本A/
│   ├── 笔记.md
│   ├── _attachments/   ← 该笔记本附件（hash 去重）
│   └── _clips/         ← 该笔记本 HTML 裁剪（≥5KB）
├── 笔记本B/
│   ├── 笔记.md
│   ├── _attachments/
│   └── _clips/
└── .obsidian/
```

**同步后笔记的 frontmatter**：
```yaml
---
title: 笔记标题
created: 2026-03-19 10:30:00
updated: 2026-03-19 14:22:00
source: Evernote
source_guid: xxx-xxx-xxx
notebook: 笔记本名
type: webclip  # 仅网页裁剪（≥200KB）和内嵌图片笔记有此字段
---
```

**特性**：
- 增量同步：仅同步新增和变化的笔记
- 断点续传：遇到 API 频率限制自动保存进度
- 每次最多同步 50 条，避免触发限流
- 支持命令行参数控制同步行为（`--notebook` 指定笔记本）
- 使用 html2text 库进行 HTML 转 Markdown 转换

### 8. 查看废纸篓

```bash
python skills/yinxiang-notes/scripts/list_trash.py
```

### 9. 清空废纸篓（永久删除）

```bash
python skills/yinxiang-notes/scripts/empty_trash.py
```

⚠️ **警告**：此操作会永久删除废纸篓中的所有笔记，**无法恢复**！

## 完整脚本列表

| 脚本 | 功能 |
|------|------|
| `list_notebooks.py` | 获取笔记本列表（支持 --verbose 显示笔记数） |
| `list_tags.py` | 获取标签列表 |
| `create_note.py` | 创建笔记 |
| `update_note.py` | 更新笔记（标题/内容/标签） |
| `delete_note.py` | 删除笔记（移至废纸篓） |
| `search_notes.py` | 搜索笔记 |
| `get_note_content.py` | 获取笔记内容预览和纲要 |
| `sync_to_obsidian.py` | 增量同步印象笔记到 Obsidian vault |
| `list_trash.py` | 查看废纸篓中的笔记 |
| `empty_trash.py` | 清空废纸篓（永久删除） |

### 10. 获取笔记内容预览和纲要

```bash
# 通过标题获取
python skills/yinxiang-notes/scripts/get_note_content.py --title "笔记标题"

# 通过 GUID 获取
python skills/yinxiang-notes/scripts/get_note_content.py --guid "笔记GUID"
```

返回内容预览（1000字）和自动提取的纲要。

## API 端点

| 环境 | NoteStore URL |
|------|---------------|
| 生产环境 | https://app.yinxiang.com/shard/s16/notestore |
| 沙盒环境 | https://sandbox.yinxiang.com/shard/s1/notestore |

## 错误处理

| 错误码 | 说明 | 解决方案 |
|--------|------|----------|
| EDAMUserException (errorCode=2) | Token 无效或过期 | 重新申请 Developer Token |
| EDAMNotFoundException | 资源不存在 | 检查笔记 GUID 或笔记本名 |
| EDAMSystemException (errorCode=19) | API 频率限制 | 等待限流窗口后重试，脚本会自动处理 |

## 注意事项

- Token 仅显示一次，请妥善保存
- **API 频率限制**：Evernote API 有每小时调用次数限制，同步脚本内置限流保护（每次获取笔记间隔 1 秒），避免触发限制
- **删除**：调用 `deleteNote` 移至废纸篓；调用 `expungeNote` 或清空废纸篓会永久删除
- **网页裁剪（≥200KB）**：Obsidian 中点击笔记内的嵌入链接查看原始 HTML，建议安装 HTML Reader 插件以获得更好渲染效果

