chunxingque / youdaonote-pull

有道云笔记导出
MIT License
76 stars 22 forks source link
youdaoyun

[toc]

youdaonote-pull

此脚本可将有道云的所有的笔记下载到本地,可以作为有道云笔记的迁移或者本地备份。脚本参考了 youdaonote-pull,在其基础上添加了json格式的转换。目前新建有道云笔记爬取下来的格式为JSON,以前的是xml格式。脚本转换了一些常用的格式,例如,标题、加粗、表格、图片、文件、列表、下划线、颜色等,有些格式和属性可能没有考虑到,笔记可能有些缺失,下载下来后,请检查一下。

功能

常用功能

功能优化

图片名字方案

使用步骤

导出前的准备工作

1、安装 Git、clone 项目

git --version
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))

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

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

{
    "local_dir": "",
    "ydnote_dir": "",
    "smms_secret_token": "",
    "is_relative_path": true
}

示例:

{
    "local_dir": "/Users/deppwang/Documents/youdaonote-pull/test",
    "ydnote_dir": "",
    "smms_secret_token": "SGSLk9yWdTe4RenXYqEPWkqVrx0Yexample",
    "is_relative_path": true
}
{
    "local_dir": "D:/Documents/youdaonote-pull/test",
    "ydnote_dir": "",
    "smms_secret_token": "SGSLk9yWdTe4RenXYqEPWkqVrx0Yexample",
    "is_relative_path": true
}

运行导出脚本

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

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

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

代码调试

JSON格式转换调试

目前有道云新版的笔记采用JSON格式,转换JSON格式出现问题时,需要提供详细内容和截图等,有能力的,登录有道云的web端,获取有问题笔记的JSON文件,提供给我,方便我代码调试。

有道云JSON格式: test/test.json

转换好的md文件:test/test.md

格式转换测试

python3 core/convert.py

json数据格式说明

有道云接口说明

获取笔记接口:https://note.youdao.com/yws/api/personal/sync

注意事项

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

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

感谢(参考)