Cum faci un bot de Discord în Python (discord.py)

Fă de la zero un bot de Discord în Python cu discord.py: creezi aplicația, scrii comenzi slash, adaugi un mesaj de bun venit, îl testezi pe calculator și îl găzduiești gratuit pe Torchlite.

4 min de cititDe Echipa TorchliteActualizat

Cum faci un bot de Discord în Python (discord.py)
Pe această pagină

Tutorialul ăsta construiește în Python, cu discord.py, un bot de Discord mic, dar adevărat: două comenzi slash, /hello și /add, și un mesaj care îi întâmpină pe membrii noi. Îl testezi pe calculatorul tău, apoi îl pui pe un server Bot gratuit pe Torchlite, ca să rămână online fără calculatorul tău.

Îți trebuie Python 3.12 sau mai nou și un cont de Discord. Nu ai nevoie de experiență cu boți.

Creează botul în Discord

  1. Deschide Discord Developer Portal și apasă New Application. Numele pe care i-l dai e numele botului.
  2. Deschide Bot din meniul din stânga și apasă Reset Token. Copiază token-ul și ține-l într-un loc privat.
  3. Mai jos, pe aceeași pagină, pornește Server Members Intent. Mesajul de bun venit are nevoie de el; comenzile slash nu.
  4. Deschide OAuth2, apoi URL Generator. Bifează bot și applications.commands, iar la Bot Permissions bifează Send Messages.
  5. Deschide URL-ul generat, alege serverul tău de Discord și apasă Authorize.

Pregătește proiectul

Fă un folder pentru bot cu două fișiere. Primul e requirements.txt, lista de pachete:

text
discord.py

Instalează-l o dată pe calculator:

bash
pip install -r requirements.txt

Scrie botul

Al doilea fișier e bot.py:

python
import os

import discord
from discord import app_commands


class Bot(discord.Client):
    def __init__(self):
        intents = discord.Intents.default()
        intents.members = True  # for on_member_join; switched on in the portal
        super().__init__(intents=intents)
        self.tree = app_commands.CommandTree(self)

    async def setup_hook(self):
        # Sends the slash commands to Discord once, at startup.
        await self.tree.sync()


bot = Bot()


@bot.event
async def on_ready():
    print(f"Online as {bot.user} in {len(bot.guilds)} server(s).")


@bot.tree.command(name="hello", description="Say hello")
async def hello(interaction: discord.Interaction):
    await interaction.response.send_message(f"Hello, {interaction.user.mention}!")


@bot.tree.command(name="add", description="Add two numbers")
@app_commands.describe(a="The first number", b="The second number")
async def add(interaction: discord.Interaction, a: int, b: int):
    await interaction.response.send_message(f"{a} + {b} = {a + b}")


@bot.event
async def on_member_join(member: discord.Member):
    channel = member.guild.system_channel
    if channel is not None:
        await channel.send(f"Welcome to {member.guild.name}, {member.mention}!")


bot.run(os.environ["DISCORD_TOKEN"])

Ce face fiecare parte:

  • Intent-urile îi spun lui Discord ce evenimente vrea botul. Cele implicite acoperă comenzile slash; members adaugă evenimentele de intrare pe server.
  • CommandTree ține comenzile slash, iar tree.sync() le înregistrează la Discord când pornește botul.
  • @bot.tree.command transformă o funcție într-o comandă slash. Tipurile, ca a: int, devin opțiunile comenzii, iar Discord verifică singur ce se introduce.
  • on_member_join rulează când intră cineva și scrie în canalul de sistem al serverului, cel setat la Server Settings, Overview.
  • Token-ul vine din variabila de mediu DISCORD_TOKEN, niciodată din cod.

Poți traduce în română textele pe care le trimite botul, de exemplu Hello în Salut; restul codului rămâne la fel.

Rulează-l pe calculator

Setează token-ul pentru sesiunea asta de terminal, apoi pornește botul. Pe macOS sau Linux:

bash
export DISCORD_TOKEN="paste-your-token-here"
python bot.py

În Windows PowerShell:

