在 Halo 博客中展示 Steam 用户资料、游戏库、最近游玩记录和徽章信息。
- 展示 Steam 用户资料(头像、昵称、在线状态、等级、上次在线时间)
- 展示游戏库列表(支持分页、按游玩时长排序)
- 展示最近游玩的游戏(可选显示成就进度)
- 展示统计数据(游戏总数、总游玩时长、最近两周游玩时长)
- 展示徽章信息(徽章列表、经验值、等级进度,支持自定义徽章图片)
- 数据缓存机制,减少 API 调用
- 支持 Steam API 代理配置
- 支持自定义图片 CDN 加速
- 提供独立的 Steam 页面(
/steam) - 提供 Finder API,方便主题集成
- 提供 REST API,支持前端异步获取数据
- 完善的错误处理,API 失败时优雅降级显示
- 下载最新版本的 JAR 文件
- 在 Halo 后台 → 插件 → 安装插件
- 上传 JAR 文件并启用插件
- 获取 Steam API Key:访问 Steam 开发者页面
- 获取 Steam ID:17位数字格式(如
76561198000000000) - 在 Halo 后台 → 插件 → Steam 信息展示 → 设置 中填写配置
- 点击「验证配置」确认 API Key 和 Steam ID 有效
- 页面标题:Steam 页面的标题
- 每页显示数量:游戏库分页每页显示的游戏数量
- 游戏库总数量限制:最多显示的游戏数量(按游玩时长排序),设为 0 则不限制
- 最近游玩显示数量:最近游玩区域显示的游戏数量
- 显示最近游玩成就进度:开启后显示成就完成进度(会增加加载时间)
- 点击游戏卡片跳转 Steam 商城:开启后点击游戏卡片跳转到 Steam 商城页面
- 包含免费游戏:开启后游戏库会包含玩过的免费游戏(如 CS2、Dota 2 等)
支持为 Steam 系统徽章配置自定义图片:
- Badge ID:Steam 徽章 ID,可在徽章页面 URL 中查看(如
/badges/1中的1) - 徽章名称:便于识别(可选)
- 图片 URL:徽章图片完整地址,可从 Steam 页面右键复制
如果服务器无法直接访问 Steam API,可以配置代理:
- HTTP 代理:配置代理主机和端口
- 自定义 API 地址:使用第三方 Steam API 代理服务
插件安装后,访问 /steam 即可查看 Steam 信息页面。
在主题模板中使用 steamFinder 获取数据:
<!-- 获取用户资料 -->
<th:block th:with="profile=${steamFinder.getProfile()}">
<div th:if="${profile != null}">
<span th:text="${profile.summary?.personaName}">用户名</span>
</div>
</th:block>
<!-- 获取最近游玩 -->
<th:block th:with="recentGames=${steamFinder.getRecentGames(5)}">
<div th:if="${recentGames != null}" th:each="game : ${recentGames}">
<span th:text="${game.name}">游戏名</span>
</div>
</th:block>
<!-- 获取游戏库(分页) -->
<th:block th:with="games=${steamFinder.getOwnedGames(1, 12)}">
<div th:if="${games != null}" th:each="game : ${games.items}">
<span th:text="${game.name}">游戏名</span>
</div>
</th:block>
<!-- 获取统计数据 -->
<th:block th:with="stats=${steamFinder.getStats()}">
<span th:if="${stats != null}" th:text="${stats.totalGames}">游戏总数</span>
</th:block>
<!-- 获取徽章信息 -->
<th:block th:with="badges=${steamFinder.getBadges()}">
<span th:if="${badges != null}" th:text="${badges.totalBadges}">徽章总数</span>
<span th:if="${badges != null}" th:text="${badges.playerXp}">总经验值</span>
<span th:if="${badges != null}" th:text="${badges.playerLevel}">等级</span>
</th:block>
⚠️ Finder API 在请求失败时返回null,建议做判空处理。详见 使用教程。
GET /apis/api.steam.timxs.com/v1alpha1/profile
响应示例:
{
"summary": {
"steamId": "76561198000000000",
"personaName": "用户名",
"profileUrl": "https://steamcommunity.com/id/xxx/",
"avatarFull": "https://avatars.steamstatic.com/xxx_full.jpg",
"personaState": 1,
"lastLogoff": 1704700000
},
"steamLevel": 50,
"statusText": "在线",
"playing": false
}GET /apis/api.steam.timxs.com/v1alpha1/games?page=1&size=20&sortBy=playtime_forever
参数:
page:页码,默认 1size:每页数量,默认 12,最大 100sortBy:排序方式,playtime_forever(游玩时长)或name(名称)
响应示例:
{
"page": 1,
"size": 20,
"total": 150,
"items": [
{
"appId": 730,
"name": "Counter-Strike 2",
"playtimeForever": 12000,
"playtimeFormatted": "200 小时",
"headerImageUrl": "https://cdn.cloudflare.steamstatic.com/steam/apps/730/header.jpg",
"lastPlayedFormatted": "2025-01-08"
}
]
}GET /apis/api.steam.timxs.com/v1alpha1/recent?limit=5
参数:
limit:返回数量,默认使用配置值
响应示例:
[
{
"appId": 730,
"name": "Counter-Strike 2",
"playtime2Weeks": 120,
"playtime2WeeksFormatted": "2 小时",
"headerImageUrl": "https://cdn.cloudflare.steamstatic.com/steam/apps/730/header.jpg"
}
]GET /apis/api.steam.timxs.com/v1alpha1/stats
响应示例:
{
"totalGames": 150,
"totalPlaytimeMinutes": 120000,
"totalPlaytimeFormatted": "2000 小时",
"recentPlaytimeMinutes": 600,
"recentPlaytimeFormatted": "10 小时"
}GET /apis/api.steam.timxs.com/v1alpha1/achievements/{appId}
参数:
appId:游戏 ID
响应示例:
{
"appId": 730,
"gameName": "Counter-Strike 2",
"achievedCount": 50,
"totalAchievements": 167
}GET /apis/api.steam.timxs.com/v1alpha1/badges
响应示例:
{
"badges": [...],
"totalBadges": 25,
"playerXp": 5000,
"playerLevel": 50,
"xpNeededToLevelUp": 100,
"levelProgressPercent": 80
}# 克隆项目
git clone https://github.com/Tim0x0/steam.git
cd steam
# 启用插件开发服务器
./gradlew haloServer./gradlew build构建完成后,可以在 build/libs 目录找到插件 JAR 文件。
- Halo >= 2.22.1
- JDK 21
