【初めに】
Python の requests モジュールを使用して、Notion API を用いて databases、pages、blocks から情報を取得する手順で詰まったので情報をまとめる。
【前提】
https://developers.notion.com/docs/create-a-notion-integration
上記 Notion API 公式ページにて、下記 3step が完了していること。
Step 1: Create an integration
Step 2: Share a database with your integration
Step 3: Save the database ID
Notion API における databases、pages、blocks の概念の違いはここらへんを参考にしてください
https://developers.notion.com/reference/intro
https://developers.notion.com/docs/working-with-databases
【ハマりやすい注意点】
具体的なコード紹介の前に、注意点を紹介
・database ID と page ID は異なる。
-> ざっくり説明すると、database は各 page の集合体。親:database / 子:page ってイメージ
取得した json データを見ると、parent / children という情報があると思うのでチェックしてみてください
・databases, pages, blocks のどこから情報を取得したいかで URL が異なる
-> 詳細は下の具体例で確認してください。ここが一番ハマったポイント
・databases は POST、 pages と blocks は GET メソッドを用いる
-> ここもハマったポイントです。よくわからない人は REST API で調べてね
【databases から情報を取得する方法】
import requests
import json
DATABASE_ID = "xxxxx" #Step 3 の方法で取得した database ID
KEY = "yyyyy" #Step 1 で取得した secret
url = "https://api.notion.com/v1/databases/" + DATABASE_ID + "/query"
headers = {
"Accept": "application/json",
"Notion-Version": "2022-06-28",
"Authorization": "Bearer " + KEY
}
data = {} #ここを上手く使えば一部の情報のみ取得などもできるっぽい。無知なので空白
response = requests.post(url, headers=headers, json=data)
#json 形式の出力を python の辞書型に変換
result = response.json()
#python の辞書型から json 文字列に変換、その際整形
format_result = json.dumps(result, indent=2, ensure_ascii=False)
print(result)
print(format_result)
【pages, blocks から情報を取得する方法】
import requests
import json
PAGE_ID = "xxxxx" #Step 3 の方法で取得した page ID
KEY = "yyyyy" #Step 1 で取得した secret
page_url = f"https://api.notion.com/v1/pages/{PAGE_ID}"
block_url = f"https://api.notion.com/v1/blocks/{PAGE_ID}/children"
headers = {
"Accept": "application/json",
"Notion-Version": "2022-06-28",
"Authorization": "Bearer " + KEY
}
page_response = requests.get(page_url, headers=headers)
page_result = page_response.json()
format_page_result = json.dumps(page_result, indent=2, ensure_ascii=False)
block_response = requests.get(block_url, headers=headers)
block_result = block_response.json()
format_block_result = json.dumps(block_result, indent=2, ensure_ascii=False)
print(page_result)
print(format_page_result)
print("==================================================")
print(block_result)
print(format_block_result)
【終わりに】
databases, pages, blocks はそれぞれ出力結果が異なるので、
どこの情報の取得が必要かを判断して適切に使い分けてください。
※Notion公式のpythonモジュール 「notion-client」 もあるらしい。
試してみたい方は是非。
(Python3.7 以降のサポート)
https://pypi.org/project/notion-client/