Question

I'm trying to get access to the amount of TF2 time played using the Steam API. I'm currently using:-

http://api.steampowered.com/ISteamUserStats/GetUserStatsForGame/v0002/?appid=440&key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&steamid=xxxxxxxxxxxxxxxxx&format=xml

And then filter through the XML and extracting the time played relating to each of the classes (e.g. pyro (Pyro.accum.iPlayTime), etc). This worked ok but I think missing the MVM classes made my final value incorrect (my code, in Python, returned 977 when online sites say over 1600 hours). Adding the MVM classes (plus possibly others) may provide th ecorrect result but it's making the code very long winded.

So I was wondering if there is a call in the Steam Web API that will just give me the total time played without having to go though all the extracting and adding?

I have looked through the Steam Web API Developer page, but can't find any reference to what I'm after.

Added Code:

if __name__ == '__main__':
    import urllib2
    import xml.etree.ElementTree as ET
    import datetime

    timeKISA = 0
    playerStatsKISA = urllib2.urlopen('http://api.steampowered.com/ISteamUserStats/GetUserStatsForGame/v0002/?appid=440&key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&steamid=xxxxxxxxxxxxxxxxx&format=xml')
    statsKISA = playerStatsKISA.read()
    theStatsKISA = ET.fromstring(statsKISA)
    for stat in theStatsKISA.findall("./stats/stat"):
        if stat.find('name').text.startswith('Scout.accum.iPlayTime') or \
             stat.find('name').text.startswith('Soldier.accum.iPlayTime') or \
             stat.find('name').text.startswith('Engineer.accum.iPlayTime') or \
             stat.find('name').text.startswith('Medic.accum.iPlayTime') or \
             stat.find('name').text.startswith('Spy.accum.iPlayTime') or \
             stat.find('name').text.startswith('Sniper.accum.iPlayTime') or \
             stat.find('name').text.startswith('Demoman.accum.iPlayTime') or \
             stat.find('name').text.startswith('Heavy.accum.iPlayTime') or \
             stat.find('name').text.startswith('Pyro.accum.iPlayTime'):

             timeKISA = timeKISA + int(stat.find('value').text) 
        finalTimeKISA = timeKISA / 60 / 60
        KISATime = ('KISA_Time=' + str(finalTimeKISA) + ' hours')
        print KISATime

Thank you.

Markus

Was it helpful?

Solution

Pulling my comments into an answer,

It is my understanding that the *.accum.iPlayTime fields are cumulative for your place time as that class regardless of game mode or map. Based on my own stats (and a glance at a few others on my friend list), this matches exactly what Steam Community reports that play time is. Additionally, it is reporting that your playtime matches these fields on your TF2 Achievements page.

A couple notes:

  • The summary page on a player's profile does not seem to match the actual stats that the achievements page shows. I'm unsure if this is a Steam Community issue or a summary of additional fields. However, the achievements page, which has detailed break downs of play time by class, longest life, etc. is using the same data as the GetUserStatsForGame API call.
  • You have a very minor formating issue in your code. The very last print KISATime is indented one to many times and therefore prints the KISA_Time = line multiple times. If you pull it out of the for loop, you will only get the print line once.
  • If you change your finalTimeKISA = timeKISA / 60 / 60 to be decimal 60.0 you will get the decimal answers. Otherwise, as is, you will only receive an integer answer.
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top