功能介绍
Steam 页面
插件安装并配置完成后,访问 /steam 即可查看内置 Steam 信息页面。页面数据主要由后台定时预热,访问时读取缓存,因此日常打开不需要等待 Steam API 实时响应。
页面包含:
- 用户资料卡片:头像、昵称、在线状态、Steam 等级、上次在线时间
- 统计数据:游戏总数、总游玩时长、最近两周游玩时长
- 热力图:可视化展示每日游戏投入,需启用时长追踪
- 最近游玩:最近两周游玩的游戏,可选显示成就进度和库外标识
- 游戏库:分页浏览、按游玩时长或名称排序,可隐藏指定游戏并限制显示数量
游戏库
游戏库来自 Steam IPlayerService/GetOwnedGames,并通过 IStoreBrowseService/GetItems 批量补全本地化名称和真实封面。
- 支持分页浏览,每页数量可配置;REST API 最大
size为 100 - 默认按总游玩时长排序,也可按名称排序
- 支持隐藏指定 AppID
- 支持是否包含免费游戏
- 可设置游戏库总显示数量,设为 0 表示不限制
封面与不可用标识
新游戏封面位于带内容哈希的 store_item_assets 路径,不能再靠 AppID 拼接 header.jpg。插件会通过 GetItems 获取真实封面,并在配置了「游戏图片加速域名」时只替换图片 URL 的域名部分。
delisted=true 只在 GetItems 明确返回 visible=false 时设置,表示当前地区或状态下商店不可见,页面会显示「不可用」徽章并使用占位图。GetItems 没有返回某个 AppID 只表示本次未覆盖到它,不会被判定为不可用。
最近游玩
最近游玩来自 Steam IPlayerService/GetRecentlyPlayedGames,同样会用 GetItems 补全真实封面和本地化名称。
最近游玩条目包含:
- 游戏封面、名称、图标
- 最近两周游玩时长
- 总游玩时长
- 商店不可见标识
delisted - 是否在当前游戏库缓存中
inLibrary - 可选成就进度
成就进度
开启「显示最近游玩成就进度」后,后台刷新最近游玩缓存时会为每个最近游玩的游戏额外请求成就 API,并把结果随最近游玩列表一起缓存。页面命中缓存时不会再逐个游戏实时请求成就 API。
- 显示格式:
已完成/总数 - 隐私设置导致成就不可用时显示锁定状态
- 游戏没有成就系统时不显示成就内容
- 开启后会增加后台预热耗时和 Steam API 调用量,最近游玩较多时建议适当调大「活跃信息刷新间隔」
徽章系统
徽章信息来自 Steam IPlayerService/GetBadges。
- 游戏徽章默认显示游戏图标样式
- 系统徽章、活动徽章可在「徽章配置」中按 Badge ID 映射自定义图片和名称
- 页面会显示玩家等级、经验值、升级所需经验和等级进度
热力图
热力图通过插件自定义资源记录每日游戏时长变化。
- 定时任务每小时第 59 分钟追踪一次游戏时长
- 可手动触发一次追踪用于测试
- 支持 4 种颜色主题:Steam 蓝色、GitHub 绿色、火焰橙色、紫色梦幻
- 可配置显示天数、图例和数据保留天数
Steam API 不提供历史每日数据,热力图只能从启用时长追踪后开始记录。首次启用后通常需要等待至少 1 小时产生第一个数据点。
富文本游戏卡片
插件为 Halo 富文本编辑器提供 Steam 游戏卡片扩展。输入 AppID 或 Steam 商店链接后,会调用 /game-detail/{appId} 获取详情并渲染卡片。
游戏卡片可显示:
- 游戏封面、名称、简介
- 开发商、发行商、类型标签
- 价格、发行日期、商店链接
- 是否拥有该游戏
- 拥有时的总游玩时长、最后游玩日期和成就进度
游戏卡片详情使用 Steam Store /api/appdetails,不是列表用的 GetItems。二者职责不同:GetItems 用于批量补全列表名称和封面,appdetails 用于获取详情字段。
当某个 AppID 在商店取不到详情(appdetails 返回 success:false)时,卡片会用 GetItems 的 visible=false 二次确认:确认不可见则显示「该游戏不可用(已下架、区域限制或 ID 无效)」提示(保留商店链接、不显示重试);若只是临时取不到(如接口限流),仍按「加载失败」处理并可重试。
多语言与图片加速
「游戏显示语言」作用于页面列表和编辑器游戏卡片:
- 自动模式下,页面列表按 Halo 后台首选语言;游戏卡片按访客浏览器语言
- 指定语言时,所有场景都使用该语言
图片加速通过「游戏图片加速域名」统一处理封面、图标和头像,只替换域名,保留 Steam 原始路径。图标仍使用 iconImageTemplate 拼接;封面来自 GetItems 或 appdetails 返回的真实地址。
数据缓存
页面列表数据依赖后台预热刷新:
| 数据类型 | 刷新方式 | 默认间隔 |
|---|---|---|
| 用户资料 | 活跃信息预热 | 10 分钟 |
| 最近游玩 | 活跃信息预热 | 10 分钟 |
| 游戏库 | 库藏信息预热 | 60 分钟 |
| 徽章信息 | 库藏信息预热 | 60 分钟 |
| 游戏详情 | 按需查询,按 TTL 过期 | 10 分钟 |
页面列表读取 getStale 缓存,即使缓存按 TTL 已过期,也会继续返回旧数据作为失败兜底;真正的新鲜度由活跃信息/库藏信息刷新间隔控制。按需游戏详情使用「缓存过期时间」控制。
点击「刷新缓存」会清空缓存并在后台触发一次预热。刚刷新后的短时间内,页面可能暂无数据,等待预热完成即可恢复。
代理支持
如果服务器无法直连 Steam,可以配置:
- HTTP 代理:用于访问 Steam API 和 Store API
- 自定义 API 地址:替换
api.steampowered.com/ Store 相关路径的代理入口 - 游戏图片加速域名:用于加速封面、图标、头像等图片资源
自定义 API 代理需透传 Steam API 路径和查询参数,并同时支持 api.steampowered.com 的 Web API 路径与 store.steampowered.com/api/appdetails。