July 17
Как получать количество игроков онлайн в Steam?
Настраиваем автоматический сбор статистики игроков онлайн в Steam по указанному AppID с сохранением в базу данных MySQL с помощью небольшого Python бота - Steam Player Monitoring Bot.
📋 Предварительные требования
- Python 3.7+
- База данных MySQL (локально или удалённо)
- Steam Web API Key (получить здесь)
- 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
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 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