July 17

Как получать количество игроков онлайн в Steam?

Пример реализации: График игроков онлайн в Steam для игры Apex Legends

Настраиваем автоматический сбор статистики игроков онлайн в Steam по указанному AppID с сохранением в базу данных MySQL с помощью небольшого Python бота - Steam Player Monitoring Bot.

📋 Предварительные требования

  1. Python 3.7+
  2. База данных MySQL (локально или удалённо)
  3. Steam Web API Key (получить здесь)
  4. Docker

⚙️ Настройка проекта

Создайте файл .env в папке с ботом (шаблон из .env.example):

# Steam API Settings
STEAM_API_KEY=api_key
APP_ID=app_id
INTERVAL_MINUTES=30
# MySQL Settings
DB_HOST=host
DB_NAME=db_name
DB_USER=u_name
DB_PASSWORD=u_pass

Создайте таблицу в MySQL:

CREATE TABLE steam_stats (
  id INT AUTO_INCREMENT PRIMARY KEY,
  timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  appid INT NOT NULL,
  player_count INT NULL,
  error_message VARCHAR(255) NULL
);

🖥️ Запуск бота

Весь необходимый код в репозитории apexhubnet/steam-bot - клонируйте, перейдите в директорию в которой расположен docker-compose.yml, затем:

Запуск через Docker:

docker compose up -d --build

📊 Как это работает

Бот периодически опрашивает Steam API (интервал задаётся в .env).

Лог успешного ответа:

2025-07-17 11:31:58,805 - INFO - Fetching player count...
2025-07-17 11:31:59,075 - INFO - Current players: 85822
2025-07-17 11:31:59,110 - INFO - Data saved to DB
2025-07-17 11:31:59,112 - INFO - Sleeping for 1800 seconds
2025-07-17 12:01:59,212 - INFO - Fetching player count...
2025-07-17 12:01:59,508 - INFO - Current players: 84818
2025-07-17 12:01:59,546 - INFO - Data saved to DB
2025-07-17 12:01:59,548 - INFO - Sleeping for 1800 seconds

Лог при ошибке (например, недоступность API):

2025-07-17 14:35:00 - ERROR - API error: Request failed
2025-07-17 14:35:00 - INFO - Error saved to DB

Двойная система восстановления:

  • При сбоях внутреннего цикла – перезапуск через 60 секунд.
  • При критических ошибках – полный перезапуск приложения.

🔍 Анализ данных

Пример SQL-запроса для получения статистики по Apex Legends (AppID=1172470):

SELECT 
  DATE(timestamp) AS day, 
  HOUR(timestamp) AS hour,
  AVG(player_count) AS avg_players
FROM steam_stats 
WHERE appid=1172470 AND error_message IS NULL
GROUP BY day, hour;

Получаем максимальное значение за неделю:

SELECT MAX(player_count) AS max 
       FROM `steam_stats` 
       WHERE timestamp >= NOW() - INTERVAL 7 DAY
       AND error_message IS NULL

Получаем среднее количество игроков за месяц:

SELECT AVG(player_count) AS average 
       FROM `steam_stats` 
       WHERE timestamp >= NOW() - INTERVAL 30 DAY
       AND error_message IS NULL

Получаем данные за конкретный месяц:

SELECT MAX(player_count) AS max
       FROM `steam_stats`
       WHERE MONTH(`timestamp`) = 03
       AND YEAR(`timestamp`) = 2025