📜  对朋友隐藏 Steam 游戏 - Java (1)

📅  最后修改于: 2023-12-03 14:53:39.825000             🧑  作者: Mango

隐藏 Steam 游戏 - Java

在 Steam 游戏中,我们可能不希望其他人能够看到我们正在玩什么游戏。尤其是在某些情况下,我们希望对自己的 Steam 好友隐藏某些游戏。因此,在 Java 中编写一个程序来实现隐藏 Steam 游戏的功能是非常必要的。

实现步骤

在 Java 代码中,我们需要进行以下步骤:

  1. 找到 Steam 的游戏安装目录和缓存目录。
  2. 遍历 Steam 游戏列表,将不需要被展示的游戏从列表中删除。
  3. 使用 Steam API 更新游戏列表。
找到 Steam 的游戏安装目录和缓存目录

Steam 的默认安装位置在 Windows 上是 C:\Program Files (x86)\Steam。但是,用户安装 Steam 后仍可以选择将其安装到其他位置。因此,找到 Steam 安装路径的最简单方法是检查注册表。

private static String getSteamInstallPath() {
    String installPath = null;
    try {
        // Read Steam InstallPath from registry
        Process process = Runtime.getRuntime().exec("reg query HKLM\\SOFTWARE\\Valve\\Steam");
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String registryValue;
        while ((registryValue = bufferedReader.readLine()) != null) {
            if (registryValue.contains("InstallPath")) {
                installPath = registryValue.split("    ")[3];
                break;
            }
        }
        process.waitFor();
    } catch (IOException | InterruptedException e) {
        e.printStackTrace();
    }
    return installPath;
}

在这个例子中,我们使用了 Runtime.getRuntime().exec() 方法来调用系统命令,并从命令行的输出中获取了 Steam 的安装路径。

Steam 缓存目录通常位于 C:\Program Files (x86)\Steam\appcache 下。在我们继续下一步之前确保找到这两个路径。

遍历 Steam 游戏列表

Steam 缓存目录中的 appinfo.vdf 文件保存了所有安装的游戏的元数据。我们将使用 Valve Resource Format (VRF) 库来解析这个文件,可以在 GitHub 上找到 它的 Java 实现。

private static void hideGames(List<Game> games) {
    String steamInstallPath = getSteamInstallPath();
    String appInfoPath = steamInstallPath + "\\appcache\\appinfo.vdf";
    try (ValveDataInputStream input = new ValveDataInputStream(new FileInputStream(appInfoPath))) {
        while (input.available() > 0) {
            ValveDataValue value = input.readValue();
            if (value.getName().equals("AppState")) {
                int steamAppId = value.getChild("appid").asInteger();
                String gameName = value.getChild("name").asString();
                // Delete hidden games from list
                if (games.contains(new Game(steamAppId, gameName))) {
                    games.remove(new Game(steamAppId, gameName));
                }
            }
        }
    } catch (IOException | ValveDataFormatException e) {
        e.printStackTrace();
    }
}

在我们的代码中,GameState 是一个自定义的类,它保存了 Steam AppID 和游戏名称。我们将遍历 appinfo.vdf 中所有的 AppState 节点,然后将解析出来的 Steam AppID 和游戏名称保存在 GameState 对象中。最后,我们将从要隐藏的游戏列表中删除这些游戏。

使用 Steam API 更新游戏列表

最后,我们需要使用 Steam API 来将更新后的游戏列表上传到 Steam。Steam API 要求我们使用 Steam Web API Key 进行身份验证。 要获取 Steam Web API Key,请按照以下步骤操作:

  1. 在 Steam 上注册一个新的 Web API Key。
  2. 将生成的 Web API Key 保存在一个安全的位置,并且不要在公共代码仓库中共享。
public static final String STEAM_API_KEY = "YOUR_API_KEY";

public static void main(String[] args) {
    // Get list of games to hide
    List<Game> gamesToHide = Arrays.asList(
            new Game(407530, "Geometry Dash"),
            new Game(367520, "Enter the Gungeon"),
            new Game(440, "Team Fortress 2")
    );
    // Hide games
    hideGames(gamesToHide);
    // Authenticate with Steam and update game list
    SteamAPI.loadLibraries();
    if (!SteamAPI.init()) {
        return;
    }
    SteamFriends steamFriends = new SteamFriends(new SteamFriendsCallback() {
    });
    steamFriends.setPersonaState(EPersonaState.Invisible);
}

在此代码中,我们使用 Steam Web API Key 来初始化 Steam API,并且在该示例代码中将自己设为不可见状态。

结论

尽管这只是一个简单的例子,但它展示了如何使用 Java 和 Steam API 在 Steam 中隐藏游戏。值得注意的是,由于 Steam API 不是公共的,因此需要使用一个 Steam Web API Key 来进行身份验证,以确保与 Steam 的安全通信。