我有管理游戏库的习惯,感觉特别需要一个自动同步脚本到这个网站:

https://elite-belief-a02.notion.site/9606b267d849462bb4490d91e297f8da?pvs=74

心血来潮的想法,心血来潮的一篇文章,代码 Powered By o3-mini && o3-mini-high

配合 GPT 写了一个脚本:https://github.com/UriPomer/SteamToNotion

这个过程有一些坑会踩,比如

  1. 当游戏数据中没有“Last Played”(上一次游玩时间)时,update 过程中会尝试发送一个 date 属性,其 "start" 值为 null,而 Notion 要求该字段必须是一个有效的字符串。

  2. 字段 'Last Played' 不同,现有:'2024-03-12T11:52:00.000+00:00' vs 新值:'2024-03-12T11:52:58'。Notion会自动把秒去掉,并且加上后面的0,改变格式,导致检测不一样。

  3. 差异检测:字段 'Playtime Hours' 不同,现有:'0' vs 新值:'0.0'。Notion会自动把.0去除,导致检测的时候发现不一样。

README

必要条件

创建 .env 文件,内容如下所示:

NOTION_TOKEN=""
NOTION_DATABASE_ID=""

STEAM_API_KEY=""
STEAM_USER_ID=""

自定义数据映射

Mapping.json 用于定义获取到的数据的映射关系,如下所示:

{
  "Game Name": {
    "notion_field": "名称",
    "type": "title"
  },
  "Playtime Hours": {
    "notion_field": "游玩时长",
    "type": "number"
  },
  "Last Played": {
    "notion_field": "上一次游玩时间",
    "type": "date"
  },
  "Banner": {
    "notion_field": "Banner",
    "type": "url"
  },
  "Achievements": {
    "notion_field": "成就数",
    "type": "rich_text",
    "format": "{Achievements Unlocked}/{Achievements Total}"
  }
}

相关代码如下所示:

for local_field, map_info in mapping.items():
    notion_field = map_info.get("notion_field")
    field_type = map_info.get("type")
    if "format" in map_info:
        fmt = map_info["format"]
        value = fmt.format(**game)
    else:
        value = game.get(local_field, "")

采用的是格式化的方式进行映射,你可以根据自己的需求进行修改。

Life is a Rainmeter