LoginSignup
6
4
100万人に伝えたい!失敗を乗り超えた話を共有しよう

【Notion API × Python】request モジュールで databases、pages、blocks から情報を取得

Last updated at Posted at 2023-08-02

【初めに】

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 から情報を取得する方法】

get_databases.py
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 から情報を取得する方法】

get_pages_blocks.py
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/

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4