我有管理游戏库的习惯,感觉特别需要一个自动同步脚本到这个网站:
https://elite-belief-a02.notion.site/9606b267d849462bb4490d91e297f8da?pvs=74
心血来潮的想法,心血来潮的一篇文章,代码 Powered By o3-mini && o3-mini-high
配合 GPT 写了一个脚本:https://github.com/UriPomer/SteamToNotion
坑
这个过程有一些坑会踩,比如
当游戏数据中没有“Last Played”(上一次游玩时间)时,update 过程中会尝试发送一个 date 属性,其 "start" 值为 null,而 Notion 要求该字段必须是一个有效的字符串。
字段 'Last Played' 不同,现有:'2024-03-12T11:52:00.000+00:00' vs 新值:'2024-03-12T11:52:58'。Notion会自动把秒去掉,并且加上后面的0,改变格式,导致检测不一样。
差异检测:字段 '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, "")
采用的是格式化的方式进行映射,你可以根据自己的需求进行修改。