如何使用Python通过用户名查询Steam ID
问题排查
- 当前使用的
valve.source.a2s模块基于A2S协议实现,该协议的玩家查询接口设计上仅返回玩家昵称、分数、在线时长三类数据,本身不包含Steam ID字段,因此无法从现有返回结果中提取目标ID。 valve.steam.id模块仅用于Steam ID不同格式的互相转换,不具备通过用户名查询ID的能力,因此无法直接用该模块实现需求。
解决方案
方案一:通过服务器RCON查询(推荐,准确率100%)
如果你持有目标服务器的RCON密码,可通过RCON执行status命令,解析返回结果直接获取每个玩家的Steam ID,参考修改代码如下:
import valve.source.a2s import valve.source.rcon import time import re Server_IP = input("Server IP : ") ServerPort = int(input("Server PORT :")) RCON_PWD = input("RCON Password : ") SERVER_ADDRESS = (Server_IP, ServerPort) # 预编译正则匹配status返回的玩家行信息,提取SteamID和昵称 player_regex = re.compile(r'^#\s+\d+\s+"(.+?)"\s+(STEAM_[0-5]:[01]:\d+)\s+', re.MULTILINE) while True: player_count = 1 # 先拿A2S的玩家列表 with valve.source.a2s.ServerQuerier(SERVER_ADDRESS) as server: info = server.info() a2s_players = server.players()["players"] # 拿RCON的status结果获取SteamID with valve.source.rcon.RCON(SERVER_ADDRESS, RCON_PWD) as rcon: status_res = rcon.exec("status") # 解析出所有玩家的昵称和SteamID对应关系 id_map = {} for match in player_regex.finditer(status_res): user_name = match.group(1) steam_id = match.group(2) id_map[user_name] = steam_id print(f"{info['player_count']}/{info['max_players']} {info['server_name']}") for player in sorted(a2s_players, key=lambda p: p["score"], reverse=True): user_name = player["name"] duration = round(player["duration"], 2) if not user_name: print(f"{player_count:>2} | duration(sec) = {duration:<20} EpicGames") else: steam_id = id_map.get(user_name, "未查询到ID") print(f"{player_count:>2} | duration(sec) = {duration:<20} Steam 用户:{user_name} SteamID:{steam_id}") player_count += 1 time.sleep(1)
方案二:通过Steam Web API按昵称查询(无RCON时使用,存在误差)
需要自行申请Steam Web API密钥,调用对应接口通过昵称查询Steam ID,该方案局限性较高:仅当用户自定义URL和昵称完全一致时才能查询到结果,且存在重名匹配错误的可能,仅做备选。
内容的提问来源于stack exchange,提问作者jjun4341
相关产品推荐
相关产品推荐

