前言
前陣子想把電腦中一些資料轉移到 Notion 上,純手動太花時間了,就下定決心花點時間研究 Notion API,結果查來查去中文的網站上查不到容易體驗的文章,只好自己研究,就在不斷的試錯浪費不少時間…
以下透過一段簡短的範例,希望使用 Python 處理 Notion 資料自動化有興趣的人,也可以少走彎路
看完這篇文章你會學會:
- 申請 Notion API 機器人
- 透過 Python 取得 Notion Database 資料
- 了解獲取 Database 的原理
前置作業
本篇內容是基於 requests 這個模組,可透過以下指令來安裝:pip install requests
1. 申請 Notion API 機器人
- 申請一個 API 機器人: https://www.notion.com/my-integrations
記下這個機器人的身份碼:Internal Integration Token (本文後續簡稱 token)
2. Notion 上創建一個 Database,並給予機器人權限
為了方便後續講解,我們創建的 Database 長這樣:
2. 透過 Python 取得 Notion Database 資料
在開始前先說明一下運作原理,requests 會把包好的訊息傳送給 Notion API
Notion API 則會根據 requests 中的訊息把資料回傳
- requests 中包哪些資訊呢?
- URL:由於透過 Notion API 抓取資料,只要給 Notion API 我們要抓取的 Database ID 即可
- header:用於驗證我們的身份,Notion API 只回應有權限的人
機器人的身份碼 Internal Integration Token 和 database ID 嵌入方式如下:
token = "secret_wiVVieccxLNPtXXXGwHBog1CfVr0ZErg3cgUL4wKgNU"
database_id = "a8aec43384f447ed84390e8e42c2e089"
r = requests.get(
url="https://api.notion.com/v1/databases/{}".format(database_id) ,
headers={"Authorization": "Bearer " + token, "Notion-Version": "2021-05-13"},
)
print(r.text)
順利得到一串起來很傷眼的字串,而且找來找去,看起來比較眼熟的是「交通 🚥 」
也沒有看到「飛機」或「汽車」?我們到底撈回什麼資料?
這串訊息是 Json 格式,可以搜尋 Json轉換工具,整理成較適合閱讀的格式
- 把比較瑣碎的資訊剔除,得到:
- object — 回傳的資料種類
- id — 此 object 的 id
- title — 此 database 的標題文字
- properties — 此 database 的標籤
- parent — 此 object 的父 object
舉例來說:「汽車」「飛機」的父 object 是「交通 🚥」這個 database - url — 所在的網頁網址
依據上述資訊,我們可以把現有 r.text 與 Notion 上的頁面做個連結……
不對啊,Database 中的資料「汽車」和「飛機」呢?
讓我們把目光放回剛剛的 requests,我們給予 API 的網址是:
https://api.notion.com/v1/databases/{database_id}
所以 Notion 回傳的其實是「交通 🚥 」這個 database 的屬性,並沒有涵蓋到 database 內部的資料
想要抓取 database 內部的資料,request 要在做一些小變動:
- requests.post
- url 中新增 /query
token = "secret_wiVVieccxLNPtXXXGwHBog1CfVr0ZErg3cgUL4wKgNU"
database_id = "a8aec43384f447ed84390e8e42c2e089"
r = requests.post(
url="https://api.notion.com/v1/databases/{}/query".format(database_id) ,
headers={"Authorization": "Bearer " + token, "Notion-Version": "2021-05-13"},
)
print(r.text)
Database 中的「飛機」、「汽車」終於出現了!
回傳結果為 page 的 list,正如大家所知,Database 中每一「橫列」代表一個 page
3. POST 獲取 Database 的原理
POST、GET 都是 HTTP Verbs,可以理解為我們向網頁執行的動作,想了解更多的話可以參考這裡:
- GET=抓取
- POST=新增
- PATCH=更新
這是因為使用 /query 類似於 Notion 上使用 Filter 或 Sort 對 database 其中的資料並沒有改動
只是將符合條件的 pages 回傳
因此實際上我們是對 Notion「新增」一串搜索的指令,API 回傳的則是依此搜索的 results