Skip to main content
 首页 » 编程设计

python之解析和混合 Steam API 调用

2025年05月04日16hnrainll

我正在使用 Django 环境,我想从 Steam 中提取统计数据。然而,Steam 的 API 非常愚蠢,因为它们有大约 20 个不同的 URL,我想从中获取信息的主要两个是:

我正在使用 Python Requests 库来 GET来自 Steam 的数据。

import requests 
import json 
from xml.dom.minidom import parseString 
 
STEAM_API_URL = 'http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002' 
STEAM_API_KEY = 'XXXXX' 
STEAM_USERNAME = 'niteshade' 
 
# Make request to steamcommunity.com with the username to get the 64-bit Steam ID 
username_r = requests.get('http://steamcommunity.com/id/{0}/games?tab=all&xml=1'.format(STEAM_USERNAME)) 
steamid = str(parseString(username_r.text.encode('utf-8')).getElementsByTagName('steamID64')[0].firstChild.wholeText) 
totalgames = parseString(username_r.text.encode('utf-8')).getElementsByTagName('game').length 
 
data = { 
    'key': STEAM_API_KEY, 
    'steamids': steamid, 
} 
 
user_r = requests.get(STEAM_API_URL, params=data) 
#user_r.json['response']['players'][0].update({'totalgames'.encode('utf-8'): totalgames}) 

当我查询 steamcommunity.com 时我得到这样的回复:

<gamesList> 
    <steamID64>12345</steamID64> 
    <steamID>aSteamID</steamID> 
    <games> 
        <game> 
            <appID>201790</appID> 
            <name>Orcs Must Die! 2</name> 
            <logo>http://media.steampowered.com/steamcommunity/public/images/apps/201790/c345d9b205f349f0e7f4e6cdf8af4d0b7d242505.jpg</logo> 
            <storeLink>http://steamcommunity.com/app/201790</storeLink> 
            <hoursLast2Weeks>2.2</hoursLast2Weeks><hoursOnRecord>14.3</hoursOnRecord> 
            <statsLink>http://steamcommunity.com/id/niteshade/stats/201790</statsLink> 
            <globalStatsLink>http://steamcommunity.com/stats/201790/achievements/</globalStatsLink> 
        </game> 
        <game> 
            <appID>113200</appID> 
            <name>The Binding of Isaac</name> 
            <logo>http://media.steampowered.com/steamcommunity/public/images/apps/113200/d9a7ee7e07dffed1700cb8b3b9482105b88cc5b5.jpg</logo> 
            <storeLink>http://steamcommunity.com/app/113200</storeLink> 
            <hoursLast2Weeks>0.2</hoursLast2Weeks> 
            <hoursOnRecord>22.8</hoursOnRecord> 
            <statsLink>http://steamcommunity.com/id/niteshade/stats/BindingOfIsaac</statsLink> 
            <globalStatsLink>http://steamcommunity.com/stats/BindingOfIsaac/achievements/</globalStatsLink> 
        </game> 
        <game> 
            <appID>19680</appID> 
            <name>Alice: Madness Returns</name> 
            <logo>http://media.steampowered.com/steamcommunity/public/images/apps/19680/16eb0cc15cde07377c0cb3bffa6d92bbc6dd72b2.jpg</logo> 
            <storeLink>http://steamcommunity.com/app/19680</storeLink> 
        </game> 
    </games> 

来自api.steampowered.com我明白了:

{ 
    "response": { 
        "players": [ 
            { 
                "steamid": "12345", 
                "communityvisibilitystate": 3, 
                "profilestate": 1, 
                "personaname": "aSteamID", 
                "lastlogoff": 1351676021, 
                "profileurl": "http:\/\/steamcommunity.com\/id\/aSteamID\/", 
                "avatar": "http:\/\/media.steampowered.com\/steamcommunity\/public\/images\/avatars\/b2\/b261f66a17bfa6c95b24f8b4c6b58bb3776d57e4.jpg", 
                "avatarmedium": "http:\/\/media.steampowered.com\/steamcommunity\/public\/images\/avatars\/b2\/b261f66a17bfa6c95b24f8b4c6b58bb3776d57e4_medium.jpg", 
                "avatarfull": "http:\/\/media.steampowered.com\/steamcommunity\/public\/images\/avatars\/b2\/b261f66a17bfa6c95b24f8b4c6b58bb3776d57e4_full.jpg", 
                "personastate": 4, 
                "realname": "Real Name", 
                "primaryclanid": "103582791429705688", 
                "timecreated": 1250966723, 
                "loccountrycode": "GB" 
            } 
        ]        
    } 
} 

基本上,能够从 api.steampowered.com 得到任何东西,我需要一个 Steam ID。为此,我调用 steamcommunity.com返回带有 Steam ID 等信息的 XML 文件的网站。我需要的信息如下(使用 XML/JSON 响应中的名称):

播放器

  • Steam
  • 人名
  • 个人资料网址
  • friend (我相信需要另一个 API 调用)
  • 人物角色
  • 游戏总数
  • 化身

游戏

  • 应用ID
  • 姓名
  • 标志
  • 小时过去 2 周

对于游戏总数,我想我只是简单地计算 <game> 的数量。 steamcommunity.com 返回的 XML 文件中的节点.它起作用了,因为我能够数出它们,但我似乎无法添加 totalgames来自 api.steampowered.com 的 JSON 响应字段. 其次,不是所有<game>节点有 <hoursLast2Weeks>子节点,我只想要那些做的。 第三,我只想得到玩家的 friend 总数。我不是在开玩笑,我知道我必须使用另一个 GET ,但问题是将它添加到 JSON。

我的主要问题是尝试添加到 JSON 响应中,我已经查看了关于 SO 的其他示例,并尝试按照它们进行操作,但我不确定我哪里出错了。任何帮助将不胜感激。

请您参考如下方法:

更改 json 数据非常简单:

jsondata = json.loads(json_input_string) 
jsondata['newkey'] = new_value 
json_output_string = json.dumps(jsondata)