Github Actions 自动备份 Notion 空间
slug
notion-backup
date
Apr 11, 2023
summary
使用 Github Actions 自动导出整个 Notion 空间的内容为 markdown 和 html 格式, 并保存到 Github 仓库中.
tags
Notion
Github Actions
status
Published
type
Post
因为 Notion 那个”薛定谔”的回收站 (点开之前, 你永远不知道删除的文章会不会出现在回收站里), 所以得找个自动化有版本控制的方式来备份我的 Notion 空间.
获取 Notion 相关的 token
因为 Notion 官方目前没有 API 支持导出备份整个空间, 所以需要从 Cookie 中获取相关值来实现自动备份.
token_v2
首先正常登录打开 Notion 网页, 随便进入一个你自己创建的页面, 然后打开”开发者工具(Cmd+Shift+i 或者 F12)”, 如图所示:
首先点击 网络(Network) 标签页, 然后搜索框输入
space
找到 getSpaces
这一项, 点击 getSpaces
的 Cookies 标签页, 就可以看到一个表格.其中的
token_v2
就是我们要第一个 Token 值, 复制一下 token_v2
的值 (点三次可以全选) 放一边, 一会要用.space_id
还是刚刚的
getSpaces
界面, 点击 Response 标签页, 可以看到一个 json 字符串, 点击下面的 {}
按钮可以格式化.格式化后滚动到最下面, 如图所示那个长长的东西就是你的
space_id
了, 复制一下它放一边, 一会用.file_token
随便打开一篇你的文档, 点击文档右上角的三个小点, 选择导出, 导出后 Notion 会生成一个压缩包.
现在打开浏览器的下载页面 (
chrome://downloads
或者 arc://downloads
之类的), 复制刚刚下载的压缩包文件链接 (右键选择复制下载链接), 新建一个空白标签页, 并再次打开“开发者工具”, 然后粘贴刚刚压缩包的链接到地址栏回车 (浏览器会自动下载不用管它), 我们在”开发者工具”界面就可以看到类似下面的图了:按照图中的标记顺序依次点击, 找到那个
file_token
并复制它的值 (鼠标点三次可以全选).使用 Github Actions 自动备份
上面三个小东西拿到手之后, 在 Github 创建一个新仓库: https://github.com/new
仓库一定要选 Private, 不然就公开啦!
新建后点击 Setting —> Actions —> General, 往下滚动找到图中的权限配置, 设置默认权限为可读可写 (如图所示):
还是这个页面, 点击 Secrets and variables —> Actions, 如图添加三项 Secret, 分别对应上面鼓捣到的三个小东西:
NOTION_TOKEN
填上面的token_v2
NOTION_SPACE_ID
填上面的space_id
NOTION_FILE_TOKEN
填上面的file_token
最后一步, 打开 Actions 标签页, 点击 Simple workflow 的 Configure 按钮创建一个任务:
清空默认的代码, 复制下面的内容, 粘贴到文件里:
name: "Notion backup" on: push: branches: - master schedule: - cron: "0 */4 * * *" # Allows you to run this workflow manually from the Actions tab workflow_dispatch: jobs: backup: runs-on: ubuntu-latest name: Backup timeout-minutes: 15 steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v2 with: node-version: '18' - name: Delete previous backup run: rm -rf markdown html *.zip - name: Setup dependencies run: npm install -g notion-backup - name: Run backup run: notion-backup env: NOTION_TOKEN: ${{ secrets.NOTION_TOKEN }} NOTION_FILE_TOKEN: ${{ secrets.NOTION_FILE_TOKEN }} NOTION_SPACE_ID: ${{ secrets.NOTION_SPACE_ID }} NODE_OPTIONS: "--max-http-header-size 15000" - name: Delete zips run: | rm -f *.zip rm -f markdown/*-Part*.zip rm -f html/*-Part*.zip - name: Commit changes run: | git config user.name github-actions git config user.email [email protected] git add . git commit -m "Automated snapshot" git push
点击提交就可以了. 这个任务会每四个小时执行一次. 为了验证是否成功可以手动触发一次看看效果, 点击 Actions 标签会看到一个 Notion backup 的任务, 如图所示手动点击 Run workflow 执行一次任务.
点击执行中的任务可以看到执行状态, 大概一两分钟就执行完了.
执行成功后会有两个文件夹, 分别是 html 和 markdown 两个格式的导出文件.
Notion 的 token 大概 90 天左右会失效, 到时候需要重新用上面的方式获取 token, 再到 Secrets 中修改.
最后, 自动备份的脚本源代码在这里 (感谢作者):