{"id":18296578,"url":"https://github.com/renyunkang/yuque-exporter","last_synced_at":"2025-08-22T03:03:43.882Z","repository":{"id":160375048,"uuid":"635277875","full_name":"renyunkang/yuque-exporter","owner":"renyunkang","description":"A tool for exporting Yuque documents as markdown.","archived":false,"fork":false,"pushed_at":"2024-02-23T03:06:48.000Z","size":17023,"stargazers_count":93,"open_issues_count":8,"forks_count":19,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-02-23T04:53:11.652Z","etag":null,"topics":["markdown-export","nodejs","puppeteer","yuque"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/renyunkang.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2023-05-02T11:01:21.000Z","updated_at":"2024-04-15T05:05:04.466Z","dependencies_parsed_at":"2023-09-08T01:01:33.270Z","dependency_job_id":"15cb7a5d-1f8c-4936-9631-40883835f56d","html_url":"https://github.com/renyunkang/yuque-exporter","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/renyunkang%2Fyuque-exporter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/renyunkang%2Fyuque-exporter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/renyunkang%2Fyuque-exporter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/renyunkang%2Fyuque-exporter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/renyunkang","download_url":"https://codeload.github.com/renyunkang/yuque-exporter/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247339022,"owners_count":20923004,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["markdown-export","nodejs","puppeteer","yuque"],"created_at":"2024-11-05T14:43:24.294Z","updated_at":"2025-08-22T03:03:43.866Z","avatar_url":"https://github.com/renyunkang.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# 语雀导出文档工具\n### 功能：\n\n- 模拟用户浏览器操作一篇一篇导出 markdown 文档\n- 按照知识库目录导出文档\n- 支持导出失败重试\n- 导出文档中的图片到本地\n- 替换文档中的图片链接\n\n\u003e ps: 后面两个功能是使用 python 实现，可以单独使用\n\n效果展示：\n\n![image.png](https://images.cherryfloris.eu.org/ryken/2023/05/91804cc3646d6356cd7458c9a12444fc.png)\n\n![image.png](https://images.cherryfloris.eu.org/ryken/2023/05/4b3a4e4207ead71f15600806c12a5c1d.png)\n\n动图展示(旧版图，新版未更新图)：![image.png](./images/exporter.gif)\n\n### 说明：\n\n这是一个基于puppeteer 来模拟用户在浏览器的操作一篇一篇的导出语雀文档的工具。\n关于语雀的导出可以详情说明见官方的文档：[如何导入导出知识库](https://www.yuque.com/yuque/thyzgp/import-lake-to-lark) \n\n首先语雀支持导出文档为 markdown 格式。\n- 单篇导出：支持导出为 markdown、word、pdf、lakebook等\n- 批量导出：支持导出为 lakebook、pdf 格式。对于超级用户是可以通过创建 token 来使用[官方的 exporter 工具](https://github.com/yuque/yuque-exporter)或者其他基于 api 的工具进行批量导出；超级用户的价格为 299/年。\n\nlakebook 格式为语雀私有的格式：[lakebook 格式说明](https://www.yuque.com/yuque/developer/lt69uo)，语雀也没有相应的工具去支持迁移/导入到其他笔记软件。pdf 估计也不能直接导入其他笔记软件(这个没有研究过就不展开了)。\n\n因此对于想要迁移自己文档的普通用户以及会员用户来说，你只能一篇一篇导出来完成你的迁移动作，这些用户也大多有上百篇文档，这无疑是劝退。所以我的迁移计划也一再搁置，同时也再等待其他的更友好的导出方式出现。最后还是不想等了，请教 GPT 写了这个工具，确实也怕像我这种白嫖用户之后的迁移的成本越来越大了。\n\n\u003e ps: 本人也不是专门写 nodejs 的，代码可能也是烂成狗屎，请大家不喜勿喷。谢谢！\n\n### 使用：\n\u003e 确保你的环境有 Chromium 浏览器。如 Google Chrome、Microsoft Edge、Opera 和 Brave等，都是基于 Chromium 浏览器构建的。\n\n#### 1. 安装 node 相关的工具\n建议使用 nvm 管理 node，选取下列适合自己的方式安装：\n- github 地址：[nvm-sh/nvm: Node Version Manager](https://github.com/nvm-sh/nvm)\n- gitee 地址：[nvm-cn: 🧊 nvm国内安装工具 (gitee.com)](https://gitee.com/RubyKids/nvm-cn)\n\n配置 npm 淘宝源：npm config set registry https://registry.npmmirror.com\n\n安装 yarn：npm install -g yarn --registry=https://registry.npmmirror.com\n\n#### 2. 下载代码并导出\n**下载代码并安装依赖**\n```bash\ngit clone https://github.com/renyunkang/yuque-exporter.git\ncd yuque-exporter\nnpm install --registry=https://registry.npm.taobao.org\n# 安装 JSONStream：\n# npm install JSONStream --registry=https://registry.npm.taobao.org\n\n# yarn 安装依赖如果下载报错的话，可以依据情况更换源。\nyarn\n```\n\n**设置环境变量并使用工具导出**\n\n需要用到的环境变量：\n\n| 环境变量 | 选项 | 描述 |\n|--|--|--|\n| USER | 必须(有cookie文件时非必须) | 登录的用户名 |\n| PASSWORD | 必须(有cookie文件时非必须) | 登录的密码 |\n| EXPORT_PATH | 非必须 | 指定导出路径，默认为当前工作目录下的 output 目录(自动创建) |\n\n\n- **ubuntu**\n```bash\n# 第一次运行时，使用 USER + PASSWORD 登录\n# USER=xxx PASSWORD=xxx node main.js\nUSER=xxx PASSWORD=xxx EXPORT_PATH=/path/to/exporter node main.js\n\n# 登录一次后会保存 cookie，之后使用cookie登录\n# node main.js\nEXPORT_PATH=/path/to/exporter node main.js\n```\n\n- **windows**\n```bash\n# 1. cmd\nset USER=\"xxx\"\nset PASSWORD=\"xxx\"\n# set EXPORT_PATH=/path/to/exporter\nnode main.js\n\n# 2. powershell\n# $env:USER=\"xxx\";$env:PASSWORD=\"xxx\"; node .\\main.js\n$env:USER=\"xxx\";$env:PASSWORD=\"xxx\";$env:EXPORT_PATH=\"/path/to/exporter\"; node .\\main.js\n```\n\n- **MacOS**\n```bash\n# 密码有特殊字符，建议单引号处理\nexport USER='xxx'\nexport PASSWORD='xxx'\n\n# 运行\nnode main.js\n```\n\n#### 3. 导出文档中的图片\n\n需要用到的几个环境变量：\n\n| 环境变量 | 选项 | 描述 |\n|--|--|--|\n| MARKDOWN_DIR | 非必须 | 指定 mardown 文件夹路径，默认为当前工作目录的 output 目录 |\n| DOWNLOAD_IMAGE | 非必须 | 指定是否导出图片，导出路径为 MARKDOWN_DIR 目录下的 images 目录，默认为 true |\n| UPDATE_MDIMG_URL | 非必须 | 指定是否更新文件中的图片路径，未指定 REPLACE_IMAGE_HOST 时，会更新为图片路径的相对路径。默认为 false |\n| REPLACE_IMAGE_HOST | 非必须 | 更新图片路径时自定义文件 url，格式为：{REPLACE_IMAGE_HOST}/{years}/{img_name}，在使用自定义对象存储时，建议上传图片时的路径符合前面的格式；默认为空 |\n\n**使用工具导出**\n\n```bash\n# 以 windows powershell 为例\n# 下载图片，不更新 mardown 源文件的图片链接\npython.exe .\\export-image.py\n\n# 不下载图片，更新文件的图片为相对路径\n$env:DOWNLOAD_IMAGE=\"false\";$env:UPDATE_MDIMG_URL=\"true\"; python.exe .\\export-image.py\n\n# 不下载图片，更新文件的图片为自定义对象存储(自定义域名)\n$env:DOWNLOAD_IMAGE=\"false\";$env:UPDATE_MDIMG_URL=\"true\"; $env:REPLACE_IMAGE_HOST=\"https://images.ryken.cloud/\"; python.exe .\\export-image.py\n```\n\n\u003e ps: \n\u003e 1. 当使用 python 运行时，如果没有相关依赖的话，需要手动下载一下; pip install xxx\n\u003e 2. 相关环境变量的是指同上面\"下载代码并导出\"\n\u003e 3. 根据自己需要，指定不同环境变量的值，来满足不同的需求吧\n\n\n\n### 存在的问题：\n1.自动登录仅支持账号密码登录\n\n2.无法保证兼容性，如果之后官方 api 修改后，可以自己根据 api 修改源码\n\n3.无法导出内容为纯表格/思维导出的文档(官方也不支持将其直接导出为 markdown)；因此报错的 timeout，可能为这些类型的文档，请重复确认后手动导出为其他格式。\n\n4.团队的导出未测试\n\n### Q\u0026A\n1.  Could not find Chromium 但是有 chorm 浏览器\n在不同的操作系统上，Puppeteer 默认调用的 Chrome 路径如下：\n-   Windows: C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe\n-   macOS: /Applications/Google Chrome.app/Contents/MacOS/Google Chrome\n-   Linux: /usr/bin/google-chrome\n如果主机上对应的可执行文件路径与默认一致但仍然运行失败，可以修改源码手动指定一下，如果没有chorme也可以执行edge的二进制文件\n![image.png](https://images.cherryfloris.eu.org/ryken/2023/05/eb093fe57cb0b6cc557a9616f5899445.png)\n```js\nconst browser = await puppeteer.launch({ headless: true });\n to\nconst browser = await puppeteer.launch({ headless: true, executablePath: '/usr/bin/google-chrome' });\n or\n// headless: false 会打开浏览器实时观察模拟的操作，可用于调试；executablePath 替换为自己本机对应路径\nconst browser = await puppeteer.launch({ headless: false, executablePath: \"C:\\\\Program Files (x86)\\\\Microsoft\\\\Edge\\\\Application\\\\msedge.exe\" });\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frenyunkang%2Fyuque-exporter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frenyunkang%2Fyuque-exporter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frenyunkang%2Fyuque-exporter/lists"}