由于Steam官方提供了Web API接口和文档,因此我们可以很方便的获取自己的游戏记录,并存储到个人数据中心当中。
本文计划获取自己Steam游戏库中所有游戏的信息以及各时段的游玩时长记录。
获取Token和Steam ID
要想使用Steam Web API,首先需要准备Token和Steam ID。
Token的申请页面:https://steamcommunity.com/dev/apikey
进入申请页面并登录账号以后就可以看到自己的Token和域名。
打开Steam客户端,点击右上角头像进入“账户明细”就可以查看到自己的Steam ID。
封装API
对常用的两个接口进行封装,API中除Token和Steam ID两个参数以外,其余参数解释如下:
format=json
:Steam提供多种数据返回格式,这里设置为json的形式返回。include_appinfo=1
:返回游戏的详细信息。include_played_free_games=1
:返回的游戏中包括免费游戏。
更多API和参数的说明请参照官方文档。
1 | import requests |
GetOwnedGames返回数据格式
该接口返回用户已拥有的游戏。
1 | { |
字段 | 说明 |
---|---|
appid | 游戏id |
name | 游戏名称 |
playtime_forever | 全平台累计游戏时长(分) |
playtime_windows_forever | windows上的游戏时长(分) |
playtime_mac_forever | mac上的游戏时长(分) |
playtime_linux_forever | linux上的游戏时长(分) |
rtime_last_played | 最近一次游戏时间(结束时间),timestamp格式 |
img_icon_url | 游戏图标文件名 |
rtime_last_played
在使用时可以使用SQL的FROM_UNIXTIME(rtime_last_played)
转换为datetime格式。
可以通过下方等链接来获取游戏图标:
http://media.steampowered.com/steamcommunity/public/images/apps/{appid}/{img_icon_url}.jpg
GetRecentlyPlayedGames返回数据格式
该接口返回用户最近两周游玩的游戏记录,但并不能精确到具体时间。
1 | { |
采集游戏数据
设计数据表
我设计了一张维表和一张事实表来分别记录游戏的维度信息和游玩记录。
dim_steam_owned_game
该表用于存储游戏维度信息,格式与Steam接口返回的格式一致。
字段 | 数据类型 | 备注 |
---|---|---|
appid | varchar(255) | 游戏id |
game_name | varchar(255) | 游戏名称 |
img_icon_url | varchar(255) | 游戏图标文件名 |
playtime_forever | int | 全平台累计游戏时长(分) |
playtime_windows_forever | int | windows上的游戏时长(分) |
playtime_mac_forever | int | mac上的游戏时长(分) |
playtime_linux_forever | int | linux上的游戏时长(分) |
rtime_last_played | int | 最近一次游戏时间(结束时间),timestamp格式 |
dwd_steam_game_played_record
该表用于存储游戏的游玩记录。
字段 | 数据类型 | 备注 |
---|---|---|
id | int | 记录id,自增主键 |
appid | varchar(255) | 游戏id |
game_name | varchar(255) | 游戏名称 |
playtime | int | 全平台累计游戏时长(分) |
playtime_windows | int | windows上的游戏时长(分) |
playtime_mac | int | mac上的游戏时长(分) |
playtime_linux | int | linux上的游戏时长(分) |
rtime_last_played | int | 最近一次游戏时间(结束时间),timestamp格式 |
create_time | datetime | 记录创建时间,默认值CURRENT_TIMESTAMP |
update_time | datetime | 记录修改时间,默认值CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP |
建表语句:1
2
3
4
5
6
7
8
9
10
11
12
13CREATE TABLE `dwd_steam_game_played_record` (
`id` int NOT NULL AUTO_INCREMENT,
`appid` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
`game_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
`playtime` int DEFAULT NULL,
`playtime_windows` int DEFAULT NULL,
`playtime_mac` int DEFAULT NULL,
`playtime_linux` int DEFAULT NULL,
`rtime_last_played` int DEFAULT NULL,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
数据采集脚本
Steam_GetOwnedGames
函数负责从Steam服务器获取全量最新的游戏信息,然后覆盖dim_steam_owned_game
表中的数据。
SteamDA_GamePlayedRecord
在Steam_GetOwnedGames
执行完成之后执行,可重复执行。SteamDA_GamePlayedRecord
通过执行数据查询SQL,以增量更新的形式,计算出最新的游戏记录并插入dwd_steam_game_played_record
表中。
第一次使用时需要从dim_steam_owned_game
导入全量数据进行初始化,作为后续计算的基础,但该部分数据在统计时通常不使用。
1 | import json |
任务调度
因为访问Steam Web API需要科学上网,我的服务器没有配置代理,所以就只好放在本地电脑运行。目前并没有设置定时任务,而是在每次游戏结束以后等游戏记录上传云端再手动运行脚本进行采集。
无需科学上网,使用腾讯云函数进行任务部署及调度的方案请参照这篇文章
为方便脚本执行,我使用快捷指令调用sh脚本,然后sh脚本调用数据采集脚本的形式执行。最后将快捷指令放到菜单栏,就可以很方便的在每次游戏结束后执行数据采集任务了。
sh脚本实现
1 | DA01_HOME_PATH=/your_path/data_acquisition_local |
快捷指令实现
快捷指令菜单栏效果
定时自动采集
快捷指令配合Shortery这个软件可以实现定时自动执行。
在Mac上不推荐使用crontab配置定时任务,因为电脑处于休眠状态时定时任务不会被触发。而Shortery的为防止定时任务在休眠中没有按时执行,可以配置为延迟到下次电脑唤醒时执行。
启动Steam时自动采集
Shortery的触发器还支持在Steam应用启动或关闭时执行快捷指令。
报表效果展示
参考资料:
相关代码已托管于GitHub,欢迎Star!