/youdaonote

有道云笔记导出

Primary LanguagePythonMIT LicenseMIT

youdaonote-pull

此脚本可将有道云的所有的笔记下载到本地。代码参考了 youdaonote-pull,目前新建有道云笔记爬取下来的格式为JSON,以前的是xml格式,而youdaonote-pull 目前不支持JSON格式的转换,因此此脚本添加json格式的转换。脚本转换了一些常用的格式,例如,标题、加粗、表格、图片、文件、列表等,有些格式和属性可能没有考虑到,笔记可能有些缺失,下载下来后,请检查一下。

功能

  • 可将所有笔记(文件)按原格式下载到本地
  • 有道云的正常笔记爬取后是 xmljson格式,不是正常笔记内容,需要将其转换为 Markdown格式
  • 由于有道云笔记图床图片不能在有道云笔记外显示,默认将其下载到本地,或指定上传到 SM.MS

使用步骤

一、导出前的准备工作

1、安装 Git、clone 项目

git --version
  • 打开命令行软件,如 Terminal (macOS)、PowerShell (Windows),clone 项目,里面包含脚本
git clone https://github.com/chunxingque/youdaonote-pull.git
cd youdaonote-pull

2、安装 Python3、安装依赖模块(包)

python3 --version  # macOS/Linux
python --version   # Windows
  • 安装依赖包
# macOS
sudo easy_install pip3      # 安装 Python3 Package Installer
sudo pip3 install -r requirements.txt

# 虚拟环境
python3 -m venv app-venv
# Windows
pip install -r requirements.txt

# 有问题可参考 https://www.liaoxuefeng.com/wiki/1016959663602400/1017493741106496

# 虚拟环境
app-venv/bin/pip install -r requirements.txt

3、设置登录 Cookies 文件 cookies.json

{
    "cookies": [
        [
            "YNOTE_CSTK",
            "**",
            ".note.youdao.com",
            "/"
        ],
        [
            "YNOTE_LOGIN",
            "**",
            ".note.youdao.com",
            "/"
        ],
        [
            "YNOTE_SESS",
            "**",
            ".note.youdao.com",
            "/"
        ]
    ]
}

由于有道云笔记登录升级,目前脚本不能使用账号密码登录,只能使用 Cookies 登录。

获取 Cookies 方式:

  1. 在浏览器如 Chrome 中使用账号密码或者其他方式登录有道云笔记
  2. 打开 DevTools (F12),Network 下找「主」请求(一般是第一个),再找 Cookie
  3. 复制对应数据替换 **

image.png

示例:

{
    "cookies": [
        [
            "YNOTE_CSTK",
            "rR_Pejz0",
            ".note.youdao.com",
            "/"
        ],
        [
            "YNOTE_LOGIN",
            "3||1649054441155",
            ".note.youdao.com",
            "/"
        ],
        [
            "YNOTE_SESS",
            "v2|BdllbnwfaWl5RMUWOfqZ0gShf***6LqFRqB0MYfh4JLR",
            ".note.youdao.com",
            "/"
        ]
    ]
}

Cookie获取js脚本

用上面的方式寻找Cookie让人眼瞎
因此编写此脚本
使用方式:
浏览器F12打开开发者工具,找到控制台把脚本粘贴进去,替换tmp_cookie的值
回车,即可得到一份身份认证Cookie配置文件
(YNOTE_SESS属性有HttpOnly属性,不然这个脚本可以更简单)

var tmp_cookie = '这里把上图Cookie属性的值丢进来'

function getCookies() {
    var cookies = tmp_cookie.split(';');
    var result = [];
    for (var i = 0; i < cookies.length; i++) {
        var cookie = cookies[i].trim();
        var parts = cookie.split('=');
        var name = parts[0];
        var value = parts[1];
        if (name === 'YNOTE_CSTK' || name === 'YNOTE_LOGIN' || name === 'YNOTE_SESS') {
            result.push([name, value, '.note.youdao.com', '/']);
        }
    }
    return result;
}

function formatCookies(cookies) {
    return {
        cookies: cookies
    };
}

var cookies = getCookies();
var formattedCookies = formatCookies(cookies);
// 网站屏蔽了日志或者设置了console的日志级别,因此这里使用warn级别,可以正常打印
console.warn(JSON.stringify(formattedCookies, null, 2))
  • 提示:脚本单纯本地运行,不用担心你的 Cookies 泄露

4、设置脚本参数配置文件 config.json

建议使用 Sublime 等三方编辑器编辑 config.json,避免编码格式错误

{
    "local_dir": "",
    "ydnote_dir": "",
    "smms_secret_token": "",
    "is_relative_path": true
}
  • local_dir:选填,本地存放导出文件的文件夹,不填则默认为当前文件夹
  • ydnote_dir:选填,有道云笔记指定导出文件夹名,不填则导出所有文件,只支持有道云笔记根目录的文件夹,不支持直接导出子目录的笔记
  • smms_secret_token:选填, SM.MSSecret Token(注册后 -> Dashboard -> API Token),用于上传笔记中有道云图床图片到 SM.MS 图床,不填则只下载到本地(youdaonote-images 文件夹),Markdown 中使用本地链接
  • is_relative_path:选填,在 MD 文件中图片 / 附件是否采用相对路径展示,不填或 false 为绝对路径,true 为相对路径

示例:

  • macOS
{
    "local_dir": "/Users/deppwang/Documents/youdaonote-pull/test",
    "ydnote_dir": "",
    "smms_secret_token": "SGSLk9yWdTe4RenXYqEPWkqVrx0Yexample"
}
  • Windows
{
    "local_dir": "D:/Documents/youdaonote-pull/test",
    "ydnote_dir": "",
    "smms_secret_token": "SGSLk9yWdTe4RenXYqEPWkqVrx0Yexample"
}

二、运行导出脚本

python3 pull_notes.py  # macOS/Linux
python  pull_notes.py  # Windows
app-venv/bin/python pull_notes.py # 虚拟环境

如果某个笔记拉取失败,可能是笔记格式比较旧,可以新建一个新笔记,把旧笔记内容复制到新笔记,重新拉取,基本都可以解决。

建议笔记名称不要使用特殊符号,例如:#、/、:、空格、英文括号等,可以使用_和-符号替代,不然容易报错

三、多次导出

多次导出时,同样使用以下命令:

python3 pull_notes.py  # macOS/Linux
python  pull_notes.py   # Windows

根据有道云笔记文件最后修改时间是否大于本地文件最后修改时间来判断是否需要更新。再次导出时,只会导出有道云笔记上次导出后新增、修改或未导出的笔记,不会覆盖本地已经修改的文件。但有道云笔记和本地不要同时修改同一个文件,这样可能会导致本地修改丢失

更新时,会重新下载文件并覆盖原文件,图片也会重新下载。

注意事项

  1. 如果你自己修改脚本,注意不要将 cookies.json 文件 push 到 GitHub
  2. 如果你不是开发者,可能对上面的命令行操作有所陌生,建议按步骤慢慢操作一遍
  3. 请确认代码是否为最新,有问题请先看 issue 是否存在,不存在再提 issue
    git pull origin master  # 更新代码

正常用户浏览器操作时,浏览器(前端)调用服务器(后端)接口,接口返回文件内容由前端渲染显示。原理是找到有道云笔记的接口,模拟操作接口,将前端显示改为存放到本地。Xml 转换为 Markdown,借助了 xml.etree.ElementTreeI

感谢(参考)