"""Получение числа зрителей Twitch через публичный GQL эндпоинт.""" import logging import aiohttp logger = logging.getLogger(__name__) _GQL_URL = "https://gql.twitch.tv/gql" _HEADERS = { "Client-ID": "kimne78kx3ncx6brgo4mv6wki5h1ko", "Content-Type": "application/json", } _QUERY = """ query ($login: String!) { user(login: $login) { stream { viewersCount } } } """ async def get_viewer_count(channel: str) -> int | None: """ Возвращает число зрителей (0 = оффлайн, >0 = онлайн). Возвращает None при ошибке запроса — статус неизвестен, не менять состояние. """ payload = {"query": _QUERY, "variables": {"login": channel.lower()}} try: async with aiohttp.ClientSession() as session: async with session.post( _GQL_URL, json=payload, headers=_HEADERS, timeout=aiohttp.ClientTimeout(total=8), ) as resp: data = await resp.json() stream = data.get("data", {}).get("user", {}).get("stream") count = stream.get("viewersCount", 0) if stream else 0 logger.info(f"Viewers on {channel}: {count}") return count except Exception as e: logger.warning(f"GQL request failed for {channel}: {e}") return None # ошибка сети — не трогаем состояние задачи