Git Product home page Git Product logo

youdaonote-pull's Introduction

最近在玩 X(Twitter),欢迎关注!

youdaonote-pull

现在有道云笔记不能导出笔记,迁移笔记很麻烦。此脚本可将所有笔记下载到本地。脚本完全本地运行,你不用担心数据安全。

功能

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

使用步骤

一、导出前的准备工作

1、安装 Git、clone 项目

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

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

python3 --version  # macOS/Linux
python --version   # Windows
  • 安装依赖包
# macOS
sudo easy_install pip3      # 安装 Python3 Package Installer
python3 -m venv venv        # 使用虚拟环境
. venv/bin/activate         # 激活虚拟环境
sudo pip3 install -r requirements.txt
# Windows
python -m venv venv         # 使用虚拟环境
. venv/bin/activate         # 激活虚拟环境
pip install -r requirements.txt

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

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",
            "/"
        ]
    ]
}
  • 提示:脚本完全本地运行,不用担心你的 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.py  # macOS/Linux
python pull.py   # Windows

效果:

image-20240430154201191

三、多次导出

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

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

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

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

注意事项

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

原理

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

感谢(参考)

出发点

原来一直是有道云笔记的忠实用户,后面接触到了「所见即所得」的 Typora,有点用不惯有道云笔记了,想着有什么法子能电脑本地文件和有道云笔记同步,这样电脑使用 Typora,手机使用有道云笔记。发现有道云笔记有 Open API ,打算利用提供的 API,写两个脚本,一个 pull 所有文件到本地,一个 push 本地文件到云笔记。但 API 太难用了,N 多年没更新了,问客服也没更新的意思,开发到最后发现竟然没有 Markdown 文件的接口,醉了。遂放弃。

发现有道云笔记最新的 Mac 客户端和网页端去除了导出所有笔记的功能!这是什么逻辑,怕用户跑了么。所以在原来 pull 脚本的基础上修改得到此脚本。

现在我使用 Obsidian + GitHub + Working Copy 实现自动同步笔记和手机查看编辑的功能,很香。使用教程

贡献

欢迎贡献代码,但有几个注意事项:

  1. commit 请使用英文;一次 commit 只改一个点;一个 commit 一个 PR
  2. 代码注释需要有中英文空格
  3. 请确保通过测试用例:在 macOS 和 Windows 环境中直接执行 python3 test/test.py 没有问题

youdaonote-pull's People

Contributors

bugkun avatar byronhe avatar chi-bin avatar deppwang avatar hongyan789 avatar lcaird avatar moernie avatar windyalexq avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

youdaonote-pull's Issues

not enough arguments for format string

脚本执行一半遇到这个问题:
RuntimeError Expected object of device type cuda but got device ty.md ,「云笔记原格式为 .note」
not enough arguments for format string

保存到本地的笔记中的图片路径错误

保存到本地的笔记初根目录的外,其余所有目录下的笔记中的图片路径都缺少了一个层级,导致图片无法显示。
如:markdown中写的是

![](./youdaonote-images/XXXXXXXXX.png)

而实际的路径应该是../youdaonote-images/XXXXXXXXX.png

not enough arguments for format string

如题,导出某些文件时抛错:

not enough arguments for format string
已终止执行

似乎是转换有道云图床的图片到本地的时候抛的。

缺少标题和内部样式转换

  1. 可以加上heading 标题级别,里面的level 代表标题级别,a是大标题,1-6是标题机
        <heading compat="true" level="2">
            <coId>7740-1543502828194</coId>
            <text>1.2 元注解</text>
            <inline-styles>
                <bold>
                    <from>0</from>
                    <to>7</to>
                    <value>true</value>
                </bold>
                <font-size>
                    <from>0</from>
                    <to>7</to>
                    <value>20</value>
                </font-size>
            </inline-styles>
            <styles/>
        </heading>
  1. 可以加上行内元素, inline-styles标签里面有加粗、颜色还有下划线倾斜啥的,感觉都可以加上去。
        <para>
            <coId>5866-1543505640634</coId>
            <text>定义注解成员的注意点</text>
            <inline-styles>
                <bold>
                    <from>0</from>
                    <to>10</to>
                    <value>true</value>
                </bold>
                <color>
                    <from>0</from>
                    <to>4</to>
                    <value>#df402a</value>
                </color>
				 <color>
                    <from>5</from>
                    <to>10</to>
                    <value>#df412a</value>
                </color>
            </inline-styles>
            <styles/>
        </para>
  1. catalogue标签 感觉多个catalogue 只取第一个用 [toc] 目录替代,其余的扔掉即可
    十分感觉,找了好久,可以贴一下赞助码啥的。

