Héberger un bot Discord Python
Un bot Discord Python utilise discord.py et une connexion persistante à la passerelle. Il n'expose pas de port HTTP, mais il doit rester connecté, gérer la reconnexion et protéger son jeton. Sur l'hébergement d'applications, le processus est relancé par la plateforme en cas d'arrêt : la stabilité vient donc du code et de la configuration des intents.
Bot minimal
import os
import logging
import discord
from discord.ext import commands
logging.basicConfig(level=logging.INFO)
intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix="!", intents=intents)
@bot.event
async def on_ready():
print(f"connecté en tant que {bot.user}")
@bot.command()
async def ping(ctx):
await ctx.send("pong")
bot.run(os.environ["DISCORD_TOKEN"])bot.run bloque et maintient la connexion. Le jeton vient d'une variable d'environnement, jamais du fichier. message_content est un intent privilégié : activez-le dans le portail développeur, sinon la connexion est refusée avec PrivilegedIntentsRequired.
Intents et commandes
Demandez seulement ce dont vous avez besoin. Intents.default() couvre les guildes et les messages, mais pas les membres. Activez members uniquement si vous devez les parcourir. Pour les commandes slash, synchronisez-les une fois et évitez de le refaire à chaque redémarrage.
@bot.tree.command(name="ping", description="Répond pong")
async def ping_slash(interaction: discord.Interaction):
await interaction.response.send_message("pong")La synchronisation des commandes dépend de la guilde ou du global ; un excès d'appels peut atteindre les limites de l'API.
Stabilité et mémoire
- Les caches de membres et de messages peuvent grossir ; n'activez pas
memberssans nécessité. - Ne bloquez pas la boucle avec du code synchrone long : utilisez
asyncio.to_threadpour les appels bloquants. - Les exceptions dans un événement ne doivent pas tuer le bot : journalisez et continuez.
discord.pygère la reconnexion, mais une boucle de reconnexion rapide signale souvent un jeton invalide ou un intent refusé.- Surveillez la RAM : une offre à 512 Mo suffit pour un petit serveur, pas pour des milliers de membres avec caches.
Sécurité
Le jeton donne le contrôle du bot. En cas de fuite, réinitialisez-le immédiatement dans le portail développeur et redémarrez le service avec la nouvelle valeur. Ne le journalisez jamais, même en cas d'erreur de connexion. Limitez les permissions du bot sur le serveur et vérifiez les droits avant une action sensible (bannissement, suppression de messages).
Vérifier
Le journal affiche connecté en tant que ..., le bot apparaît en ligne et une commande répond. Laissez tourner trente minutes et vérifiez que la mémoire ne croît pas continuellement. Si le bot se déconnecte en boucle, comparez l'horodatage des erreurs avec un changement récent de jeton ou d'intents.
Publicité
Cet article vous a-t-il aidé ?
À lire aussi
- Déployer une API FastAPIDémarrer Uvicorn correctement, exposer une route de santé et maîtriser la documentation.
- Configurer les variables d'environnement PythonLire les variables avec os.environ, les définir dans le panneau et faire tourner les secrets.
- Déployer une application FlaskLancer Flask sur le port fourni, sans debug, avec une route de santé.