最近、Notionという新しいドキュメント管理ツールが話題になっています。
手軽に文章の作成や整理を行う事ができます。
エンジニアの方は利用している人も多いと思います。
しかし、新しいサービスであるため、将来性などに不安があります。
サービス終了やサイバー攻撃で、ある日突然、皆さんの書き溜めたNotionのデータが消えてしまう危険もあるのです。
そのため、今回はNotionを定期的にバックアップを行うシステムを構築していきたいと思います。
方針
まずは全体の方針を整理します。
バックアップ先としては、GitHubを用いて行います。
理由としては、差分管理ができ、日々更新されるNotionとの相性も抜群だからです。
バックアップを自動で行うため、一度にバックアップ作業を行い、トークンを取得しておきます。
そこで得たトークンを用いて、プログラムで定期的にバックアップデータを取得します。
ツールは、GitHub Actionsを利用します。
GitHub Actionsの詳しい説明は省きます。
今回は、条件に応じて自動的に決まった処理を行うための仕組みと理解していれば十分です。
またここで説明する方法は、以下のリンクを参考にしたものです。
注意:私の環境では、言語設定が英語で、ダークモードなので見た目が違いますが、基本的なボタンの配置などは同じです。
GitHubのリポジトリ準備
GitHubで新しいリポジトリから、Notionのバックアップデータを保存するためのリポジトリを制作します。
リポジトリ内にはアクセスキーを書き込む必要あるため、モードは「Private」を選択します。
以下のように設定し、「Create repository」をクリックします。

Notionのトークン取得
ご自身のNotionにアクセスし、“Settings & Members” → “Settings”をクリック。

Notionの画面で、「デベロッパーツール」を起動(Chromeブラウザの場合、Command+Option+J (Mac)、Control+Shift+J (Windows))します。
その後、以下の画像に示すように作業を進め、トークン情報を表示します。

エクポート作業が終われば、enqueueTask
のHeaders
タブには、色々な項目が表示されています。
必要になる値は、token_v2
とspaceId
です。
まずtoken_v2
からです。Request Headers > cookie
の値を右クリックでコピーします。

その値の中から、以下のような表示を探し(メモ帳などで検索機能を使うと楽です)、token_v2
のxxx
の部分を記録しておきます。
※ 実際にxxx
の部分はものすごく長いです。
token_v2=xxx;
次にspaceId
です。画像のようにRequest Payload
の値をコピーして保存します。

同様にその値の中から、以下のような表示を探し、xxx-xxx-xxx-xxx-xxx
を記録しておきます。
spaceId: “xxx-xxx-xxx-xxx-xxx”
GitHub Actionsの設定
GitHub Actionsは、リポジトリ内に.github/workflows
というフォルダを作り、そこにYAMLファイルを書き込むことで設定できます。
まずは、作成したGitHubのリポジトリ内で、.github/workflows
というフォルダを作ります。
そのフォルダ内で、.github/workflows/whatever.yml
という名前で、ファイルを作成し、以下の内容を書き込み保存します。
その際に、先ほど取得したNOTION_TOKEN
とNOTION_SPACE_ID
を書き込みます。
name: "Notion backup"
on:
push:
branches:
- master
schedule:
- cron: "0 */4 * * *"
jobs:
backup:
runs-on: ubuntu-latest
name: Backup
timeout-minutes: 15
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: '12'
- name: Setup dependencies
run: npm install -g notion-backup
- name: Run backup
run: notion-backup
env:
NOTION_TOKEN: [ここにtoken_v2の値を貼り付ける]
NOTION_SPACE_ID: [ここにspaceIdを貼り付ける]
- name: Delete zips
run: rm -f *.zip
- name: Commit changes
uses: elstudio/actions-js-build/commit@v3
with:
commitMessage: Automated snapshot
お疲れ様です!
以上で全ての作業が終了です。
whatever.yml
がmasterブランチにアップロードして、少し待つと、以下のように自動的に指定した形式でファイルが保存されます。

メンテナンス
前節で設定したクッキー値が、一定期間で無効になります。

クッキーが無効になるとバックアップに失敗し、上のようなメールが届きます。
この際に、前節と同じ作業を行い、NOTION_TOKEN
とNOTION_SPACE_ID
を再設定してください。
私の場合は、1ヶ月くらいで再設定が必要でした。
まとめ
Notionは、使いやすく、見た目もオシャレで便利なサービスです。
しかし、まだ微妙に機能が足りないことがあり、その場合には自分でなんとかするしかありません。
個人的に、バックアップ機能は非常に重要だったので、今回その方法についてまとめました。
この記事が、皆さんのお役に立てれば幸いです!