Полное руководство по Steam Web API

Используем Steam Web API

Если на вашем сайте есть авторизация через Steam или ваш сайт связан с БД игрового сервера, вам может понадобиться получить статус, никнейм, аватарку игрока или другие сведения. А может быть вы даже хотите выгружать публикации разработчиков игр прямо из Steam себе на сайт? В этой статье я покажу, как использовать все доступные на момент написания статьи методы Steam Web API.

Для начала вам необходимо получить API ключ. Вы можете сделать это здесь.

Далее в вашем скрипте PHP объявим константу с полученным API ключом:

define('STEAM_API_KEY', 'ваш ключ');

Получаем информацию о пользователе через Steam Web API

Для использования методов, вам потребуется SteamID 64 пользователя. Если в вашей БД SteamID хранятся в другом формате, вы можете конвертировать их, об этом я рассказал в этой статье.

Получаем основную информацию:

$sid64 = 76561198210303223;
$res = file_get_contents("http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=".STEAM_API_KEY."&steamids=$sid64");
$res = json_decode($res, true)['response']['players'][0];
$nick = $res['personaname'];
$profile = $res['profileurl'];
$avatar = $res['avatarfull']; // 184x184
//$avatar = $res['avatarmedium']; // 64x64
//$avatar = $res['avatar']; // 32x32
$status =  $res['personastate']; // 0 - не в сети, 1 - в сети, 2 - занят, 3 - нет дома, 4 - спит, 5 - ищет с кем обменяться, 6 - ищет с кем поиграть
$visibility = $res['communityvisibilitystate']; // 3 - открытый профиль
$logoff = date('d.m.Y H:i', $res['lastlogoff']); // был онлайн
$comments = $res['commentpermission']; // 1 - публичные комментарии разрешены, 0 - нет

Эти данные можно получить для всех пользователей, они являются публичными. Обратите внимание на переменную $visibility, если вы хотите получить больше данных. Если она равна 3, значит профиль открытый и вы сможете получить некоторые приватные данные, иначе приватные данные могут быть не видны. Они могут быть видны, если владелец API ключа находится в друзьях у пользователя с приватностью “только для друзей”. В любом случае, приватные параметры лучше проверять на существование, прежде чем к ним обращаться и в примерах ниже я буду использовать для этого тернарный оператор ??.

Что можно получить из приватных данных в открытых профилях:

$name = $res['realname'] ?? null;
$created = date('d.m.Y H:i', $res['timecreated']);
$group = $res['primaryclanid'] ?? null; // id основной группы в профиле
$game = $res['gameid'] ?? null; // id игры, если пользователь в игре
$game_server = $res['gameserverip'] ?? null; // ip и порт сервера для доступных онлайн игр, если пользователь в игре, иначе значение будет 0.0.0.0
$game_extra = $res['gameextrainfo'] ?? null; // название игры, если пользователь в игре
$country = $res['loccountrycode'] ?? null; // ISO-код страны пользователя, если указан
$state = $res['locstatecode'] ?? null; // код штата пользователя, если указан
$city_id = $res['loccityid'] ?? null; // код города пользователя, если указан (внутренняя нумерация Steam)

Используя полученные переменные кода страны, штата и города пользователя, вы можете получить название города следующим образом:

if ($country && $state && $city_id) {
    $cities = json_decode(file_get_contents("https://steamcommunity.com/actions/QueryLocations/$country/$state"), true);
    $i = array_search($city_id, array_column($cities, 'cityid'));
    $city = $cities[$i]['cityname'];
} else $city = 'N/A';

Получаем список друзей:

Это можно сделать только если у пользователя открытый профиль.

$sid64 = 76561198210303223;
$res = file_get_contents("http://api.steampowered.com/ISteamUser/GetFriendList/v0001/?key=".STEAM_API_KEY."&steamid=$sid64&relationship=friend");
$res = json_decode($res, true)['friendslist']['friends'];
foreach ($res as $f) {
    echo $f['steamid'].PHP_EOL; // SteamID 64
    echo date('d.m.Y H:i', $f['friend_since']).PHP_EOL; // дата начала дружбы
}

Далее мы рассмотрим методы, связанные не только с пользователем, но и с его играми.

Получаем информацию о пользователе и его играх через Steam Web API

Получаем список достижений пользователя по конкретной игре:

$sid64 = 76561198210303223;
$app_id = 227300;
$res = file_get_contents("http://api.steampowered.com/ISteamUserStats/GetPlayerAchievements/v0001/?key=".STEAM_API_KEY."&steamid=$sid64&appid=$app_id&l=russian");
$res = json_decode($res, true)['playerstats'];
$game = $res['gameName']; // название игры
foreach ($res['achievements'] as $a) {
    echo $a['apiname'].PHP_EOL; // техническое название
    echo $a['achieved'].PHP_EOL; // 1 - получено, 0 - нет
    echo date('d.m.Y H:i', $a['unlocktime']).PHP_EOL; // дата получения, только если achieved = 1
    echo $a['name'].PHP_EOL; // локализованное название
    echo $a['description'].PHP_EOL; // локализованное описание
}

Метод выдает весь список достижений в игре, показывая какие получены пользователем, а какие нет. Локализованное название и описание есть только при передаче параметра l=russian в запросе, но названия и описания могут быть на английском, если не имеют русской локализации, сверяйтесь с клиентом Steam.

