如何在 Python 中使用 Notion API?
如何在Python中使用Notion API并自动编辑数据库。
设置Notion API和数据库
首先,让我们在Notion板中创建一个完整的页面数据库。 在本文中,我使用了一个来自我的一个数据库的真实示例。 数据库具有URL,Title和Published?字段,并演示了如何编辑文本和日期字段:
接下来,按照官方指南创建Notion集成。 遵循此页面上的所有步骤,您将:
- 创建一个集成并获取令牌
- 与您的集成共享数据库
- 保存数据库ID
现在,我们已经准备好使用创建,读取,更新和删除功能自动化此数据库中的事物。
设置Python代码
要使用API,我们使用requests?模块。 我们可以使用pip安装它:
pip install requests
像这样定义您的令牌,数据库ID和标头。
import requests
NOTION_TOKEN = "YOUR_INTEGRATION_TOKEN"
DATABASE_ID = "YOUR_DATABASE_ID"
headers = {
"Authorization": "Bearer " + NOTION_TOKEN,
"Content-Type": "application/json",
"Notion-Version": "2022-06-28",
}
在Notion数据库中创建page
要创建新页面,我们发送一个POST?请求:
def create_page(data: dict):
create_url = "https://api.notion.com/v1/pages"
payload = {"parent": {"database_id": DATABASE_ID}, "properties": data}
res = requests.post(create_url, headers=headers, json=payload)
# print(res.status_code)
return res
相应的数据字段必须对应于您的表列名称。
模式可能看起来有点复杂,并且根据不同的数据类型(例如文本,日期,布尔值等)而异。 要确定确切的模式,我建议转储数据(见下一步)并检查JSON文件。
在我们的示例中,我们创建了URL?,Title?和Published?列的数据,如下所示:
from datetime import datetime, timezone
title = "Test Title"
description = "Test Description"
published_date = datetime.now().astimezone(timezone.utc).isoformat()
data = {
"URL": {"title": [{"text": {"content": description}}]},
"Title": {"rich_text": [{"text": {"content": title}}]},
"Published": {"date": {"start": published_date, "end": None}}
}
create_page(data)
查询 Notion 数据库和读取page
要查询数据库并读取所有条目,我们可以使用以下函数。它使用分页来检索所有条目:
def get_pages(num_pages=None):
"""
如果 num_pages 为 None,则获取所有页面,否则只获取定义的数量。
"""
url = f"https://api.notion.com/v1/databases/{DATABASE_ID}/query"
get_all = num_pages is None
page_size = 100 if get_all else num_pages
payload = {"page_size": page_size}
response = requests.post(url, json=payload, headers=headers)
data = response.json()
# 将所有数据转储到文件中,将此项注释掉
# import json
# with open('db.json', 'w', encoding='utf8') as f:
# json.dump(data, f, ensure_ascii=False, indent=4)
results = data["results"]
while data["has_more"] and get_all:
payload = {"page_size": page_size, "start_cursor": data["next_cursor"]}
url = f"https://api.notion.com/v1/databases/{DATABASE_ID}/query"
response = requests.post(url, json=payload, headers=headers)
data = response.json()
results.extend(data["results"])
return results
然后,我们可以检索所有页面,遍历它们,并访问不同的字段:
pages = get_pages()
for page in pages:
page_id = page["id"]
props = page["properties"]
url = props["URL"]["title"][0]["text"]["content"]
title = props["Title"]["rich_text"][0]["text"]["content"]
published = props["Published"]["date"]["start"]
published = datetime.fromisoformat(published)
更新 Notion 数据库中的page
要更新页面,我们必须发送 PATCH? 请求:
def update_page(page_id: str, data: dict):
url = f"https://api.notion.com/v1/pages/{page_id}"
payload = {"properties": data}
res = requests.patch(url, json=payload, headers=headers)
return res
例如,如果我们想要更新 Published? 字段,我们发送以下数据。它与创建页面的架构相同:
page_id = "页面 ID"
new_date = datetime(2023, 1, 15).astimezone(timezone.utc).isoformat()
update_data = {"Published": {"date": {"start": new_date, "end": None}}}
update_page(page_id, update_data)
删除 Notion 数据库中的page
删除页面使用与更新页面相同的端点,但在这里,我们将 archived? 参数设置为 True?:
def delete_page(page_id: str):
url = f"https://api.notion.com/v1/pages/{page_id}"
payload = {"archived": True}
res = requests.patch(url, json=payload, headers=headers)
return res
结论
现在,您已经了解了如何使用Python自动化Notion数据库的创建、读取、更新和删除。这种方法可用于许多不同的应用程序,例如自动保存博客文章或创建任务清单。
跟一线大厂架构师学python
《Python Tricks》专栏是我最近在写的一本针对Python开发人员的实用编程指南,涵盖了Python中最强大和有用的特性和技巧。从基础知识入手,深入介绍函数式编程、面向对象编程、并发编程、网络编程、Web开发、数据处理和机器学习等内容。透彻解析Python语言特性,提供实践案例和示例代码,帮助您优雅解决各种问题。
如果您对python asyncio异步编程模型感兴趣,可以关注我的《python asyncio从入门到精通》专栏。