I. 简介

本开发报告旨在演示如何使用Notion的API来自动安排锻炼时间。Notion是一个多合一的生产力工具,允许用户创建和组织数据库、笔记、任务等等。Notion API为开发者提供了对Notion功能的编程访问,实现了各种任务的自动化。

所提供的代码片段展示了如何使用Notion API在数据库中根据预定义的时间表创建锻炼事件。该脚本在一个特定的日期范围内获取现有的事件,并为没有任何预定事件的日子创建新的事件。锻炼计划是在 days_of_week 字典中定义的,它将一周中的每一天映射到锻炼名称和标签列表中。

通过使用Notion API将锻炼安排过程自动化,开发者可以节省时间并减少人工错误。本报告将提供一个分步指南,帮助你设置Notion API并了解代码片段的各个组成部分。

II. 设置Notion API

要使用Notion API,你需要有一个Notion账户和一个集成设置。这里有一个认证Notion API的分步指南。

  1. 在Notion创建一个集成

    • 登录Notion,通过点击屏幕左下角的个人资料图标,然后点击 “集成”,进入集成页面。
    • 点击 “创建一个新的集成 “按钮。
    • 给你的集成一个名称,并选择你想使用它的工作区。
    • 点击 “提交 “按钮,创建集成。
  2. 获取你的集成令牌

    • 一旦你的集成被创建,你可以通过点击集成的名称来获得你的集成令牌。
    • 复制集成令牌,在你的代码中使用它。
  3. 安装Notion API软件包

    • 打开你的终端或命令提示符。

    • 运行以下命令来安装Notion API包。

      pip install notion-client
      
  4. 设置Notion API客户端

    • 在你的代码中导入Notion API客户端,在顶部添加以下一行。

      from notion_client import Client
      
    • 通过添加以下一行并将 <API Key> 替换为你的集成令牌来认证客户端。

      notion = Client(auth="<API Key>")
      
  5. 设置数据库细节

    • 获得你要添加事件的数据库的数据库ID。
    • 用你的数据库ID替换代码段中的 database_id 变量。

所提供的代码片段使用 notion_client.Client 对象与Notion API交互。 Client 对象用于验证API客户端,并提供对各种Notion资源的访问,如数据库和页面。

database_id 变量被设置为Notion数据库的ID,锻炼事件将被添加到该数据库。这个ID可以在数据库的URL中找到。

III. 定义锻炼计划

锻炼计划在代码片断中使用以下变量定义。

  • start_days_ago:在今天的日期之前的天数,以开始计划。
  • end_days_after : 今天的日期之后的天数,以结束该计划。
  • days_of_week : 一个字典,将一周中的每一天映射到锻炼名称和标签列表中。

days_of_week 字典用于定义一周中每一天的锻炼计划。一周中的每一天都是字典中的一个键,相应的值是另一个字典,包含锻炼名称和与锻炼相关的标签列表。比如说

days_of_week = {
    "Monday": {"name": "DAY 1", "tag": ["chest", "triceps"]},
    "Tuesday": {"name": "DAY 2", "tag": ["back", "biceps"]},
    "Wednesday": {"name": "DAY 3", "tag": ["lower body", "shoulder"]},
    "Thursday": {"name": "DAY 1", "tag": ["chest", "triceps"]},
    "Friday": {"name": "DAY 2", "tag": ["back", "biceps"]},
    "Saturday": {"name": "DAY 3", "tag": ["lower body", "shoulder"]},
}

在这个例子中,日程表被分为三天,每一天都有一个特定的锻炼和标签与之相关。

start_days_agoend_days_after 变量用于定义锻炼计划的日期范围。 start_days_ago 指定在今天的日期之前多少天开始安排, end_days_after 指定在今天的日期之后多少天结束安排。

这段代码使用 datetime 模块来获得今天的日期,并计算出锻炼计划的开始和结束日期。开始日期是通过从今天的日期中减去 start_days_ago 得到的,结束日期是通过在今天的日期中加上 end_days_after 得到的。日期的格式为 %Y-%m-%d 格式的字符串。

