Bot de Discord con el estado de tu servidor de Minecraft (jugadores en línea)
La pregunta que más se repite en el Discord de un servidor es «¿está abierto?». Este bot la contesta solo: en la lista de miembros pone «Jugando a 3/20 jugadores» (o «Servidor apagado») y se actualiza cada minuto, y con /estado enseña la versión, el ping y quién está conectado. Son unas 60 líneas de Python y sirven para cualquier servidor de Minecraft Java, esté donde esté.
Cómo sabe el bot si el servidor está encendido
Pregunta al servidor lo mismo que tu juego cuando abres la lista de servidores multijugador: el «Server List Ping». El servidor contesta con los jugadores conectados, el máximo, la versión y una muestra de nombres. No hace falta instalar ningún plugin ni tocar el servidor, y no necesita RCON ni contraseñas: lo hace la librería mcstatus.
Por eso funciona con cualquier servidor de Minecraft Java que tenga la dirección pública, también uno que no es tuyo. Si el servidor tiene «hide-online-players» activado en server.properties, dirá cuántos hay pero no los nombres. Y el juego enseña como mucho 12 nombres: con más gente, salen 12.
Si lo que quieres es el chat del juego en un canal de Discord (y avisos al entrar y salir), eso es otra cosa: un plugin dentro del servidor, DiscordSRV. Los dos se pueden tener a la vez.
¿Prefieres no montarlo tú? Hosting de bots de Discord desde 1,50 € al mes, sin permanencia y con devolución íntegra en 72 horas. O crea un bot de Discord gratis, sin tarjeta.
1. Crea el bot en Discord
Crea la aplicación
Entra en discord.com/developers/applications, pulsa «New Application» y ponle nombre, por ejemplo el de tu servidor. Es tu bot; la imagen que le pongas es la que verán en la lista de miembros.
Saca el token
En la pestaña «Bot», pulsa «Reset Token» y copia el token. Es la contraseña del bot: quien lo tenga lo controla, así que no lo compartas ni lo subas a GitHub. Este bot no lee mensajes, así que no hace falta activar ningún «Privileged Gateway Intent».
Invítalo a tu servidor
En «OAuth2» → «URL Generator», marca «bot» y «applications.commands», en permisos marca «Send Messages» y «Embed Links», y abre el enlace que sale para añadirlo a tu servidor de Discord.
2. El código
Tres ficheros en una carpeta. En requirements.txt van las librerías; en .env, el token y la dirección de tu servidor de Minecraft (sin comillas, con «:puerto» detrás solo si para entrar lo escribes); y en app.py, el bot.
Lo que hace: cada minuto pregunta al servidor y cambia la actividad del bot («Jugando a 2/20 jugadores» en verde, o «Servidor apagado» en rojo). El comando /estado hace la misma pregunta en el momento y contesta con una tarjeta: jugadores, versión, ping y los nombres de quienes están dentro.
discord.py
mcstatus
python-dotenvDISCORD_TOKEN=pega-aquí-tu-token
MC_DIRECCION=tunombre1.play.napnodes.comimport os
import discord
from discord import app_commands
from discord.ext import tasks
from dotenv import load_dotenv
from mcstatus import JavaServer
load_dotenv() # lee el token y la dirección del fichero .env
DIRECCION = os.environ["MC_DIRECCION"] # la de «Dirección para jugar», con :puerto si lo lleva
intents = discord.Intents.default()
client = discord.Client(intents=intents)
tree = app_commands.CommandTree(client)
async def consultar():
"""Pregunta al servidor como lo hace la lista de servidores del juego. None si no contesta."""
try:
servidor = await JavaServer.async_lookup(DIRECCION)
return await servidor.async_status()
except Exception:
return None
@tasks.loop(minutes=1)
async def actualizar_estado():
estado = await consultar()
if estado is None:
await client.change_presence(status=discord.Status.dnd, activity=discord.Game("Servidor apagado"))
else:
texto = f"{estado.players.online}/{estado.players.max} jugadores"
await client.change_presence(status=discord.Status.online, activity=discord.Game(texto))
@tree.command(name="estado", description="¿Está encendido el servidor de Minecraft y quién juega?")
async def estado_cmd(interaction: discord.Interaction):
await interaction.response.defer() # la consulta puede tardar un par de segundos
estado = await consultar()
if estado is None:
await interaction.followup.send(f"🔴 **{DIRECCION}** no contesta: está apagado o arrancando.")
return
nombres = [j.name for j in (estado.players.sample or [])]
embed = discord.Embed(title=f"🟢 {DIRECCION}", color=0x5B4AE8)
embed.add_field(name="Jugadores", value=f"{estado.players.online}/{estado.players.max}")
embed.add_field(name="Versión", value=estado.version.name)
embed.add_field(name="Ping", value=f"{round(estado.latency)} ms")
if nombres:
embed.add_field(name="Conectados", value=", ".join(nombres), inline=False)
await interaction.followup.send(embed=embed)
@client.event
async def on_ready():
await tree.sync() # publica el comando /estado
if not actualizar_estado.is_running():
actualizar_estado.start()
print(f"Conectado como {client.user}")
client.run(os.environ["DISCORD_TOKEN"])3. Pruébalo en tu ordenador
Con Python 3.10 o más nuevo: abre una terminal en la carpeta, instala las librerías con «pip install -r requirements.txt» y arráncalo con «python app.py». Cuando diga «Conectado como…», en un minuto el bot cambia su actividad, y ya puedes escribir /estado en tu servidor de Discord. Los comandos con barra pueden tardar unos minutos en aparecer la primera vez.
Si dice «no contesta» y el servidor está encendido, revisa MC_DIRECCION: tiene que ser lo mismo que escribes en Minecraft para entrar. Un servidor que está arrancando o generando el mundo tampoco contesta hasta que termina.
Ideas para ampliarlo
Un canal con el número de jugadores en el nombre («🟢 3 jugadores») queda muy vistoso, pero Discord solo deja cambiar el nombre de un canal un par de veces cada 10 minutos: si lo haces, que sea cada 10 minutos, no cada minuto, o Discord frenará al bot. La actividad del bot, en cambio, se puede actualizar cada minuto sin problema.
Para avisar «¡el servidor ya está abierto!», guarda si la última consulta contestó y, cuando pase de no a sí, manda un mensaje a un canal con client.get_channel(ID_DEL_CANAL).send(…). Con varios servidores, una lista de direcciones y un campo de la tarjeta por cada uno.
Para Valheim o Project Zomboid
Valheim y Project Zomboid no contestan al ping de Minecraft, sino a la consulta de Steam (la que usa el buscador de servidores de Steam). Con la librería python-a2s, cambia la función consultar por esta y, donde el bot lee estado.players.online y estado.players.max, pon estado.player_count y estado.max_players. Quita la versión y los nombres de la tarjeta, o pon estado.version y estado.server_name.
Ojo con el puerto: Valheim contesta en el puerto del juego más uno (si entras por el 2456, aquí va el 2457) y Project Zomboid en el mismo puerto con el que se entra.
import a2s # en requirements.txt, añade: python-a2s
# Valheim contesta en el puerto del juego + 1; Project Zomboid, en el mismo puerto del juego
SERVIDOR = ("tunombre1.play.napnodes.com", 2457)
async def consultar():
try:
return await a2s.ainfo(SERVIDOR)
except Exception:
return None4. Déjalo encendido siempre (gratis)
Un bot de estado solo sirve si está siempre encendido: si vive en tu ordenador, al apagarlo se desconecta y deja de avisar.
En NapNodes: crea el bot gratis, pásalo a Python en «Configuración» → «Lenguaje» (nace en Node.js), sube los tres ficheros en «Archivos» (o pon tu repositorio de GitHub, sin el .env) y pulsa «Encender». Las librerías de requirements.txt se instalan solas al arrancar y app.py es el fichero de inicio que viene puesto. El bot no necesita abrir ningún puerto.
El bot gratis de NapNodes tiene 256 MB, de sobra para un bot como este, y solo hay que renovarlo con un clic cada semana. Si crece, Mini (512 MB) cuesta 1,50 € al mes. Y si el servidor de Minecraft también es de NapNodes, su dirección es la de la tarjeta «Dirección para jugar» de «Inicio».
Preguntas frecuentes
¿Cómo hago que un bot de Discord diga cuántos jugadores hay en mi servidor de Minecraft?
Con un bot que pregunte al servidor como lo hace la lista multijugador del juego (en Python, la librería mcstatus) y ponga el número en su actividad, por ejemplo cada minuto. No hace falta ningún plugin en el servidor.
¿Hace falta instalar algo en el servidor de Minecraft?
No. El bot usa la misma consulta que la lista de servidores del juego, que todo servidor de Minecraft Java contesta. Solo un plugin como DiscordSRV hace falta si además quieres el chat del juego en Discord.
¿Por qué el bot dice cuántos hay pero no sus nombres?
Porque el servidor tiene «hide-online-players» activado en server.properties, o porque hay más de 12 conectados: el juego solo enseña una muestra de 12 nombres.
¿Sirve para Valheim y Project Zomboid?
Sí, cambiando la consulta por la de Steam con la librería python-a2s. Valheim contesta en el puerto del juego más uno y Project Zomboid en el mismo puerto.
¿Dónde tengo el bot encendido siempre?
En un servidor. En NapNodes hay un bot gratis de 256 MB que solo hay que renovar con un clic cada semana.
¿Te ha servido esta guía?
¿Lo montamos?
Hosting de bots de Discord desde 1,50 € al mes, sin sobreventa: tu RAM es solo tuya. Y si quieres empezar sin pagar, tienes un bot de Discord gratis, sin tarjeta.
Herramienta gratis: ¿Está encendido mi servidor?. Escribe la dirección de un servidor de Minecraft y mira si responde, cuántos juegan, la versión y el MOTD.
Sigue leyendo
- Bot de bienvenida para Discord: mensaje al entrar y rol automático (Python y JavaScript)
Haz un bot de Discord que salude a quien entra y le dé un rol solo, en Python o JavaScript: el permiso que siempre falta, la jerarquía de roles y las normas.
- Bot de verificación para Discord en Python: un botón y una pregunta antes de entrar
Haz tu bot de verificación de Discord con discord.py: botón «Verificarme», una pregunta contra bots y un rol que abre el servidor. Código completo y gratis.
- Cómo hacer un bot de tickets para Discord en Python (discord.py)
Haz tu propio bot de tickets de Discord con discord.py: un botón que abre un canal privado con tu equipo, uno por persona, que sigue funcionando tras reiniciar.