Есть еще метод GetUserStatsForGame, он показывает только полученные достижения, а также некоторую статистику по игре. Но там нет названий достижений (только в виде apiname), а для статистики используются тоже только технические названия. Применения этому методу я пока не нашел, поэтому писать о нем не буду.

Получить список всех игр пользователя:

$sid64 = 76561198210303223;
$res = file_get_contents("http://api.steampowered.com/IPlayerService/GetOwnedGames/v0001/?key=".STEAM_API_KEY."&steamid=$sid64&include_appinfo=1&include_played_free_games=1");
$res = json_decode($res, true)['response'];
$game = $res['game_count']; // Кол-во игр на аккаунте
foreach ($res['games'] as $g) {
    echo $g['appid'].PHP_EOL; // ID игры
    echo $g['name'].PHP_EOL; // название игры
    echo isset($g['playtime_2weeks']) ? $g['playtime_2weeks'].PHP_EOL : ''; // кол-во минут игры за последние 2 недели, если есть
    echo $g['playtime_forever'].PHP_EOL; // общее кол-во минут игры за все время (учет ведется с начала 2009)
    echo "http://media.steampowered.com/steamcommunity/public/images/apps/".$g['appid']."/". $g['img_icon_url'].".jpg".PHP_EOL; // ссылка на иконку игры
    if (isset($g['has_community_visible_stats'])) {
        echo "http://steamcommunity.com/profiles/$sid64/stats/".$g['appid'].PHP_EOL; ; // страница со статистикой пользователя для этой игры
    }
    echo $g['playtime_windows_forever'].PHP_EOL; // кол-во минут игры на платформе Windows
    echo $g['playtime_mac_forever'].PHP_EOL; // кол-во минут игры на платформе MacOS
    echo $g['playtime_linux_forever'].PHP_EOL; // кол-во минут игры на платформе Linux
    echo date('d.m.Y H:i', $g['rtime_last_played']).PHP_EOL; // дата последней игры
}

Метод работает только для общедоступных профилей. Вы можете по желанию убрать из запроса include_played_free_games=1, тогда в результатах не будет отображаться статистика бесплатных игр. Если же убрать из запроса include_appinfo=1, то в результатах не будет названий игр и хэша иконок.

Получаем список игр, сыгранных пользователем за последние 2 недели:

$sid64 = 76561198210303223;
$res = file_get_contents("http://api.steampowered.com/IPlayerService/GetRecentlyPlayedGames/v0001/?key=".STEAM_API_KEY."&steamid=$sid64");
$res = json_decode($res, true)['response'];
$game = $res['total_count']; // кол-во игр за последние 2 недели
foreach ($res['games'] as $g) {
    echo $g['appid'].PHP_EOL; // ID игры
    echo $g['name'].PHP_EOL; // название игры
    echo $g['playtime_2weeks'].PHP_EOL; // кол-во минут игры за последние 2 недели
    echo $g['playtime_forever'].PHP_EOL; // общее кол-во минут игры за все время (учет ведется с начала 2009)
    echo "http://media.steampowered.com/steamcommunity/public/images/apps/".$g['appid']."/". $g['img_icon_url'].".jpg".PHP_EOL; // ссылка на иконку игры
    echo $g['playtime_windows_forever'].PHP_EOL; // кол-во минут игры на платформе Windows
    echo $g['playtime_mac_forever'].PHP_EOL; // кол-во минут игры на платформе MacOS
    echo $g['playtime_linux_forever'].PHP_EOL; // кол-во минут игры на платформе Linux
}

Метод работает только для общедоступных профилей. По желанию, вы можете добавить в запрос параметр count=число, чтобы ограничить кол-во игр в результатах.

Теперь рассмотрим методы, связанные только с играми, без привязки к пользователям.

Получаем информацию об играх через Steam Web API

Получаем новости игры или приложения:

$app_id = 227300;
$res = file_get_contents("http://api.steampowered.com/ISteamNews/GetNewsForApp/v0002/?appid=$app_id&count=5");
$res = json_decode($res, true)['appnews'];
foreach ($res['newsitems'] as $n) {
    echo $n['gid'].PHP_EOL; // id публикации
    echo $n['url'].PHP_EOL; // ссылка на публикацию в Steam
    echo $n['title'].PHP_EOL; // заголовок
    echo $n['author'].PHP_EOL; // автор
    echo $n['contents'].PHP_EOL; // контент
    echo date('d.m.Y H:i', $n['date']).PHP_EOL; // дата публикации
}

В указанном примере будут выведены 5 последний публикаций приложения. Вы можете убрать параметр count=5 из запроса или изменить под свои нужды. Также можно ограничивать длину контента каждой публикации, для этого передайте в запросе maxlength=число

Получаем глобальную статистику достижений по игре:

$app_id = 227300;
$res = file_get_contents("http://api.steampowered.com/ISteamUserStats/GetGlobalAchievementPercentagesForApp/v0002/?gameid=$app_id");
$res = json_decode($res, true)['achievementpercentages'];
foreach ($res['achievements'] as $a) {
    echo $a['name'].PHP_EOL; // техническое имя достижения
    echo '~'.round($a['percent']).'%'.PHP_EOL; // процент игроков, получивших достижение
}

На этом у меня все, надеюсь, что статья была для вас полезной.