Автоматизация бэкапа Notion с помощью API

Обновлено:

Регулярное создание резервных копий (бэкапов) сравнимо со страховкой: вы думаете, что она вам не нужна, пока она вам не понадобится. Поскольку Notion стал «вторым мозгом» для многих, крайне важно иметь бэкапы на всякий случай.

До того, как официальный API стал общедоступным, было 2 варианта экспорта данных Notion:

Теперь с официальным API это стало более доступным.

Шаг 1: Создание интеграции

Перейдите на страницу "Мои интеграции" (My Integrations), чтобы создать внутреннюю интеграцию. В документации Notion есть подробное описание процесса.

Создание интеграции в Ноушен

После завершения вы получите секретный ключ (убедитесь, что вы являетесь администратором этого рабочего пространства). Он понадобится вам позже для аутентификации API запросов.

Шаг 2: Предоставление доступа к страницам

По умолчанию ваша интеграция не имеет доступа ни к каким страницам или базам данных. Вы можете предоставить доступ через меню с тремя точками ··· в правом верхнем углу страницы.

Giving our connection access to the page

Предоставляя вашей интеграции доступ к определенной странице, вы также получаете доступ к ее дочерним страницам и базам данных.

Документация освещает эту тему более подробно.

Шаг 3: Запрос данных

Если вы не собираетесь сохранять сугубо определенную страницу, вам понадобится получить доступ ко всем данным. API предоставляет нам эндпоинт search, который возвращает верхнеуровневые страницы и базы данных, к которым интеграция имеет доступ.

import requests

# замените INTERNAL_INTEGRATION_SECRET на ваш собственный ключ!
headers = {
  'Authorization': 'Bearer INTERNAL_INTEGRATION_SECRET',
  'Notion-Version': '2022-06-28',
  'Content-Type': 'application/json',
}

response = requests.post(
  'https://api.notion.com/v1/search',
  headers=headers,
)

Учтите, что эндпоинт search не возвращает дочерние страницы. Чтобы заполучить их, используйте эндпоинт /blocks/{block_id}/children (замените block_id на ID вашего блока).

for block in response.json()['results']:
  child_blocks = requests.get(
    f'https://api.notion.com/v1/blocks/{block["id"]}/children',
    headers=headers,
  )

В больших рабочих пространствах результаты, вероятно, будут разбиты на страницы. Чтобы получить все элементы, вам нужно рекурсивно запрашивать эндпоинт search, пока параметр has_more не вернет false.

Шаг 4: Сохранение данных

Один из способов сохранить данные вашего рабочего пространства Notion — записать верхнеуровневые страницы и базы данных в отдельные JSON-файлы и поместить дочерние страницы в папку с названием их родительских файлов.

Вот как выглядит итоговый скрипт:

import requests
import os
import datetime
import json

timestamp = datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
folder = 'notionbackup_' + timestamp

os.mkdir(folder)

# замените INTERNAL_INTEGRATION_SECRET на ваш собственный ключ!
headers = {
  'Authorization': 'Bearer INTERNAL_INTEGRATION_SECRET',
  'Notion-Version': '2022-06-28',
  'Content-Type': 'application/json',
}

response = requests.post('https://api.notion.com/v1/search', headers=headers)

for block in response.json()['results']:
  with open(f'{folder}/{block["id"]}.json', 'w') as file:
    file.write(json.dumps(block))

  child_blocks = requests.get(
    f'https://api.notion.com/v1/blocks/{block["id"]}/children',
    headers=headers,
  )
  if child_blocks.json()['results']:
    os.mkdir(folder + f'/{block["id"]}')

    for child in child_blocks.json()['results']:
      with open(f'{folder}/{block["id"]}/{child["id"]}.json', 'w') as file:
        file.write(json.dumps(child))

Шаг 5: Настройка cron

В идеале резервные копии должны создаваться автоматически. В противном случае вы, скорее всего, забудете о них.

В системах, похожих на UNIX (macOS, Linux, BSD), вы можете настроить cron-задание, которое будет запускать скрипт с заданным интервалом.

Перед настройкой cron-задания сохраните этот Python-скрипт на вашем компьютере. Затем создайте запись в crontab:

crontab -e

Crontab имеет специфический синтаксис (в интернете много материалов на эту тему). Допустим, вы хотите запускать этот скрипт каждые 6 часов. В редакторе, открывшемся после предыдущей команды, вставьте следующее:

0 */6 * * * /usr/local/bin/python3 /full/path/to/notionbackup.py

Это предполагает, что Python-скрипт называется notionbackup.py, а интерпретатор Python находится в /usr/local/bin/python3. Найти полный путь к интерпретатору Python 3 можно и так:

which python3

Дальнейшие шаги

Хотя приведенный выше код охватывает большую часть ваших данных, вы, возможно, захотите сохранить следующeе:

Вот и всё! Исходный код также опубликован на GitHub.

Вы также можете использовать Notion Backups для бэкапа данных Notion в облачные хранилища. Таким образом, вы можете не беспокоиться о потере своих данных.

Back up your Notion workspaces today

Get started