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)”, 如图所示:
notion imagenotion image
首先点击 网络(Network) 标签页, 然后搜索框输入 space 找到 getSpaces 这一项, 点击 getSpacesCookies 标签页, 就可以看到一个表格.
其中的 token_v2 就是我们要第一个 Token 值, 复制一下 token_v2 的值 (点三次可以全选) 放一边, 一会要用.

space_id

还是刚刚的 getSpaces 界面, 点击 Response 标签页, 可以看到一个 json 字符串, 点击下面的 {} 按钮可以格式化.
格式化后滚动到最下面, 如图所示那个长长的东西就是你的 space_id 了, 复制一下它放一边, 一会用.
notion imagenotion image

file_token

随便打开一篇你的文档, 点击文档右上角的三个小点, 选择导出, 导出后 Notion 会生成一个压缩包.
现在打开浏览器的下载页面 (chrome://downloads 或者 arc://downloads 之类的), 复制刚刚下载的压缩包文件链接 (右键选择复制下载链接), 新建一个空白标签页, 并再次打开“开发者工具”, 然后粘贴刚刚压缩包的链接到地址栏回车 (浏览器会自动下载不用管它), 我们在”开发者工具”界面就可以看到类似下面的图了:
notion imagenotion image
按照图中的标记顺序依次点击, 找到那个 file_token 并复制它的值 (鼠标点三次可以全选).

使用 Github Actions 自动备份

上面三个小东西拿到手之后, 在 Github 创建一个新仓库: https://github.com/new
💡
仓库一定要选 Private, 不然就公开啦!
notion imagenotion image
新建后点击 Setting —> Actions —> General, 往下滚动找到图中的权限配置, 设置默认权限为可读可写 (如图所示):
notion imagenotion image
还是这个页面, 点击 Secrets and variables —> Actions, 如图添加三项 Secret, 分别对应上面鼓捣到的三个小东西:
  • NOTION_TOKEN 填上面的 token_v2
  • NOTION_SPACE_ID 填上面的 space_id
  • NOTION_FILE_TOKEN 填上面的 file_token
 
notion imagenotion image
最后一步, 打开 Actions 标签页, 点击 Simple workflowConfigure 按钮创建一个任务:
notion imagenotion image
清空默认的代码, 复制下面的内容, 粘贴到文件里:
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
notion imagenotion image
点击提交就可以了. 这个任务会每四个小时执行一次. 为了验证是否成功可以手动触发一次看看效果, 点击 Actions 标签会看到一个 Notion backup 的任务, 如图所示手动点击 Run workflow 执行一次任务.
notion imagenotion image
点击执行中的任务可以看到执行状态, 大概一两分钟就执行完了.
notion imagenotion image
执行成功后会有两个文件夹, 分别是 html 和 markdown 两个格式的导出文件.
notion imagenotion image
Notion 的 token 大概 90 天左右会失效, 到时候需要重新用上面的方式获取 token, 再到 Secrets 中修改.
最后, 自动备份的脚本源代码在这里 (感谢作者):
对于本文内容有任何疑问, 可与我联系.