mirror of
https://github.com/daimyomizukagebay61/SteamPanel.git
synced 2026-07-25 03:34:30 +00:00
118 lines
5.0 KiB
Python
118 lines
5.0 KiB
Python
"""Parses wallet balance and country from store.steampowered.com/account/."""
|
|
|
|
import re
|
|
|
|
from bs4 import BeautifulSoup
|
|
from loguru import logger
|
|
|
|
# fmt: off
|
|
_COUNTRY_NAME_TO_ISO2: dict[str, str] = {
|
|
"afghanistan": "AF", "albania": "AL", "algeria": "DZ", "andorra": "AD",
|
|
"angola": "AO", "argentina": "AR", "armenia": "AM", "australia": "AU",
|
|
"austria": "AT", "azerbaijan": "AZ", "bahrain": "BH", "bangladesh": "BD",
|
|
"belarus": "BY", "belgium": "BE", "bolivia": "BO", "bosnia and herzegovina": "BA",
|
|
"brazil": "BR", "bulgaria": "BG", "cambodia": "KH", "canada": "CA",
|
|
"chile": "CL", "china": "CN", "colombia": "CO", "costa rica": "CR",
|
|
"croatia": "HR", "cyprus": "CY", "czech republic": "CZ", "czechia": "CZ",
|
|
"denmark": "DK", "ecuador": "EC", "egypt": "EG", "estonia": "EE",
|
|
"ethiopia": "ET", "finland": "FI", "france": "FR", "georgia": "GE",
|
|
"germany": "DE", "ghana": "GH", "greece": "GR", "guatemala": "GT",
|
|
"honduras": "HN", "hong kong": "HK", "hungary": "HU", "iceland": "IS",
|
|
"india": "IN", "indonesia": "ID", "iran": "IR", "iraq": "IQ",
|
|
"ireland": "IE", "israel": "IL", "italy": "IT", "jamaica": "JM",
|
|
"japan": "JP", "jordan": "JO", "kazakhstan": "KZ", "kenya": "KE",
|
|
"kuwait": "KW", "kyrgyzstan": "KG", "latvia": "LV", "lebanon": "LB",
|
|
"liechtenstein": "LI", "lithuania": "LT", "luxembourg": "LU",
|
|
"malaysia": "MY", "malta": "MT", "mexico": "MX", "moldova": "MD",
|
|
"mongolia": "MN", "morocco": "MA", "netherlands": "NL", "new zealand": "NZ",
|
|
"nicaragua": "NI", "nigeria": "NG", "north macedonia": "MK", "norway": "NO",
|
|
"oman": "OM", "pakistan": "PK", "panama": "PA", "paraguay": "PY",
|
|
"peru": "PE", "philippines": "PH", "poland": "PL", "portugal": "PT",
|
|
"qatar": "QA", "romania": "RO", "russia": "RU", "russian federation": "RU",
|
|
"saudi arabia": "SA", "serbia": "RS", "singapore": "SG", "slovakia": "SK",
|
|
"slovenia": "SI", "south africa": "ZA", "south korea": "KR",
|
|
"republic of korea": "KR", "spain": "ES", "sri lanka": "LK", "sweden": "SE",
|
|
"switzerland": "CH", "taiwan": "TW", "tajikistan": "TJ", "thailand": "TH",
|
|
"tunisia": "TN", "turkey": "TR", "turkmenistan": "TM", "ukraine": "UA",
|
|
"united arab emirates": "AE", "united kingdom": "GB",
|
|
"united states": "US", "uruguay": "UY", "uzbekistan": "UZ",
|
|
"venezuela": "VE", "vietnam": "VN",
|
|
}
|
|
# fmt: on
|
|
|
|
|
|
def _name_to_iso2(name: str) -> str:
|
|
"""Convert a country name to ISO 3166-1 alpha-2 code, or return the name unchanged."""
|
|
return _COUNTRY_NAME_TO_ISO2.get(name.strip().lower(), name)
|
|
|
|
|
|
def _parse_balance_and_country_html(html: str) -> tuple[str, str]:
|
|
"""Parse balance and country from store.steampowered.com/account/ HTML."""
|
|
soup = BeautifulSoup(html, "html.parser")
|
|
|
|
balance = ""
|
|
balance_row = soup.find("div", class_="accountBalance")
|
|
if balance_row:
|
|
price_div = balance_row.find("div", class_="price")
|
|
if price_div:
|
|
balance = price_div.get_text(strip=True)
|
|
|
|
country = ""
|
|
# Look inside country_settings div first (most reliable)
|
|
country_block = soup.find("div", class_="country_settings")
|
|
if country_block:
|
|
span = country_block.find("span", class_="account_data_field")
|
|
if span:
|
|
country = _name_to_iso2(span.get_text(strip=True))
|
|
|
|
# Fallback: any <p> containing "Country:" label
|
|
if not country:
|
|
for p in soup.find_all("p"):
|
|
text = p.get_text()
|
|
if "Country:" in text or "Страна:" in text:
|
|
span = p.find("span", class_="account_data_field")
|
|
if span:
|
|
country = _name_to_iso2(span.get_text(strip=True))
|
|
break
|
|
|
|
# Last resort: look for 2-letter code in embedded JS
|
|
if not country:
|
|
for pattern in [
|
|
r'"userCountry"\s*:\s*"([A-Z]{2})"',
|
|
r'g_strCountryCode\s*=\s*"([A-Z]{2})"',
|
|
]:
|
|
m = re.search(pattern, html)
|
|
if m:
|
|
country = m.group(1)
|
|
break
|
|
|
|
return balance, country
|
|
|
|
|
|
async def fetch_balance_and_country(steam) -> tuple[str, str]:
|
|
"""Fetch wallet balance and country using a pysteamauth steam session."""
|
|
try:
|
|
html = await steam.request("https://store.steampowered.com/account/", method="GET")
|
|
if isinstance(html, bytes):
|
|
html = html.decode("utf-8", errors="replace")
|
|
return _parse_balance_and_country_html(html)
|
|
except Exception as exc:
|
|
logger.warning(f"Balance/country fetch failed: {exc}")
|
|
return "", ""
|
|
|
|
|
|
async def fetch_balance_and_country_aiohttp(session, jar) -> tuple[str, str]: # noqa: ARG001
|
|
"""Fetch wallet balance and country using an aiohttp ClientSession."""
|
|
import aiohttp
|
|
|
|
try:
|
|
async with session.get(
|
|
"https://store.steampowered.com/account/",
|
|
timeout=aiohttp.ClientTimeout(total=15),
|
|
) as resp:
|
|
html = await resp.text()
|
|
return _parse_balance_and_country_html(html)
|
|
except Exception as exc:
|
|
logger.warning(f"Balance/country aiohttp fetch failed: {exc}")
|
|
return "", ""
|