Главная > HOWTO > Значительные изменения в Steam WebAPI и работа с ним

Значительные изменения в Steam WebAPI и работа с ним

Раньше для получения информации о пользовательских профилях Steam, мы просто дописывали в конец URL (конечно предварительно проверив его регулярным выражением) ?xml=1 и в результате получали XML с полной информацией, которая уже использовалась нашей системой проверки.

В последнее время такая система постоянно выдавала ошибки 503 Service Unavailable и, в конце концов, Valve решили полностью отказаться от данного функционала, объявив его устаревшим.

Теперь для проверки пользовательских профилей и получения информации нужно использовать полноценный WebAPI с авторизацией по токену. Токены доступа можно получить в разделе для разработчиков.

Один Steam аккаунт может запросить только один токен. Существует возможность аннулировать старый и получить новый.

Работа с WebAPI

Steam WebAPI работает посредством GET-запросов на специальный адрес api.steampowered.com (протокол HTTP). Для подачи любого запроса обязательно должен присутствовать параметр key, в котором передаётся полученный токен разработчика. Если вы его не укажете или укажете недействительный (или заблокированный), то получите сообщение об ошибке Unauthorized.

Каждая из функций WebAPI также имеет собственные обязательные и необязательные параметры. В случае отсутствия обязательных, сервер выдаст сообщение об ошибке Bad Request. Необязательные можно опускать и в таком случае будут использоваться значения по умолчанию.

XML, JSON или VDF

Steam WebAPI может выдавать результат обработки запроса в следующих форматах:

  • XML — eXtensible Markup Language;
  • JSON — JavaScript Object Notation;
  • VDF — Valve Data File.

Для указания варианта вывода используется необязательный параметр format, принимающий одно из допустимых значений. Если параметр не указан, то будет использован JSON.

Мы в своих проектах используем XML.

Получение SteamID из Custom URL

Как уже говорилось выше, раньше для получения SteamID64 мы использовали ?xml=1, однако теперь необходимо вызывать функцию ResolveVanityURL. Пример вызова на PHP:

<?php
function resolve_id($id, $token = STEAM_TOKEN)
{
  if (!preg_match('/^7656119[0-9]{10}$/i', $id))
  {
    // Получим SteamID64 из CustomURL...
    $xml = @simplexml_load_file(sprintf("http://api.steampowered.com/ISteamUser/ResolveVanityURL/v0001/?key=%s&format=xml&vanityurl=%s", $token, $id));
    // Вернём ответ...
    return $xml -> success == "1" ? $xml -> steamid : null;
  }
  else
  {
    return $id;
  }
}
?>

Ссылка на GitHub: https://gist.github.com/xvitaly/5141827.

Константа STEAM_TOKEN содержит токен, который вы получили при регистрации разработчика.

Преобразование форматов SteamID

Существует несколько форматов SteamID:

  • SteamID32 вида STEAM_0:X:XXXXXX, регулярное выражение для проверки: /^STEAM_0:[01]:[0-9]{1,9}$/;
  • SteamID64 вида 7656119XXXXXXXXXX, регулярное выражение для проверки: /^7656119[0-9]{10}$/i.

Для преобразования из 32 в 64 и наоборот, мы написали класс SteamConv, распространяющийся под лицензией GNU GPL v3.

Функции класса SteamConv:

  • string get_steamid64 (string) — получает SteamID64 из SteamID32;
  • string get_userid (string) — получает т.н. UserID (используется для наименования каталогов внутри /Steam/userdata/);
  • string get_steamid32 (string) — получает SteamID32 из SteamID64.

Получение пользовательской информации

Если раньше было достаточно одного запроса, то теперь для получения всей информации нужно сделать целых два: вызвать функцию GetPlayerSummaries для получения общей информации и GetPlayerBans для информации о блокировках (VAC-бан, трейд, сообщество и т.д.).

Обе функции допускают получение информации сразу о нескольких пользователях. Разделителем служит запятая.

Функция GetPlayerSummaries

Вызов функции GetPlayerSummaries осуществляется по URL вида:

