Obecnie nie jest możliwe zbieranie danych o osiągnięciach użytkowników za pomocą „nowego” interfejsu API. Jest to jednak możliwe w przypadku „starego” interfejsu API XML.
Po prostu dodaje się parametr uri o nazwie xml
z wartością 1
na normalny identyfikator URI społeczności. (Tak więc dla strony społeczności http://steamcommunity.com/profiles/XYZ
staje się to http://steamcommunity.com/profiles/XYZ?xml=1
)
To jest przykładowa implementacja C # (tylko do celów demonstracyjnych!) , która uwidacznia User.Load
, która przyjmuje identyfikator społeczności jako parametr. (W powyższym przykładzie tym identyfikatorem byłby XYZ
).
// System.dll // System.Xml.dll // System.Xml.Linq.dllusing System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Xml.Linq; użycie System.Xml.XPath; public class Achievement {public string Name {get; zestaw; } publiczny napis Opis {get; zestaw; } public Uri Icon {get; zestaw; }} klasa publiczna Gra {publiczny identyfikator int {get; zestaw; } public string Name {get; zestaw; } publiczne logo Uri {get; zestaw; }} public class OwnedGame: Game {public User User {get; zestaw; } public Stats Stats {get; zestaw; }} public class Stats {public OwnedGame Game {get; zestaw; } public IEnumerable<Achievement> Achievements {get; set;}} public class User {private const string SteamCommunityProfileUriFormat = "http://steamcommunity.com/profiles/{0}?xml=1"; private const string SteamCommunityProfileGamesUriFormat = "http://steamcommunity.com/profiles/{0}/games?xml=1"; public long Id {get; zestaw; } public string Name {get; zestaw; } publiczny awatar Uri {get; zestaw; } public IEnumerable<OwnedGame> Games {get; zestaw; } public static User Load (long id) {XDocument profileDocument = XDocument.Load (string.Format (SteamCommunityProfileUriFormat, id));
XElement profileElement = profileDocument.Element ("profile"); Użytkownik = nowy Użytkownik () {Id = long.Parse (profileElement.Element ("steamID64"). Wartość), Nazwa = profileElement.Element ("steamID"). Wartość, Avatar = nowy Uri (profileElement.Element ("avatarIcon ") .Value, UriKind.Absolute),}; XDocument gamesDocument = XDocument.Load (string.Format (SteamCommunityProfileGamesUriFormat, id)); List<OwnedGame> games = new List<OwnedGame> (); foreach (XElement gameElement w gamesDocument.XPathSelectElements ("gamesList / games / game")) {OwnedGame game = new OwnedGame () {Id = int.Parse (gameElement.Element ("appID"). Value), Name = gameElement.Element ("nazwa"). Wartość, Logo = nowy Uri (gameElement.Element ("logo"). Wartość, UriKind.Absolute), Użytkownik = użytkownik}; XElement statsLinkElement = gameElement.Element ("statsLink"); if (statsLinkElement! = null) {try {XDocument statsDocument = XDocument.Load (statsLinkElement.Value + "? xml = 1"); game.Stats = new Stats () {Game = game, Achievements = statsDocument .XPathSelectElements ("statystyki graczy / osiągnięcia / osiągnięcia") .Where (reachElement = > pleasure.Attribute ("zamknięte"). Wartość == "1"). Wybierz (bringElement = > new Achievement () {Name = pleasureElement.Element ("name"). Value,
Description = reachElement.Element ("description"). Value, Icon = new Uri (bringElement.Element ("iconClosed"). Value, UriKind.Absolute)})}; } catch (WebException) {kontynuuj; }} games.Add (gra); } user.Games = games.AsReadOnly (); powrót użytkownika; }}
Przykładowe użycie:
long id = ... User user = User.Load (id); int totalAchievementCount = user.Games.Where (game = > game.Stats! = null) .SelectMany (game = > game.Stats.Achievements) .Count ();
Mam nadzieję, że nie będzie ich zbyt wiele literówki tam :-)
Uwaga:
- Zgodnie z Warunkami internetowego interfejsu API Steam użytkowania „masz ograniczenie do stu tysięcy (100 000) wywołań interfejsu Steam Web API dziennie”.
- Wszystkie HTTP odpowiedzi z steamcommunity.com mają nagłówek
Cache-Control: no-cache
. - API XML to „stary” i miał zostać całkowicie zastąpiony. To oznacza: Dane XML mogą być nieprawidłowe i nie są dostępne dla wszystkich zasobów. (Tak jest obecnie w przypadku Team Fortress 2 Stats)
- Nie nie potrzebuję klucza API , jak to ma miejsce w przypadku „nowego” interfejsu API.