当前版本要求所有参数都填写,没有选填参数

代码中的45行

    if not username or not password or not local_dir or not ydnote_dir or not smms_secret_token:
        raise KeyError('请检查「config.json」的 key 是否分别为 username, password, local_dir, ydnote_dir, smms_secret_token')

中文乱码问题

自定义要导出的文件目录,程序读取信息需要设置成“utf-8”,否则会出现中文乱码匹配不上文件夹名
with open('config.json', 'r',encoding="utf-8")
其他读写文件的地方,建议都改成utf-8

图片下载建议

建议图片下载到markdown文件同目录,或者只md文件的目录下,建一个和md文件同名的目录放这个md文件的图片,这样比较方便分享单个或者一个目录给别人,谢谢!

如何才能让图片放到md里面呢?

现在的导出是将图片统一放到youdao-images这个文件夹里,然后md里面引用本地链接。不过这样就导致文件过大时,迁移笔记很容易失败。
请问有没有办法能够让图片直接下载到md和文字在一起。这样我就可以分批导入文件,既不用担心没文字,也不用担心文件过大迁移失败了。

大佬 看一下

我分别在git环境和python环境下输入了pullAll那句话,都报错了呢,帮忙看一下吧

微信图片_20200604190041
微信图片_20200604190046

网页转存文件导出后显示为未知文件

首先导出顺利,感谢脚本。
但是发现仍有一种类型的笔记导出结果为不带扩展名的文件,比如下方这则来自微信公众号的笔记:
http://note.youdao.com/noteshare?id=1041bc6f2596ca150b57edccc971d142&sub=96F960F7AF674D24BE8C6523E3051851
其实就是一则平白的图文公众号,导出后变成一个所附近压缩文件中的那个未知文件。
类似的笔记我还有很多。
不知道是否有一个原因在背后,感谢 !

CmK, Cp 和CpK的计算方法.zip

markdown 格式无法保留原来笔记的颜色和格式

您好,

感谢您的程序,我成功的下载了有道所有的笔记。不过因为我原来的笔记有很多不同的颜色和格式,下载后这些格式在markdown里面无法显示出来。请问有没有可能把所有笔记下载成其他格式呢?

谢谢

感谢分享

可以增加一个修改修改图片 地址为自定义的图床

关于字体

希望可以保留有道云笔记中字体的颜色、加粗等效果

child index out of range

「/Users/xxxx.note」转换为 Markdown 失败!请检查文件!
错误提示:child index out of range

转换md报错

导出时的几个问题

感谢开发者,整体上很好用。
两个小问题。

  1. 有的笔记没有文件后缀,但是是xml格式的
  2. 有的文件是note后缀,但是其实里面是纯html

Typora + Dropbox + MWeb 使用教程

请仓主有空写下Typora + Dropbox + MWeb的使用教程。
我试着先导出有道云笔记到本地电脑上,再同步到dropbox,iPhone端使用mweb查看dropbox文件不成功。原因是同步的文件需要是由MWeb客户端记录的笔记才可(即需要docs和mainlib.db文件才行),如何才能直接用Typora写,然后手机端查看?

只有图片的笔记,导出后正文无图片的引用

在只有图片的笔记,导出后正文无图片的引用。看原始的xml文件,是其中无标签,xml内容如下:

        <image>
            <coId>79cona1426892476168</coId>
            <source>https://note.youdao.com/yws/res/6666/9178c110120a22cb4ef6e66ace6729e1</source>
            <styles/>
        </image>

导致以下的代码没有起作用:

                    elif 'text' in child2.tag:
                        # 部分图片无text标签,但有<styles/>
                        image_name = child2.text
                        if child2.text is None:
                            image_name = ''
                        new_content += f'![%s](%s){nl}{nl}' % (image_name, image_url)
                        break

建议将这部分修改如下

                    elif 'text' in child2.tag:
                        # 部分图片无text标签,但有<styles/>
                        image_name = child2.text
                        if child2.text is None:
                            image_name = ''
                        new_content += f'![%s](%s){nl}{nl}' % (image_name, image_url)
                        break

                    elif 'styles' in child2.tag:
                        # 解决无text标签,但有<styles/>
                        image_name = ''
                        new_content += f'![%s](%s){nl}{nl}' % (image_name, image_url)
                        break

有道云微信用户导出(亲测可行)

  • 微信账号称为账号A。
  • 然后你得先注册一个有道云笔记账号,要使用邮箱注册(因为这样才有账号和密码),下面称为账号B。
  • 然后使用账号B登录有道云笔记web端,然后点击账号设置->账号信息->导入->导入微信笔记
    输入图片说明
  • 一定要点击选择导入微信账户数据,之后使用账号A的微信扫码验证就可以了。
  • 然后等会数据同步到账号B了,在使用脚本拉取账号B就行了。
    输入图片说明

【求助】请检查账号密码是否正确!……

非常有用的工具!

作者您好,我按说明运行,总是如下报错提示。用的Mac系统,config文件是按说明里的例子填的。我换用自己的账号也是一样的错误。通过VPN更换了ip也不行。请问有可能是什么原因吗?

{
"username": "[email protected]",
"password": "12345678",
"local_dir": "",
"ydnote_dir": "",
"smms_secret_token": ""
}
错误提示:请检查账号密码是否正确!也可能因操作频繁导致需要验证码,请切换网络(改变 ip)或等待一段时间后重试!
已终止执行

运行错误

请问,Win10,运行之后出这个是什么原因呢?谢谢
$ python pull.py
▒▒▒▒ config.json ▒▒ʽ▒Ƿ▒▒▒ȷ▒▒
▒▒▒˳▒

运行pull无响应,运行test提示


运行错误退出测试


验证 config.json 格式错误(花括号位置),是否结束执行并输出提示

错误提示:请检查「config.json」格式是否为 utf-8 的 json!建议使用 Sublime 编辑「config.json」
已终止执行
.----------------
验证 config.json 格式错误(有注释),是否结束执行并输出提示

错误提示:请检查「config.json」格式是否为 utf-8 的 json!建议使用 Sublime 编辑「config.json」
已终止执行
.----------------
测试 config 的 key 被修改时

错误提示:'请检查「config.json」的 key 是否分别为 username, password, local_dir, ydnote_dir, smms_secret_token'
已终止执行
.----------------
验证账号密码为空时,是否结束执行并输出提示

错误提示:账号密码不能为空,请检查「config.json」!
已终止执行
.----------------
当 ydnote_dir 不存在时,是否结束并提示

E----------------
当 local_dir 错误时(为相对路径),是否结束并提示

E----------------
当 local_dir 错误时(不存在上层文件夹),是否结束并提示

E----------------
有道云笔记修改接口,是否提示

E

ERROR: test_config_ydnote_dir_err (main.TestErrorExit)

Traceback (most recent call last):
File "test.py", line 235, in test_config_ydnote_dir_err
set_right_cookies()
File "test.py", line 32, in set_right_cookies
with open('cookies-right.json', 'rb') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'cookies-right.json'

======================================================================
ERROR: test_config_local_dir_err (main.TestErrorExit)

Traceback (most recent call last):
File "test.py", line 255, in test_config_local_dir_err
set_right_cookies()
File "test.py", line 32, in set_right_cookies
with open('cookies-right.json', 'rb') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'cookies-right.json'

======================================================================
ERROR: test_config_local_dir_err2 (main.TestErrorExit)

Traceback (most recent call last):
File "test.py", line 275, in test_config_local_dir_err2
set_right_cookies()
File "test.py", line 32, in set_right_cookies
with open('cookies-right.json', 'rb') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'cookies-right.json'

======================================================================
ERROR: test_get_all_youdao_url_change (main.TestErrorExit)

Traceback (most recent call last):
File "test.py", line 287, in test_get_all_youdao_url_change
with open('config-right.json', 'rb') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'config-right.json'


Ran 8 tests in 0.007s

FAILED (errors=4)

运行下载测试


验证 smms_secret_token 为 null 时,是否能完整下载成功

E----------------
验证 smms_secret_token 不为 null 时,是否能完整下载

image

image

能否导将Note转成HTML格式

能否导将Note转成HTML格式,方便二次处理,比如静态web或者是导入到Evernote
有道越来越恶心,关掉了导出通用格式的接口,说白了就是怕用户跑了,客观现实就是我笔记太多了,还真的不好跑

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.