Pterohost docs

Бот статуса сервера 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 минута для бесплатного тарифа)

Настройка:

  1. Добавь бота на свой Discord-сервер.
  2. В нужном канале выполни команду: /setup host:play.example.com port:25565
  3. Бот создаст закреплённое 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 берётся с прокси, а не с бэкенда. Убедись, что бот подключается к правильному адресу. Если прокси настроен корректно - он должен суммировать игроков со всех бэкендов автоматически.

Бот не видит список ников

Проверь три вещи:

  1. enable-query=true в server.properties (и перезапуск сервера).
  2. query.port открыт в аллокациях на Pterodactyl.
  3. Бот использует 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:

  1. Открой настройки канала в Discord.
  2. Перейди в “Интеграции” -> “Webhooks”.
  3. Нажми “Создать 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 хостинг