Using Steam WebAPI to get total time playing a game

杀马特。学长 韩版系。学妹 提交于 2019-12-12 20:27:09

问题


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


回答1:


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.


来源:https://stackoverflow.com/questions/19653535/using-steam-webapi-to-get-total-time-playing-a-game

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!