Значительные изменения в 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).

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

47 комментариев к записи

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

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

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

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

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

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

  4. Что такое токен? Пробую вывести свой инвентарь игры 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.

  5. Роман :

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

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

    Роман :

    Access is denied.

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

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

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

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

  7. Роман :

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

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

    Роман :

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

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

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

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

  9. Роман :

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

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

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

  10. Роман :

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

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

    [sourcecode language="php"][/sourcecode]
  11. Здравствуйте.
    В каких играх есть инвентарь? Если можно, полный список их IEconItems_.
    Спасибо.

  12. Drval :

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

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

    Drval :

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

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

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

  14. Сашка :

    как получить список групп в которых состоит пользователь(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, значит не представляется возможным.

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

  16. WitER :

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

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

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

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

  18. Сашка :

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

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

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

  20. Генадий :

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

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

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

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

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

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

  23. MacOSO :

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

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

    $var = isset($data['gameextrainfo']) ? $data['gameextrainfo'] : "не играет";
  24. MacOSO :

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

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

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

  26. Максим :

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

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

  27. Подскажите пожалуйста.
    Как получить перечень всего инвентаря для Dota2 (ID 570).
    Параметрами — такими как при просмотре отдельного итема.
    Интересуют данные в таком формате
    /название/цена/параметры с графика изменения цены/.

    для отдельного итема удалось получить но не все а только:

    {"success":true,"lowest_price":"\u00a30.26","volume":"2","median_price":"\u00a30.20"}
    1. Для получения содержимого инвентаря игры используйте метод GetPlayerItems:

      https://api.steampowered.com/IEconItems_570/GetPlayerItems/v0001/?steamid=PROFILE_ID&key=API_TOKEN

      Здесь PROFILE_ID — SteamID профиля в формате SteamID64, инвентарь которого нужно получить, а API_TOKEN — ваш токен Steam API.

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

      http://steamcommunity.com/market/priceoverview/?currency=5&appid=570&market_hash_name=Hydrakan%20Latch

      Здесь currency — ID валюты, в которой нужно вывести результат (1 — доллар США, 5 — российский рубль), appid — ID игры, а market_hash_name — полное название предмета (спецсимволы нужно прогонять через urlencode).

  28. Спасибо за ответ.
    Но меня интересует больше информации с торговой площадки, например:
    * количество Х запросов на покупку, начиная с $Y и ниже
    * Предложение продавцов, первых 3.

    1. Такого нет в API и выводится оно непосредственно в теле страницы лота торговой площадки, поэтому вам придётся парсить её самостоятельно регулярным выражением или готовым HTML-парсером.

  29. Спасибо за ответ.
    Данные удалось получить json запросом.
    Осталась малость, где можно получить item_nameid для всего инвентаря? Или как получить item_nameid для конкретного предмета?

    1. Как я понял, речь про этот недокументированный API:

      https://steamcommunity.com/market/itemordershistogram?country=RU&language=english&currency=5&item_nameid=165027636&two_factor=0

      Параметры здесь:

      • country — двухбуквенный код ISO 3166-1 страны;
      • language — язык для ответа API;
      • currency — валюта для ответа API;
      • item_nameid — уникальный идентификатор предмета на торговой площадке.

      Определить item_nameid можно распарсив страницу лота в вызове JS функции Market_LoadOrderSpread(). В качестве параметра ей передаётся данный ID.

      1. Да все правильно. Но у каждого лота этот ИД уже есть на странице лота, статически уникален. А как его получить для перечня предметов? По сути нужны входящие ИД для запроса наведённого выше.

        1. Да, этот ID уникален для каждого лота торговой площадки и не изменяется со временем, поэтому вы можете создать отдельную таблицу в БД с сопоставлением именам лотов ID торговой площадки. Благо делать это для каждого лота нужно лишь один раз, а затем просто брать из базы.

          1. Спасибо за ответы. Но) то что нужно писать в БД это понятно, так и делаю, но как например по имени получить ИД? вручную не вариант, записей 5600. Парсить тоже не получается.

          2. Данные ID можно получить, скорее всего, лишь единственным способом — распарсив страницы лотов торговой площадки и составив свою базу соответствия. Далее можно уже пользоваться ей.

  30. Добрый день!
    Интересует вопрос про который выше уже упоминал LANCER.SPS.

    На странице любого предмета на торговой площадке стима есть график продаж с информацией о цене, дате и количестве.
    Возможно ли данную информацию получить с помощью API?

    Можно достаь данную информацию со страницы HTML, но к сожалению цены при парсинге мне приходят в $, а нужны в рублях.

    1. Используйте опциональный параметр currency как сказано здесь. При парсинге страницы сайт использует язык и валюты исходя из IP-адреса, с которого приходит запрос.

      1. Тут разместил скрин (пробелы только убрать нужно).

        Мне нужны значения цен уже проданных предметов, а предыдущий запрос выдаёт второй график (зачёркнутый красным).

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *