使用Python Notion API來自動匯入筆記

前言


最近發現有些東西還是得線上搞會比較方便

所以從 Obsidian 轉到 Notion

但我又不想一篇篇手動匯入,於是使用了 Notion 的 API

內容


Notion 幾乎所有的功能都能通過送 request 來達成

網路上也有 javascript 的 API 版本,但我選擇使用非官方的 Python API Notion SDK in Python

文件方面,我參考了官方的API 文件

裏面寫得非常詳盡,但看得出來疏於更新跟細節不完整

所以整個使用過程不是很舒服,我還詢問 Notion 官方人員跟非官方的 SDK 開發者進行 payload 的調整

我直接在 repo 發文 Reference XD

最後終於弄出來能夠自動新增 page 並帶有預設值的腳本

以我的需求來說,必須要可以自動填入標題跟內文,最好是屬性也可以帶入

大概會長這樣

image

以下是我自動匯入的 code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from notion_client import Client

# Initialize the client
# 取得token的方法,可以參考官方文件這邊 https://developers.notion.com/docs/getting-started
notion = Client(auth=NOTION_TOKEN)


def insert_to_notion(date: str, content: str, title="Work note", tag="work"):
# 這邊需要`DATABASE_ID`,可以在網頁版Notion點選page後,網址最後會有一個id,可以在這邊抓取
# 例如 https://www.notion.so/natlee/test-4f3f55661c333e5585660c4c35e10533
# 這邊的DATABASE_ID就是`4f3f55661c333e5585660c4c35e10533`

notion.pages.create(
**{
"parent": {"database_id": DATABASE_ID},
"properties": {
"title": {"title": [{"type": "text", "text": {"content": title}}]}, # 標題的屬性跟標題是什麼
"Tags": {"type": "multi_select", "multi_select": [{"name": tag}]}, # 標籤的屬性跟標籤是什麼
"Created": {"date": {"start": date}}, # 建立時間,我的例子是使用像這樣的資料 `2022-04-21`
},
"children": [ # 這邊比較麻煩,要指定內容是哪種屬性,例如paragraph
{
"object": "block",
"type": "paragraph",
"paragraph": {
"rich_text": [{"type": "text", "text": {"content": content}}] # 內文的屬性跟內容
},
}
],
}
)

最後我們就可以用這個腳本批量匯入筆記了

整個過程包含跟官方來回,花了快五天

不過我的例子是,我有五百多篇格式化的筆記要把它們匯入到 Notion 上

手動太麻煩,這樣就直接搞定了(至少我知道手動一定會超過五天 XD)

順帶一提,怕的話可以考慮先用 curl 測試一筆看看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/bin/zsh

curl --location --request POST 'https://api.notion.com/v1/pages' \
--header 'Content-Type: application/json' \
--header 'Notion-Version: 2022-02-22' \
--header 'Authorization: Bearer <YOUR_NOTION_AUTH_TOKEN>' \
--data-raw '{
"parent": {
"database_id": "<YOUR_DATABASE_ID>"
},
"properties": {
"title": {
"title": [
{
"type": "text",
"text": {
"content": "test_title"
}
}
]
},
"Tags": {"type": "multi_select", "multi_select": [{"name": "Daily"}]},
"Created": {"date": {"start": "2022-03-28"}}
},
"children": [
{
"object": "block",
"type": "paragraph",
"paragraph": {
"rich_text": [
{
"type": "text",
"text": {
"content": "Yo I am here!"
}
}
]
}
}
]
}'

使用後,大概會長這樣

image

Reference


How can I create new page with some contents of text


這篇文章同步發表於 Medium ,歡迎留言討論!

Medium 文章連結