http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=ТОКЕН&steamids=STEAMID&format=xml

Здесь ТОКЕН — полученный токен авторизации, а STEAMID — SteamID в формате SteamID64 (это важно, т.к. в случае неверного формата будет выдано сообщение об ошибке Bad Request). Допускается указание нескольких SteamID через запятую.

В результате вы получите XML, JSON или VDF со следующими обязательными полями:

  • steamid — SteamID64 пользователя;
  • communityvisibilitystate — статус профиля в Сообществе Steam:
    • 1 — скрытый;
    • 2 — только для друзей;
    • 3 — для друзей и друзей друзей;
    • 4 — для всех авторизованных пользователей;
    • 5 — публичный;
  • profilestate — статус профиля:
    • 1 — пользователь сконфигурировал свой профиль;
    • 0 — профиль-невидимка (не имеет никнейма, аватара и т.д.);
  • personaname — никнейм пользователя;
  • lastlogoff — дата последнего входа в Steam в формате UNIXTIME;
  • profileurl — прямая ссылка на профиль (если задан CustomURL, то будет выдан именно он, иначе — неизменяемая ссылка);
  • avatar — аватар пользователя в формате 32*32 пикселя;
  • avatarmedium — аватар пользователя в формате 64*64 пикселя;
  • avatarfull — аватар пользователя в формате 184*184 пикселя;
  • personastate — текущий статус пользователя:
    • 0 — оффлайн (или профиль скрыт);
    • 1 — онлайн;
    • 2 — занят;
    • 3 — отошёл;
    • 4 — спит (idle);
    • 5 — готов к торговле;
    • 6 — готов к игре.

Все остальные поля являются опциональными и доступны только для публичных (открытых) профилей. Полный их список можете найти в англоязычной документации.

Функция GetPlayerBans

С помощью данной функции можно получить информацию о блокировках пользователя. Вызов осуществляется посредством URL вида:

http://api.steampowered.com/ISteamUser/GetPlayerBans/v1/?key=ТОКЕН&steamids=STEAMID&format=xml

Здесь ТОКЕН — полученный токен авторизации, а STEAMID — SteamID в формате SteamID64 (это важно, т.к. в случае неверного формата будет выдано сообщение об ошибке Bad Request). Допускается указание нескольких SteamID через запятую.

В результате вы получите XML, JSON или VDF со следующими обязательными полями:

  • SteamId — SteamID пользователя;
  • CommunityBanned — имеет ли место блокировка пользователя в Сообществе Steam: true — да, false — нет;
  • VACBanned — заблокирован ли пользователь системой Valve Anti-Cheat: true — да, false — нет;
  • EconomyBan — указывает статус возможности обмена:
    • none — нет;
    • banned — заблокирована;
    • probation — пользователь на испытательном сроке.

Получение друзей пользователя

Для получения друзей пользователя необходимо вызвать функцию GetFriendList по URL вида:

http://api.steampowered.com/ISteamUser/GetFriendList/v0001/?key=ТОКЕН&steamid=STEAMID&relationship=friend&format=xml

Здесь ТОКЕН — полученный токен авторизации, а STEAMID — SteamID в формате SteamID64 (это важно, т.к. в случае неверного формата будет выдано сообщение об ошибке Bad Request).

Формат вывода:

  • steamid — SteamID друга пользователя;
  • friend_since — дата добавления в друзья в формате UNIXTIME;
  • relationship — роль в списке друзей:
    • friend — друг;
    • blocked — заблокирован пользователем.

Функция получения списка друзей доступна только для открытых (публичных) профилей Steam. Во всех остальных список будет пустым.

Получение списка подписок на аккаунте

Для получения списка подписок, зарегистрированных на аккаунте (игры, программы, DLC), необходимо вызвать функцию GetOwnedGames при помощи URL вида:

http://api.steampowered.com/IPlayerService/GetOwnedGames/v0001/?key=ТОКЕН&steamid=STEAMID&format=xml

