【Python】 Notion APIの簡易ラッパークラスをつくってみた

今回はNotionのAPIの簡易ラッパークラスを作成してみたので、その紹介です。

NotionのAPIは普通に書いていると階層が深くその都度指定をするのが面倒です。
簡単に処理ができるように…という理由からつくってみました。

ソースコードをgithubに公開しています。
https://github.com/qlitre/python-notion

インストール方法


gitからpip installできるようにしました。
適当な仮想環境を作成後に実行してください。

mkdir python-notion
cd python-notion
python -m venv myvenv
myvenv\scripts\activate
pip install git+https://github.com/qlitre/python-notion


つかいかた


題材として以下のような簡易todolistデータベースを作成しておきました。



NotionのAPIキーを持っていない方は取得しておきましょう。
「PythonでNotionのAPIを操作する方法」に取得方法を書きました。

適当なpythonファイルでNotionClientクラスを呼び出して使用していきます。

データベースIDを調べる

まずはデータベースのタイトルからIDを調べてみます。

from notion import NotionClient

api_key = 'your api key'
client = NotionClient(api_key)

# データベースのIDを取得する
database_id = client.get_database_id('ToDo List')
print(database_id)

>>>
8d0788de-859a-4cd6-b0ff-435ee26286d3


プロパティを調べる

取得したデータベースIDを元に、プロパティを調べます。

database_properties = client.database_properties(database_id=database_id)
print(database_properties)

>>>
{'Tags': 'multi_select', 'Due': 'date', 'Done!': 'checkbox', 'Name': 'title'}


{プロパティ名:プロパティタイプ}の辞書形式で取得できます。

ページを加える

{プロパティ名:設定したい値}を指定します。

add_items = {'Name': '部屋の掃除', 'Tags': '家事', 'Due': '2021-08-01', 'Done!': False}
client.add_page_to_database(database_id=database_id, prop_name_and_value=add_items)


複数の値がある場合はカンマ区切りで指定します。

add_items = {'Name': 'Pythonブログの更新', 'Tags': '趣味,プログラミング',
       'Due': '2021-08-02,2021-08-03', 'Done!': False}
client.add_page_to_database(database_id=database_id,
              prop_name_and_value=add_items)


このように追加されます。


ページ内に書きこむ

ページidを指定して、書きこみ用のメソッドを起動します。
ページIDは作成時にページのResponseオブジェクトが返ってくるので、キーidを指定することで取り出せます。

add_items = {'Name': 'ページ内書き込みテスト'}
res = client.add_page_to_database(database_id=database_id,
                 prop_name_and_value=add_items)

page_id = res.json()['id']
print(page_id)

>>>
8f9f9c08-0ea7-4b00-8759-867f248906e1


ページIDを指定して、ページ内に情報を書きこんでいきます。

# heading
client.add_heading_to_page(page_id=page_id,
              heading_type='heading_1',
              content='This is Heading1')
client.add_heading_to_page(page_id=page_id,
              heading_type='heading_2',
              content='This is Heading2')
client.add_heading_to_page(page_id=page_id,
              heading_type='heading_3',
              content='This is Heading3')
# paragraph
paragraph = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, ' \
      'sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.' \
      ' Ut enim ad minim veniam, quis ...'
client.add_paragraph_to_page(page_id=page_id,
               content=paragraph)

# bulleted list
client.add_bulleted_list_item_to_page(page_id=page_id,
                   list_content=['bullet1', 'bullet2', 'bullet3'])
# numbered list
client.add_numbered_list_item_to_page(page_id=page_id,
                   list_content=['冷蔵庫を開ける', '像を入れる', '冷蔵庫を閉める'])

# todolist
client.add_todolist_to_page(page_id=page_id,
              list_content=['トイレ掃除', '料理', 'エアコンのフィルター清掃'])

# toggle
client.add_toggle_block_to_page(page_id=page_id,
                parent_content='秘密の質問',
                children_type='bulleted_list_item',
                children_content=['小学校の名前', '母親の旧姓', '初恋の人の名前'])


今のところワンブロックずつ書きこんでいく仕様です。
このように書き込みがされます。


そのほか


データベースのタイトルプロパティのリストを取得したりもできます。

list_titles = client.list_titles(database_id)
print(list_titles)

>>>
['ページ内書き込みテスト', 'Pythonブログの更新', '部屋の掃除']


おわりに

git上からpip installする際の設定等は知らなかったので勉強になりました。

TOPページ