Skip to content

zch200/yinxiang2md

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

yinxiang2md

把印象笔记 / Evernote 老版 Mac 客户端已同步到本地的笔记数据批量导出为 Markdown。 无需手动逐个导出 ENEX,无需申请 API token,一条命令导出全部笔记。

Export all notes from the legacy Yinxiang Biji (印象笔记) / Evernote Mac client's local data store to Markdown — no manual ENEX export, no API token required. Its unique feature: lossless recovery of the original Markdown source that Yinxiang hides inside ENML for Markdown-mode notes.

为什么有这个工具

  • 新版印象笔记 / Evernote 10.x 客户端阉割了批量 ENEX 导出,几百上千条笔记只能手动逐个复制
  • 印象笔记开发者 token 申请入口时常关闭,API 之路走不通
  • 但只要你装过老版 Mac 客户端(印象笔记 9.x / Evernote Legacy)并完整同步过, 全部笔记的正文、附件、元数据其实都已经在你的硬盘上——本工具直接读它们

Yarleevernote2md 等 ENEX 转换器不同, 本工具解决的是上游问题(拿不到 ENEX),并且有两个独有能力:

  1. Markdown 原生笔记无损还原——印象笔记的 Markdown 笔记会把 MD 原文 URL 编码后藏在 ENML 的隐藏 <center> 块里。普通转换器只能把渲染后的 HTML 有损地转回 Markdown(嵌套列表层级会丢),还会把隐藏块输出成乱码; 本工具直接解码原文,一字不差
  2. 思维导图笔记转文字大纲——导图的 JSON 树同样藏在隐藏块里, 本工具把它解析成嵌套列表,让导图内容变得可搜索、可被 AI 阅读

适用范围

环境 支持
macOS + 印象笔记 9.x(老版客户端) ✅ 已在 9.7.35 上验证
macOS + Evernote Legacy(国际版老客户端) ✅ 理论支持(同架构),欢迎反馈
印象笔记 / Evernote 10.x(新版客户端) ❌ 本地数据结构完全不同
Windows 老版客户端 ❌ 本地存储是另一套(.exb),未逆向

前提:老版客户端至少完整同步过一次(笔记正文需已缓存到本地)。

快速开始

# 只需要 macOS 自带的 Python 3,零依赖
python3 yinxiang2md.py

默认导出到 ~/Desktop/印象笔记导出/,按「笔记本组 - 笔记本」分目录, 图片附件放各目录的 _resources/ 下,每个文件带 frontmatter (创建/更新时间、标签、来源网址),可直接作为 Obsidian vault 打开。

富文本笔记(非 Markdown 模式写的)需要经 ENEX → Markdown 转换, 这一步调用 Yarle,需要 Node.js:

  • 装了 Node:自动完成,无感
  • 没装 Node:富文本笔记输出为标准 ENEX 文件(_enex/ 目录), Markdown 原生笔记不受影响照常导出;之后可装 Node 重跑, 或用 Yarle 图形版自行转换 ENEX

也可以 pipx 安装后用 yinxiang2md 命令:

pipx install .
yinxiang2md --help

常用选项

-o, --output DIR     输出目录(默认 ~/Desktop/印象笔记导出)
--dry-run            只统计笔记分类,不写任何文件,先看看再决定
--no-attachments     只要文字,跳过全部图片/附件
--skip-yarle         不调用 Yarle,富文本笔记仅输出 ENEX
--list-accounts      列出本机检测到的账号
--account N          多账号时指定第 N 个
--account-path DIR   直接指定账号数据目录(高级用法)

工作原理

老版客户端把数据存在 ~/Library/Containers/com.yinxiang.Mac/.../accounts/<host>/<userid>/

  • localNoteStore/LocalNoteStore.sqlite — CoreData 元数据库 (标题、笔记本、标签、时间、附件 hash)
  • content/<笔记UUID>/content.enml — 每条笔记的 ENML 正文
  • content/<笔记UUID>/<附件UUID>.* — 附件原始文件

工具全程只读这些数据(数据库先复制到临时目录再访问,绝不碰原文件),然后:

  1. 解析每条笔记的隐藏块,分类为「MD 原生 / 富文本 / 含思维导图」
  2. MD 原生:解码原文,按附件 hash 重写图片引用并落地文件
  3. 富文本:组装标准 ENEX(隐藏块在源头剥离,避免乱码),交给 Yarle 转换
  4. 思维导图:JSON 树渲染为嵌套列表,附在对应笔记末尾

CoreData 的关联表名(如 Z_10TAGS)随客户端版本变化,工具会动态发现而非硬编码。

已知限制

  • 回收站中的笔记不导出
  • 加密笔记(en-crypt)保持加密原样
  • 笔记间链接(evernotecid://...ENNote...)原样保留,不转为相对路径
  • 网页剪藏类笔记的转换质量取决于 Yarle,原网页自带的脚本残留可能出现在正文中

测试

python3 tests/test_basic.py

测试使用合成数据,不需要真实的印象笔记环境,也不需要 Node.js。

致谢

  • Yarle 完成富文本 ENEX → Markdown 的转换
  • 隐藏 MD 原文块、思维导图 JSON 的格式细节来自对印象笔记 9.7.35 本地数据的逆向分析

License

MIT

About

把印象笔记/Evernote 老版 Mac 客户端的本地数据批量导出为 Markdown,支持 MD 原生笔记无损还原与思维导图转大纲

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages