1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
from __future__ import annotations
import os
import requests
from internal.cache import cache
STEAM_API_KEY = os.getenv("STEAM_API_KEY", "")
SCREENSHOT_TTL = 6 * 60 * 60
VANITY_TTL = 30 * 24 * 60 * 60
def _resolve_vanity(username: str) -> str | None:
if not username:
return None
if username.isdigit():
return username
cache_key = f"steam_vanity:{username}"
cached = cache.get(cache_key)
if cached:
return cached
if not STEAM_API_KEY:
return None
url = "https://api.steampowered.com/ISteamUser/ResolveVanityURL/v1/"
try:
r = requests.get(url, params={"key": STEAM_API_KEY, "vanityurl": username}, timeout=10)
payload = r.json().get("response", {})
except (requests.RequestException, ValueError):
return None
if payload.get("success") != 1:
return None
sid = str(payload.get("steamid", ""))
if sid:
cache.set(cache_key, sid, ex=VANITY_TTL)
return sid or None
def get_steam_screenshots(username: str) -> list[dict]:
"""Return every screenshot as a flat list in Steam's native order (newest
first across all games — no per-game grouping)."""
if not username:
return []
cache_key = f"steam_screenshots_flat:{username}"
cached = cache.get(cache_key)
if cached is not None:
return cached
steam_id = _resolve_vanity(username)
if not steam_id or not STEAM_API_KEY:
return []
shots: list[dict] = []
page = 1
per_page = 100
while page <= 4:
params = {
"key": STEAM_API_KEY,
"steamid": steam_id,
"page": page,
"numperpage": per_page,
"filetype": 4,
"return_metadata": 1,
}
try:
r = requests.get(
"https://api.steampowered.com/IPublishedFileService/GetUserFiles/v1/",
params=params,
timeout=15,
)
data = r.json().get("response", {})
except (requests.RequestException, ValueError):
break
files = data.get("publishedfiledetails", []) or []
if not files:
break
for f in files:
full = f.get("file_url") or f.get("preview_url") or ""
if not full:
continue
shots.append({
"id": str(f.get("publishedfileid", "")),
"url": full,
})
if len(files) < per_page:
break
page += 1
cache.set(cache_key, shots, ex=SCREENSHOT_TTL)
return shots
|