Бот статуса сервера Minecraft в Discord
Как настроить бота статуса сервера Minecraft в Discord: enable-query, готовые боты, виджеты онлайна и числа игроков - пошаговая инструкция.
Кратко: Бот статуса сервера Minecraft в Discord подключается к серверу по пинг-протоколу и автоматически обновляет сообщение с числом игроков. Для базовой работы достаточно включить сервер и добавить бота - enable-query не обязателен. Подробная инструкция ниже.
Бот статуса сервера Minecraft в Discord
Дискорд-сервер без актуального статуса игрового сервера - это неудобно: игроки постоянно пишут “сервер работает?”, “сколько народу онлайн?”, “когда рестарт?”. Бот статуса решает эту проблему раз и навсегда - он сам опрашивает сервер каждые несколько минут и обновляет закреплённое сообщение или ник бота в сайдбаре. В 2026 году настройка занимает 10-15 минут и не требует программистских навыков: есть готовые боты из Discord App Directory, self-hosted варианты и веб-виджеты для сайта. В этой статье разберём все три пути - от самого простого к гибкому.
Pterohost - игровой хостинг с NVMe-дисками, защитой от DDoS и поддержкой 24/7. Промокод 4START даёт -20% на первый заказ. Заказать Minecraft хостинг
Как бот “видит” сервер: протоколы ping и query
Прежде чем настраивать бота, важно понять, как он получает данные. Minecraft поддерживает два независимых механизма опроса сервера:
Протокол Server List Ping (SLP)
Это стандартный пинг, которым пользуется лаунчер для отображения сервера в списке. Работает на основном игровом порту (по умолчанию 25565). Возвращает:
- статус (онлайн/оффлайн)
- MOTD (описание сервера)
- текущее и максимальное число игроков
- версию сервера
- иконку сервера (64x64 PNG, base64)
Для SLP ничего включать в server.properties не нужно - он работает всегда, пока сервер запущен. Большинство ботов используют именно этот протокол.
Протокол Query (GameSpy4)
Query - более старый протокол, изначально разработанный для GameSpy. Работает на UDP-порту (по умолчанию тот же 25565, но UDP). Возвращает расширенную информацию:
- список ников всех онлайн-игроков (не только счётчик)
- список установленных плагинов (если сервер их отдаёт)
- карта, режим игры
Для включения query нужно отредактировать server.properties:
enable-query=true
query.port=25565
После изменения - перезапустить сервер. Если используешь Velocity или BungeeCord, query нужно включать на бэкенд-серверах, а не на проксе.
Что выбрать
| Нужно | Протокол |
|---|---|
| Просто число игроков онлайн | SLP (ничего не включать) |
| Список ников игроков | Query (enable-query=true) |
| MOTD и иконка | SLP |
| Версия и плагины | Query |
Готовые боты из Discord App Directory
Самый быстрый способ - добавить готовый бот без установки каких-либо файлов на хостинг.
MCStatus Bot
Один из наиболее распространённых ботов для статуса Minecraft-серверов. Доступен через Discord App Directory по поиску “MCStatus”.
Основные возможности:
- автообновление embed-сообщения с числом игроков
- уведомления при переходе сервера в офлайн/онлайн
- поддержка Java и Bedrock
- настраиваемый интервал опроса (минимум 1 минута для бесплатного тарифа)
Настройка:
- Добавь бота на свой Discord-сервер.
- В нужном канале выполни команду:
/setup host:play.example.com port:25565 - Бот создаст закреплённое embed-сообщение и начнёт обновлять его автоматически.
Пример embed-сообщения, которое создаёт бот:
🟢 play.example.com - Онлайн
Игроки: 12 / 100
Версия: Paper 1.21.4
MOTD: Добро пожаловать!
Последнее обновление: 2 мин. назад
Minecord
Альтернативный публичный бот с поддержкой нескольких серверов в одном аккаунте. Умеет менять своё имя в сайдбаре Discord на актуальный статус: [12/100] play.example.com. Это удобно - игроки видят число игроков прямо в списке каналов без открытия конкретного канала.
Команды Minecord:
/add server:play.example.com port:25565 channel:#статус-сервера
/status - показать текущий статус вручную
/remove - удалить мониторинг сервера
Self-hosted бот на Python (discord.py + mcstatus)
Если нужен полный контроль - внешний сервис не подходит, или нужны кастомные функции - проще всего написать бота самостоятельно. Для этого понадобятся:
- Python 3.10+
- библиотека
discord.py(2.x) - библиотека
mcstatus(для опроса сервера)
Установка зависимостей:
pip install discord.py mcstatus
Минимальный рабочий бот (файл bot.py):
import discord
from discord.ext import tasks
from mcstatus import JavaServer
import asyncio
TOKEN = "ВАШ_DISCORD_TOKEN"
CHANNEL_ID = 123456789012345678 # ID канала для статуса
SERVER_ADDRESS = "play.example.com"
SERVER_PORT = 25565
MESSAGE_ID = None # будет сохранён после первой отправки
intents = discord.Intents.default()
client = discord.Client(intents=intents)
@client.event
async def on_ready():
print(f"Бот запущен: {client.user}")
update_status.start()
@tasks.loop(minutes=2)
async def update_status():
global MESSAGE_ID
channel = client.get_channel(CHANNEL_ID)
if channel is None:
return
try:
server = JavaServer.lookup(f"{SERVER_ADDRESS}:{SERVER_PORT}")
status = server.status()
online = status.players.online
max_players = status.players.max
version = status.version.name
description = status.description
color = discord.Color.green()
state = "Онлайн"
except Exception:
online = 0
max_players = 0
version = "-"
description = "-"
color = discord.Color.red()
state = "Офлайн"
embed = discord.Embed(
title=f"{SERVER_ADDRESS} - {state}",
color=color
)
embed.add_field(name="Игроки", value=f"{online} / {max_players}", inline=True)
embed.add_field(name="Версия", value=version, inline=True)
embed.add_field(name="MOTD", value=description, inline=False)
embed.set_footer(text="Обновлено")
embed.timestamp = discord.utils.utcnow()
if MESSAGE_ID:
try:
msg = await channel.fetch_message(MESSAGE_ID)
await msg.edit(embed=embed)
return
except discord.NotFound:
pass
msg = await channel.send(embed=embed)
MESSAGE_ID = msg.id
client.run(TOKEN)
Запуск:
python bot.py
Для работы в фоне на Linux используй screen или systemd:
screen -S mcbot python bot.py
# Ctrl+A, D - отсоединиться от screen
Получение ников через Query
Если нужен список ников, замени блок status = server.status() на query:
from mcstatus import JavaServer
server = JavaServer.lookup("play.example.com:25565")
query = server.query()
players_online = query.players.online
player_names = query.players.names # список строк с никами
Не забудь включить enable-query=true в server.properties (см. первый раздел).
Self-hosted бот на Node.js (discord.js)
Если предпочитаешь JavaScript, аналогичный бот пишется на discord.js + minecraft-server-util.
Установка:
npm init -y
npm install discord.js minecraft-server-util
Пример кода (index.js):
const { Client, GatewayIntentBits, EmbedBuilder } = require('discord.js');
const { status } = require('minecraft-server-util');
const TOKEN = 'ВАШ_DISCORD_TOKEN';
const CHANNEL_ID = '123456789012345678';
const SERVER_HOST = 'play.example.com';
const SERVER_PORT = 25565;
const INTERVAL_MS = 2 * 60 * 1000; // 2 минуты
const client = new Client({ intents: [GatewayIntentBits.Guilds] });
let messageId = null;
async function updateStatus() {
const channel = await client.channels.fetch(CHANNEL_ID);
if (!channel) return;
let embed;
try {
const result = await status(SERVER_HOST, SERVER_PORT, { timeout: 5000 });
embed = new EmbedBuilder()
.setTitle(`${SERVER_HOST} - Онлайн`)
.setColor(0x57F287)
.addFields(
{ name: 'Игроки', value: `${result.players.online} / ${result.players.max}`, inline: true },
{ name: 'Версия', value: result.version.name, inline: true }
)
.setTimestamp();
} catch {
embed = new EmbedBuilder()
.setTitle(`${SERVER_HOST} - Офлайн`)
.setColor(0xED4245)
.setTimestamp();
}
if (messageId) {
try {
const msg = await channel.messages.fetch(messageId);
await msg.edit({ embeds: [embed] });
return;
} catch {}
}
const msg = await channel.send({ embeds: [embed] });
messageId = msg.id;
}
client.once('ready', () => {
console.log(`Бот запущен: ${client.user.tag}`);
updateStatus();
setInterval(updateStatus, INTERVAL_MS);
});
client.login(TOKEN);
Запуск:
node index.js
Настройка enable-query в server.properties
Для ботов, которым нужен список ников, или если у тебя нестандартный хостинг с ограниченным SLP - вот полный блок настроек query в server.properties:
# Включить протокол query
enable-query=true
# UDP-порт для query (обычно совпадает с игровым портом)
query.port=25565
# Основной игровой порт (для справки)
server-port=25565
# Привязка к IP (оставь пустым для всех интерфейсов)
server-ip=
Важные моменты:
- После изменений нужен полный перезапуск сервера (
stop+ запуск заново), неreload. - На Pterodactyl-панели query.port должен быть открыт в настройках аллокаций порта. Если порт не выделен - query не будет работать снаружи.
- Firewall на сервере должен пропускать UDP на
query.port. Проверка:nc -uvz play.example.com 25565.
Веб-виджеты для сайта
Если помимо Discord нужен виджет на сайте или форуме - есть готовые сервисы:
mcsrvstat.us
Бесплатное API с поддержкой Java и Bedrock. Возвращает JSON:
GET https://api.mcsrvstat.us/3/play.example.com
Пример ответа:
{
"online": true,
"players": { "online": 12, "max": 100 },
"version": "1.21.4",
"motd": { "clean": ["Добро пожаловать!"] },
"icon": "data:image/png;base64,..."
}
Готовый HTML-виджет (вставить на страницу):
<div id="mc-status"></div>
<script>
fetch('https://api.mcsrvstat.us/3/play.example.com')
.then(r => r.json())
.then(data => {
const el = document.getElementById('mc-status');
if (data.online) {
el.innerHTML = `Сервер онлайн: ${data.players.online}/${data.players.max} игроков`;
} else {
el.innerHTML = 'Сервер офлайн';
}
});
</script>
mcapi.us
Аналогичный сервис с чуть другим форматом API:
GET https://mcapi.us/query/server?ip=play.example.com&port=25565
Оба сервиса кешируют ответы на 60-120 секунд, что снижает нагрузку на сервер при высоком трафике сайта.
Типичные проблемы и их решение
Бот показывает “Офлайн”, хотя сервер работает
Возможные причины и решения:
| Причина | Решение |
|---|---|
| Firewall блокирует порт | Открой TCP 25565 (и UDP, если используешь query) |
| IP-адрес сменился | Обнови адрес в настройках бота |
| Сервер использует нестандартный порт | Укажи явно: play.example.com:25566 |
| Античит подменяет ответ на пинг | Проверь настройки Anti-VPN / AntiBot плагина |
| Хостинг блокирует внешние query | Обратись в поддержку хостинга |
Бот показывает неверное число игроков
На серверах с прокси (BungeeCord, Velocity) player count берётся с прокси, а не с бэкенда. Убедись, что бот подключается к правильному адресу. Если прокси настроен корректно - он должен суммировать игроков со всех бэкендов автоматически.
Бот не видит список ников
Проверь три вещи:
enable-query=trueвserver.properties(и перезапуск сервера).query.portоткрыт в аллокациях на Pterodactyl.- Бот использует Query, а не SLP (в коде -
server.query(), неserver.status()).
Слишком частые уведомления об офлайне при рестарте
Установи в настройках бота grace_period - время, в течение которого недоступность сервера не считается офлайном. Для кастомного бота на Python:
import time
GRACE_PERIOD = 180 # секунд
offline_since = None
# В цикле опроса:
if state == "Офлайн":
if offline_since is None:
offline_since = time.time()
elif time.time() - offline_since < GRACE_PERIOD:
return # ещё в grace period, не уведомлять
else:
offline_since = None
Автоматические уведомления о событиях сервера
Помимо периодического обновления статуса, боты умеют отправлять разовые уведомления при наступлении определённых событий. Это особенно полезно для администраторов, которые не всегда следят за консолью.
Типичные события для уведомлений
- Сервер упал - критически важно. Уведомление в приватный Discord-канал администраторов.
- Сервер вернулся в онлайн - после рестарта или падения.
- Достигнут порог игроков - например, “сервер заполнен на 80%”.
- Вход/выход игрока (для небольших серверов - полезно для учёта).
Реализация уведомлений через Discord Webhook
Вместо полноценного бота можно отправлять уведомления через Webhook - это проще в настройке. Webhook не требует токена бота и приложения в Dev Portal.
Создание Webhook:
- Открой настройки канала в Discord.
- Перейди в “Интеграции” -> “Webhooks”.
- Нажми “Создать Webhook”, скопируй URL.
Пример скрипта-мониторинга на Python, который отправляет уведомление при переходе сервера в офлайн (monitor.py):
import time
import requests
from mcstatus import JavaServer
SERVER = "play.example.com"
PORT = 25565
WEBHOOK_URL = "https://discord.com/api/webhooks/XXXXXXXX/YYYYYYYY"
CHECK_INTERVAL = 60 # секунд
GRACE_PERIOD = 120 # секунд до уведомления об офлайне
was_online = True
offline_since = None
def send_webhook(message: str):
requests.post(WEBHOOK_URL, json={"content": message})
while True:
try:
s = JavaServer.lookup(f"{SERVER}:{PORT}")
s.status()
is_online = True
except Exception:
is_online = False
if is_online and not was_online:
send_webhook(f"Сервер {SERVER} снова онлайн!")
offline_since = None
elif not is_online and was_online:
offline_since = time.time()
elif not is_online and offline_since:
if time.time() - offline_since >= GRACE_PERIOD:
send_webhook(f"Сервер {SERVER} офлайн уже {int((time.time() - offline_since) / 60)} мин.")
offline_since = None # сбросить, чтобы не спамить
was_online = is_online
time.sleep(CHECK_INTERVAL)
Запусти скрипт в фоне и получай уведомления прямо в Discord без установки полноценного бота.
Уведомления через systemd и OnFailure
Ещё один вариант - если сервер Minecraft запущен как systemd unit, настрой OnFailure для вызова скрипта с Webhook:
# /etc/systemd/system/minecraft.service.d/notify.conf
[Unit]
OnFailure=minecraft-notify-failure.service
# /etc/systemd/system/minecraft-notify-failure.service
[Unit]
Description=Notify Discord on Minecraft failure
[Service]
Type=oneshot
ExecStart=/usr/bin/curl -s -X POST "https://discord.com/api/webhooks/XXX/YYY" \
-H "Content-Type: application/json" \
-d '{"content": "Minecraft-сервер упал! Проверьте панель управления."}'
Это самый надёжный способ - уведомление отправится даже если Python-скрипт не запущен.
Связанные материалы
Для понимания всех параметров server.properties, включая enable-query и query.port, читай руководство по server.properties. Если после добавления бота появились лаги - проверь устранение лагов сервера Minecraft. Для настройки прав доступа на сервере поможет настройка LuckPerms.
Заключение
Бот статуса Minecraft в Discord - это несложная, но очень полезная вещь для любого активного сообщества. Для базового варианта достаточно добавить готового бота из App Directory и указать адрес сервера - настройка займёт пять минут. Если нужен список ников или кастомные уведомления - включи enable-query=true в server.properties и запусти self-hosted бота на Python или Node.js. Веб-виджет на mcsrvstat.us дополнит Discord-бота и покажет статус посетителям сайта. Главное - не ставить интервал опроса менее 30-60 секунд, чтобы не создавать лишнюю нагрузку на сервер.
Pterohost - хостинг Minecraft с автоматическими бэкапами, NVMe-дисками и круглосуточной поддержкой. Промокод 4START даёт -20% на первый заказ. Заказать Minecraft хостинг