IV. 查询现有的事件

在创建新的锻炼事件之前,代码片段会在定义的日期范围内获取现有事件。这样做是为了避免在同一日期创建重复的事件。

notion.databases.query() 方法用于查询Notion数据库并检索现有事件。参数 filter 用于指定查询的过滤条件。在这种情况下,过滤器被设置为检索属于代码片段中定义的开始和结束日期的事件。下面是一个查询中使用的过滤器的例子。

{
    "and": [
        {"property": "Date", "date": {"on_or_after": start_date}},
        {"property": "Date", "date": {"on_or_before": end_date}}
    ]
}

该过滤器返回具有 Date 属性的事件,该属性位于 start_dateend_date 之间。

查询响应的 results 属性被用来获取日期范围内的现有事件。结果被存储在 existing_events 变量中,以便以后在代码片段中使用。

existing_events = notion.databases.query(
    **{
        "database_id": database_id,
        "filter": {
            "and": [
                {"property": "Date", "date": {"on_or_after": start_date}},
                {"property": "Date", "date": {"on_or_before": end_date}}
            ]
        },
    }
).get("results")

V. 创建新事件

一旦获得日期范围内的现有事件,该代码段将继续为计划日期范围内的每一天创建新的锻炼事件。

该代码片段使用 for 循环来迭代日期范围内的每一个日期。为每一个不是星期天的日子创建一个新的事件。

for date in (datetime.now() + timedelta(days=n) for n in range(-start_days_ago, end_days_after + 1)):
    # skip Sundays
    if date.strftime("%A") == "Sunday":
        continue

strftime() 方法用于从日期中获取工作日名称,如果工作日名称是 “星期日”,则循环跳过这一天,转到下一天。

然后,该代码片断检查在当前日期是否已经存在一个事件。

if any(event.get("properties").get("Date").get("date").get("start") == date.strftime("%Y-%m-%d") for event in existing_events):
    print(f"Event already exists for {date.strftime('%Y-%m-%d')}. Skipping.")
    continue

如果当前日期已经有一个事件存在,循环就会跳过这一天,转到下一天。

如果当前日期没有事件存在,则创建一个新的事件,其锻炼名称和标签与一周中的那一天相关。

day_of_week = date.strftime("%A")
event_name = days_of_week[day_of_week]["name"]
event_tag = days_of_week[day_of_week]["tag"]
new_event = {
    "Name": {"title": [{"text": {"content": event_name}}]},
    "Date": {"date": {"start": date.strftime("%Y-%m-%d")}},
    "Tag": {"multi_select": [{"name": tag} for tag in event_tag]},
}
notion.pages.create(parent={"database_id": database_id}, properties=new_event)

days_of_week 字典中获得与一周中的那一天相关的锻炼名称和标签。 new_event 字典用于定义新事件的属性,其中包括事件名称、日期和标签。 notion.pages.create() 方法用于在Notion数据库中创建新事件。

通过在计划日期范围内为一周中的每一天创建新的事件,开发者可以将锻炼安排过程自动化,并确保锻炼计划是最新的和准确的。

VI. 结论

在这个项目中,我们已经演示了如何使用Notion API来自动创建Notion数据库中的锻炼计划的过程。我们提供的代码片段可以用来创建一个特定日期范围的锻炼计划,并根据定义的锻炼计划自动向数据库中添加新的事件。

Notion API可用于自动化各种任务,如管理待办事项清单、跟踪支出或组织项目任务。通过Notion API,开发者可以建立自定义集成,并将重复性任务自动化,从而节省时间并提高生产力。

总的来说,Notion API为开发者提供了一个强大的工具,可以将Notion整合到他们的工作流程中,并使他们的任务自动化。随着Notion的不断普及,我们可以期待看到更多的开发者利用Notion API构建集成和自动化任务。

在未来,我们计划通过增加更多的功能和与其他工具的集成来扩展这个项目。我们还计划探索Notion API的其他用例,看看如何使用它来自动化我们工作流程中的其他任务。


Source code : https://github.com/hobbyworker/notion-workout-scheduler