Notion APIを使ってコードブロックをローカルにファイル化してみた

Notion APIのレスポンスを元に、ブロックからコードブロックを選別した上でローカルで実行可能なファイルとして生成してみました。
2022.11.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

NotionのAPIレスポンスはブロック単位で扱われていることもあり、取捨選択によってはリソース置き場にすることも可能です。勿論GitHubのように厳密なバージョン管理とまでは難しいのですが、GitHubに投入する前の雑なメモ書きを整理する程度であれば十分です。

試しにレスポンス中のコードブロックをローカルでファイルとして出力し、実行可能な状態にしてみました。必要なライブラリについては以前の記事を参考にしてください。

レスポンスを元にソースコードを出力する。

ページのIDを元にしてページ内ブロックを取捨選択します。必要な判定としてはtypecodeであること、languageに即した拡張子を指定する、の2つです。

import os
from notion_client import Client
from pprint import pprint

notion = Client(auth=os.environ["NOTION_TOKEN"])
lang = {'python': 'py', 'plain text': 'txt'}
result = notion.blocks.children.list('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
for block in result['results']:
    if block['type'] == 'code':
        language = block[block['type']]['language']
        _id = block['id']
        _lang = lang[language]
        for paragraph in block[block['type']]['rich_text']:
            pprint(f"{_id}.{_lang}")
            with open(f"{_id}.{_lang}", mode='w') as f:
                f.write(paragraph['plain_text'])

コードブロック単位でファイルが生成されていきます。

% python dump.py
'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.txt'
'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.py'

あとがき

  • 厳密なバージョン管理はいらない
  • テキスト以外のコンテンツも説明として挟みたい
  • 必要に応じて実行用ファイルとしても出力できるようにしたい

といった辺りの要望は満たせるかもしれません。都合上ファイル名がランダム文字列となっているため、その点だけ何か工夫をするとよいでしょう。