Здесь ТОКЕН — полученный токен авторизации, а STEAMID — SteamID в формате SteamID64. Доступные необязательные параметры:

  • include_appinfo — включит в вывод функции подробную информацию о подписке (название и URL в Steam Store);
  • include_played_free_games — позволяет включить в вывод бесплатные игры, такие как Team Fortress 2;
  • appids_filter — позволяет отфильтровать список только нужными играми. В качестве допустимых значений может выступать только массив из целых чисел.

Формат вывода:

  • appid — ID подписки в CDR;
  • name — название подписки (только если в запросе был задан include_appinfo);
  • playtime_forever — время, проведённое в данной игре/программе (у DLC всегда равно 0);
  • img_icon_url — ссылка на значок (только если в запросе был задан include_appinfo);
  • img_logo_url — ссылка на логотип (только если в запросе был задан include_appinfo);
  • has_community_visible_stats — имеется ли у данной игры расширенная статистика, которую можно получить другими методами API.

Получение содержимого рюкзака

Получением содержимого рюкзака (бэкпака) занимается функция GetPlayerItems. Вызывается URL вида:

http://api.steampowered.com/IEconItems_КОД/GetPlayerItems/v0001/?key=ТОКЕН&steamid=STEAMID&format=xml

Здесь КОД — код игры по базе Steam (для Team Fortress 2 — 440) ТОКЕН — полученный токен авторизации, а STEAMID — SteamID в формате SteamID64 (это важно, т.к. в случае неверного формата будет выдано сообщение об ошибке Bad Request).

Вывод специфичен для каждой игры, поэтому полную информацию на английском языке вы найдёте здесь.

Категории:HOWTO Метки:, , ,
  1. Иван
    6 июня 2013 в 09:11 | #1

    Подскажите пожалуйста, можно ли вывести с помощью функции GetPlayerItems весь инвентарь, а не определенной игры(к примеру Team Fortress 2)? Подскажите как это реализовать.

  2. 7 июня 2013 в 07:36 | #2

    @Иван
    Понятия «весь инвентарь» не существует. Инвентари существуют только для каждой игры в отдельности.

  3. Александр
    6 августа 2014 в 21:14 | #3

    Здравствуйте, не могли бы вы подсказать как вытащить статистику по операциям в кс го. Всю статистику вывел но там нет по операциям и нет соревновательной статистики. Подскажите пожалуйста

  4. 8 августа 2014 в 15:02 | #4

    @Александр
    Отдельной статистики по каждой из операций Steam API не предоставляет.

    Полный список всех доступных методов Steam Web API можно получить выполнив GET запрос по следующему URI:

    http://api.steampowered.com/ISteamWebAPIUtil/GetSupportedAPIList/v0001/?key=TOKEN&format=xml

    Здесь TOKEN — токен авторизации для Web API.

  5. Роман
    26 декабря 2014 в 15:35 | #5

    Что такое токен? Пробую вывести свой инвентарь игры CS:GO, её ид 730
    api.steampowered.com/IEconItems_730/GetPlayerItems/v0001/?key=ТОКЕН&steamid=76561198036370701&format=xml
    Выдает ошибку:
    Forbidden
    Access is denied. Retrying will not help. Please verify your
    key=
    parameter.

  6. 27 декабря 2014 в 00:45 | #6

    Роман :

    Что такое токен?

    Уникальный идентификатор пользователя Steam Web API. Получить или просмотреть его можно здесь.

    Роман :

    Access is denied.

    Естественно. Анонимый доступ к API запрещён.

  7. Роман
    23 января 2015 в 16:03 | #7

    Спасибо, сделал токен, вот что получилось:

    https://api.steampowered.com/IEconItems_730/GetPlayerItems/v0001/?key=ТОКЕН&steamid=76561198036370701&format=xml

    Но опять ошибка, вот что пишет на странице:
    Ошибка синтаксического анализа XML: ошибка синтаксиса «Строка 2, символ 11».

  8. 25 января 2015 в 00:22 | #8

    Роман :

    Спасибо, сделал токен, вот что получилось:

    Будьте осторожнее со своим токеном. Его следует хранить в секрете, как и любой пароль. Я скрыл его из вашего сообщения, но настоятельно рекомендую отозвать его и сгенерировать новый.

    Роман :

    Ошибка синтаксического анализа XML: ошибка синтаксиса «Строка 2, символ 11″.

    Это нормально, т.к. XML следует разбирать XML-парсером (в php например через стандартный simplexml), а не просматривать в браузере.

  9. Роман
    27 января 2015 в 17:51 | #9

    почти сделано)
    Получил токен для своего домена, залил туда страницу с таким

    но не работает, даже в коде страницы кода вообще нет, есть две пустые строки. Я так думаю что дело в строке $count = $file->items;
    а именно в items, что здесь писать? в тим фортрессе вроде как можно написать items и вернется список инвентаря тим фортресса
    Полазил по гуглу..весь день искал, но мануалов на CSGO не нашел, есть ли список возравщаемых данных для КСГО, или моя ошибка в чем-то другом?

  10. Роман
    27 января 2015 в 17:53 | #10

    @Роман
    походу защита порезала пхп скрипт

  11. 30 января 2015 в 18:21 | #11

    Роман :

    Получил токен для своего домена, залил туда страницу с таким

    но не работает, даже в коде страницы кода вообще нет, есть две пустые строки.

    Следует использовать функцию simplexml_load_file(). В документации к ней имеется куча примеров. Результат следует обходить в цикле foreach().

  12. 30 января 2015 в 18:22 | #12

    Роман :

    @Роман
    походу защита порезала пхп скрипт

    Не удивительно, поэтому фрагменты кода в комментариях нужно оформлять в виде BB-кода:

    [sourcecode language="php"][/sourcecode]
  13. Holmson
    16 февраля 2015 в 13:09 | #13

    //v где брать? и что это

  14. 17 февраля 2015 в 15:54 | #14

    Holmson :

    //v где брать? и что это

    Что именно? Токен Steam Web API можно получить здесь.

  15. Drval
    26 февраля 2015 в 04:43 | #15

    Здравствуйте.
    В каких играх есть инвентарь? Если можно, полный список их IEconItems_.
    Спасибо.

  16. DRval
    26 февраля 2015 в 04:51 | #16

    @V1TSK
    а список игр, в которых есть инвентарь?

  17. 4 марта 2015 в 14:45 | #17

    Drval :

    В каких играх есть инвентарь?

    Можно увидеть в Steam Market, в сайдбаре.

    Drval :

    Если можно, полный список их IEconItems_.

    308080, 238460, 730, 570, 214190, 238960, 321360, 251970, 753, 440, 239220, 230410.

  18. Сашка
    12 марта 2015 в 22:59 | #18

    как получить список групп в которых состоит пользователь(id и имя достаточно)? GetUserGroupList выдает список из 6-7-значных id групп, а из названия ResolveVanityURL выдает в виде 1035827914XXXXXXXX(цифры совсем другие). в общем нужен список групп, желательно в джсон — может у моего апи-ключа недостаточно прав?
    также нужен список имеющихся DLC GetFriendList выдает только игры

  19. 13 марта 2015 в 03:13 | #19

    Сашка :

    как получить список групп в которых состоит пользователь(id и имя достаточно)?

    Если профиль публичный, то список групп получить можно.

    Сашка :

    GetUserGroupList выдает список из 6-7-значных id групп

    Это и есть ID группы.

    Сашка :

    в общем нужен список групп, желательно в джсон

    Нет проблем:

    https://api.steampowered.com/ISteamUser/GetUserGroupList/v1/?key=TOKEN&steamid=STEAMID64&format=json

    Здесь TOKEN — токен Steam Web API, а STEAMID64 — SteamID64 нужного профиля. Результат будет в формате JSON.

    Сашка :

    также нужен список имеющихся DLC GetFriendList выдает только игры

    Если их нет в выводе GetOwnedGames, значит не представляется возможным.

  20. WitER
    14 марта 2015 в 20:03 | #20

    Доброго времени суток!
    Подскажите, есть ли возможность(и если есть, то какой метод) вызова запроса на обмен предметом инвентаря с пользователем?

  21. 16 марта 2015 в 17:12 | #21

    WitER :

    Подскажите, есть ли возможность(и если есть, то какой метод) вызова запроса на обмен предметом инвентаря с пользователем?

    Для управления торговыми предложениями у Steam Web API существует специальный интерфейс IEconService. Он предоставляет возможность получения информации об отправленных на аккаунт торговых предложениях, а также возможность их одобрения или отклонения.

    Функции отправки торговых предложений через Web API не предусмотрено, поэтому потребуется авторизоваться в Steam (с учётом возможности появления reCaptcha), парсить страницу и т.д., а в конце ещё и подтверждать отправку посредством перехода по ссылке, отправленной на Email, или reCaptcha, если проверка была отключена в настройках аккаунта.

  22. Сашка
    17 марта 2015 в 23:48 | #22

    спасибо за ответ!
    итак с GetUserGroupList я получил список id групп, но откуда получить соответствующие названия этим группам и ссылки на их аватарки?

  23. 18 марта 2015 в 15:25 | #23

    Сашка :

    итак с GetUserGroupList я получил список id групп, но откуда получить соответствующие названия этим группам и ссылки на их аватарки?

    Воспользуйтесь библиотекой Steam Condenser (имеются версии для PHP, Ruby и Java). В её функционале есть получение полной информации о группе по ID.

  24. Генадий
    25 апреля 2015 в 07:27 | #24

    Добрый день! Как можно получить статистику по dota 2, если игрок в настройках сделал сделал свой профиль публичным? Можно ли это через API запросы? Спасибо !

  25. 26 апреля 2015 в 16:03 | #25

    Генадий :

    Как можно получить статистику по dota 2, если игрок в настройках сделал сделал свой профиль публичным? Можно ли это через API запросы?

    Да. Пример здесь.

  26. Максим
    30 мая 2015 в 17:54 | #26

    Здравствуйте, есть один вопрос. Как зная classid и assetid, получить информацию о предмете? CS: GO

  27. MacOSO
    10 июня 2015 в 13:11 | #27

    У меня сейчас такой код:

    response->players[0];
    $profile = $data['profileurl'];
    <?php echo "Мой ник в Steam <a href='$profile' rel="nofollow">".$data['personaname']."</a>";?>

    Что выводится:
    Мой ник в Steam NICE VADER и я сейчас играю в Botanicula
    Я хочу сделать так чтобы когда я не играл было не пустое место. А писало сейчас не играет.

  28. MacOSO
    10 июня 2015 в 13:13 | #28

    @V1TSK
    помоги в лс, сайт не дает код показать

  29. 11 июня 2015 в 12:01 | #29

    MacOSO :

    Я хочу сделать так чтобы когда я не играл было не пустое место. А писало сейчас не играет.

    Это же элементарно:

    $var = isset($data['gameextrainfo']) ? $data['gameextrainfo'] : "не играет";
  30. 11 июня 2015 в 12:02 | #30

    MacOSO :

    @V1TSK
    помоги в лс, сайт не дает код показать

    Код нужно оформлять в тег code (в квадратных скобках), тогда движок резать его не будет, плюс выполнит подсветку.

  31. Максим
    28 ноября 2016 в 19:17 | #31

    Подскажите есть ли метод который возвращает информацию о email адресе пользователя steam

  32. 28 ноября 2016 в 19:35 | #32

    Максим :

    Подскажите есть ли метод который возвращает информацию о email адресе пользователя steam

    Такого нет и никогда не появится из соображений безопасности и конфиденциальности.

Представьтесь, пожалуйста! Если ваш комментарий предполагает ответ, мы ответим на него в ближайшее время. Адрес электронной почты должен быть действительным.


Внимание! Запрещено публиковать любые ссылки в тексте комментария, иначе он сразу же будет помечен как нежелательный и не будет опубликован на сайте.