powershell
$env:DISCORD_TOKEN="paste-your-token-here"
python bot.py

Terminalul afișează Online as YourBot#1234 in 1 server(s). Scrie / pe serverul tău de Discord și apar cele două comenzi. Prima dată, comenzile slash pot avea nevoie de câteva minute ca să apară.

Găzduiește-l gratuit pe Torchlite

Botul se oprește imediat ce închizi terminalul. Ca să rămână pornit:

  1. Pe Creează serverul, alege planul Bot și Discord bot (Python).
  2. În panel, deschide Startup și pune token-ul în Bot token.
  3. Deschide Files, șterge fișierele botului de start și urcă-ți bot.py și requirements.txt. Verifică la Startup că Main file e bot.py.
  4. Apasă Start în Console. Serverul instalează discord.py din requirements.txt și îți pornește botul.

Ca să faci deploy din GitHub, încât un push și un restart să fie tot deploy-ul, urmează ghidul pentru boți de Discord. Planul Bot dă 512 MB RAM și îți cere un Renew o dată la 24 de ore; hostingul pentru boți de Discord are detaliile.

Ține-l sănătos

Câteva obiceiuri te scapă de cele mai multe probleme odată ce botul e folosit de oameni reali:

  • Răspunde în 3 secunde. Discord afișează „The application did not respond” dacă o comandă nu e confirmată la timp. Pentru orice operație lentă, ca o cerere web sau o interogare în baza de date, apelează întâi await interaction.response.defer(), apoi trimite rezultatul cu await interaction.followup.send(...).
  • Prinde erorile la fiecare comandă. Pune codul riscant în try și except și răspunde cu un mesaj scurt, în loc să lași comanda să eșueze fără niciun semn. Afișează eroarea cu print, ca să apară în Console din panel.
  • Ține datele pe disc, nu în memorie. Tot ce e în variabilele Python se pierde când botul repornește, iar pe un server gratuit repornește de fiecare dată când se ratează o reînnoire. Păstrează ce contează în baza de date MySQL sau într-un fișier SQLite.
  • Nu inunda canalele. Multe mesaje trimise într-o buclă se lovesc de limitele Discord; discord.py așteaptă până trec, dar între timp botul pare blocat. Strânge textul într-un singur mesaj.
  • Urmărește memoria. 512 MB ajung din plin, dar dacă ții în memorie fiecare membru al unui server mare, se adună. Pornește doar intent-urile pe care chiar le folosești.

Ce urmează

  • Mai multe comenzi: copiază blocul add. str, int, float, bool, discord.Member și discord.Role merg toate ca tipuri de opțiuni.
  • Comenzi doar pentru admini: pune @app_commands.default_permissions(administrator=True) deasupra unei comenzi.
  • O bază de date: serverul tău Bot include o bază de date MySQL, sau păstrează lucrurile simple cu un fișier SQLite lângă bot.py.
  • Împarte codul: când fișierul crește, mută comenzile în fișiere separate cu extensiile și cog-urile din discord.py.

Probleme frecvente

KeyError: 'DISCORD_TOKEN'

Variabila de mediu nu e setată în terminalul ăsta, sau pe Torchlite câmpul Bot token e gol. Setează-l și pornește din nou.

PrivilegedIntentsRequired

Codul cere intent-ul members, dar Server Members Intent e oprit în Developer Portal. Pornește-l, sau șterge linia intents.members = True și mesajul de bun venit.

Comenzile slash nu apar

Așteaptă câteva minute după prima pornire și verifică dacă URL-ul de invitare a inclus applications.commands. Repornește botul o dată.

Te-ai blocat la un pas?

Întreabă pe forum. Întrebarea ta trimite înapoi la ghid, ca cine răspunde să știe unde ai rămas.

Întreabă despre ghid

Despre autor

Echipa Torchlite

Oamenii care administrează Torchlite

Construim și administrăm panelul Torchlite și nodurile. Fiecare ghid e verificat pe serverele noastre înainte să apară și actualizat când se schimbă panelul.

Ai găsit o greșeală? Spune-ne pe Discord

Ghiduri similare

Toate ghidurile →