2026-10-13 17:53:22 +08:00
|
|
|
from typing import TypedDict, List, Optional, Dict
|
2026-09-01 13:13:40 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class Player(TypedDict):
|
|
|
|
|
steamid: str
|
|
|
|
|
communityvisibilitystate: int
|
|
|
|
|
profilestate: int
|
|
|
|
|
personaname: str
|
|
|
|
|
profileurl: str
|
|
|
|
|
avatar: str
|
|
|
|
|
avatarmedium: str
|
|
|
|
|
avatarfull: str
|
|
|
|
|
avatarhash: str
|
|
|
|
|
lastlogoff: int
|
|
|
|
|
personastate: int
|
|
|
|
|
realname: str
|
|
|
|
|
primaryclanid: str
|
|
|
|
|
timecreated: int
|
|
|
|
|
personastateflags: int
|
|
|
|
|
gameextrainfo: str
|
|
|
|
|
gameid: str
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class PlayerSummariesResponse(TypedDict):
|
|
|
|
|
players: List[Player]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class PlayerSummaries(TypedDict):
|
|
|
|
|
response: PlayerSummariesResponse
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ProcessedPlayer(Player):
|
|
|
|
|
game_start_time: int # Unix timestamp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class PlayerSummariesProcessedResponse(TypedDict):
|
|
|
|
|
players: List[ProcessedPlayer]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Achievements(TypedDict):
|
|
|
|
|
name: str
|
|
|
|
|
image: bytes
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class GameData(TypedDict):
|
|
|
|
|
game_name: str
|
|
|
|
|
play_time: str # e.g. 10.2
|
|
|
|
|
last_played: str # e.g. 10 月 2 日
|
|
|
|
|
game_image: bytes
|
|
|
|
|
achievements: List[Achievements]
|
|
|
|
|
completed_achievement_number: int
|
|
|
|
|
total_achievement_number: int
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class PlayerData(TypedDict):
|
|
|
|
|
steamid: str
|
|
|
|
|
player_name: str
|
|
|
|
|
background: bytes
|
|
|
|
|
avatar: bytes
|
2026-10-13 17:53:22 +08:00
|
|
|
avatar_frame: Optional[bytes] # 头像框(社区物品)PNG,无则 None
|
2026-09-01 13:13:40 +08:00
|
|
|
description: str
|
|
|
|
|
recent_2_week_play_time: str
|
|
|
|
|
game_data: List[GameData]
|
2026-10-13 17:53:22 +08:00
|
|
|
# 以下字段来自主页 HTML 解析 + 社区 ?xml=1(不占 API 配额),缺失时为默认值
|
|
|
|
|
level: Optional[int]
|
|
|
|
|
counts: Dict[str, int]
|
|
|
|
|
member_since: Optional[str]
|
|
|
|
|
online_state: Optional[str]
|
|
|
|
|
state_message: Optional[str]
|
|
|
|
|
current_game: Optional[str] # 资料页「当前正在游戏」的游戏名(已本地化)
|
|
|
|
|
privacy_state: Optional[str]
|
|
|
|
|
vac_banned: bool
|
|
|
|
|
trade_ban_state: Optional[str]
|
|
|
|
|
limited_account: bool
|
|
|
|
|
hours_2wk: Optional[float]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ProfileCardExtra(TypedDict, total=False):
|
|
|
|
|
"""信息卡头部增强字段(缺失的键不绘制对应元素)
|
|
|
|
|
|
|
|
|
|
status_kind / ban_kind 决定配色,取值见 draw.py 的 status_row_colors /
|
|
|
|
|
ban_tag_colors;status_kind 为 private 时表示资料私密降级提示。
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
level: Optional[int]
|
|
|
|
|
counts: Dict[str, int]
|
|
|
|
|
member_since: Optional[str]
|
|
|
|
|
status_text: Optional[str]
|
|
|
|
|
status_kind: Optional[str]
|
|
|
|
|
ban_text: Optional[str]
|
|
|
|
|
ban_kind: Optional[str]
|
2026-09-01 13:13:40 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class DrawPlayerStatusData(TypedDict):
|
|
|
|
|
game_name: str
|
|
|
|
|
game_time: str # e.g. 10.2 小时(过去 2 周)
|
|
|
|
|
last_play_time: str # e.g. 10 月 2 日
|
|
|
|
|
game_header: bytes
|
|
|
|
|
achievements: List[Achievements]
|
|
|
|
|
completed_achievement_number: int
|
|
|
|
|
total_achievement_number: int
|
2026-10-13 17:53:22 +08:00
|
|
|
two_week_time: Optional[str] # e.g. 近两周 3.2 小时,缺失为 None
|
2026-09-01 13:13:40 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
__all__ = [
|
|
|
|
|
"Player",
|
|
|
|
|
"PlayerSummaries",
|
|
|
|
|
"PlayerSummariesResponse",
|
|
|
|
|
"ProcessedPlayer",
|
|
|
|
|
"PlayerSummariesProcessedResponse",
|
2026-10-13 17:53:22 +08:00
|
|
|
"ProfileCardExtra",
|
2026-09-01 13:13:40 +08:00
|
|
|
"DrawPlayerStatusData",
|
|
|
|
|
]
|