如何在 Python 中使用 Notion API?

liftword1个月前 (02-09)技术文章17

如何在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从入门到精通》专栏。

相关文章

C# 中调用 Python 代码的实现方式

一、引言在软件开发中,经常会遇到需要结合不同编程语言优势的场景。C# 和 Python 作为两种广泛应用的语言,各自在某些领域有着独特的优势。C# 以其高性能和强大的类型系统在企业级应用中占据重要地位...

通过Python调用deepseek的API进行对话

import requests import json # DeepSeek 模型的 API 端点 API_URL = "https://api.deepseek.com/v1/chat/compl...

Python调用免费翻译API实现Excel文件批量翻译

工作中用到翻译软件是再正常不过的事情了,一般浏览外文网站翻译直接用谷歌插件还好解决。如果有一个Excel文件,里面有上万条需要翻译的内容,不能使用百度或Google免费的文档功能,需要怎么解决呢?总不...

使用python调用文心一言API,实现批量提问

在使用文心一言网页版时,一般都是输入一个提问,文心给出该提问的结果。但是,有时候我们需要批量向文心进行提问,而且这些提问的性质都是一样的,那么如何实现这个需求呢?一、提出问题例如:有一个表格,1000...

使用python调用ChatGPT的API,打造属于自己的桌面智能助手

上期图文教程,我们介绍了ChatGPT的注册使用过程,并且使用ChatGPT生成了一个CNN卷积神经网络的代码,由于ChatGPT的官方只公布了GPT-3的API接口,因此我们基于ChatGPT 3代...

Python调用Docker API的使用方式_python控制docker

Docker是目前最流行的容器化技术之一,它提供了一种轻量级和快速的方式来构建、打包和部署应用程序。Python是一种非常流行的编程语言,可以与Docker API一起使用,以便更好地管理和定制Doc...