Programming
Cara Membuat Bot Discord Dengan Python Dari Awal Hingga Deployment
Membuat bot Discord dengan Python adalah salah satu cara paling praktis untuk belajar otomasi, event-driven programming, integrasi API, dan deployment aplikasi kecil yang nyata digunakan komunitas. Dengan library seperti discord.py, bot dapat merespons pesan, menjalankan command, memvalidasi input, memberi role, mencatat aktivitas server, hingga terhubung dengan API eksternal. Tutorial ini menggunakan pendekatan langkah demi langkah, sekaligus membahas alasan di balik setiap keputusan teknis agar Anda tidak hanya menyalin kode, tetapi juga memahami cara kerja bot Discord secara profesional.
Discord banyak digunakan oleh komunitas gim, developer, edukasi, hingga organisasi internal. Bot membantu meningkatkan pengalaman pengguna dengan mengotomasi tugas berulang, menyediakan informasi, dan menambahkan fitur interaktif. Python cocok untuk kebutuhan ini karena sintaksnya mudah dibaca, ekosistemnya matang, dan tersedia library seperti discord.py yang menyediakan akses ke Discord API secara lebih sederhana.
Ringkasan Opsi Membuat Bot Discord dengan Python
![]()
Sebelum masuk ke implementasi, penting untuk memahami beberapa pendekatan umum. Banyak tutorial bot Discord Python menggunakan discord.py karena library ini populer, mudah dipahami, dan mendukung konsep penting seperti event, command, intents, serta modularisasi dengan cogs.
Opsi Pembuatan Bot Discord Python | Kelebihan Utama | Kekurangan Utama | Cocok Untuk |
|---|---|---|---|
| Fleksibel, dokumentasi luas, cocok belajar dasar API Discord | Struktur bisa berantakan jika proyek membesar | Pemula hingga menengah |
| Command lebih rapi, mudah validasi input | Perlu memahami prefix/slash command dan context | Bot komunitas dan utilitas |
Template bot dengan cogs | Modular, mudah dikembangkan tim | Setup awal lebih kompleks | Proyek jangka panjang |
Slash command / application command | Modern, user-friendly di Discord | Sinkronisasi command perlu perhatian | Bot publik dan profesional |
Hosting lokal | Mudah untuk testing | Bot mati jika komputer dimatikan | Belajar dan prototyping |
Deployment cloud/VPS | Bot online 24/7 | Perlu konfigurasi environment dan keamanan token | Bot produksi |
Catatan penting: Untuk tutorial ini, kita mulai dari
discord.pydandiscord.ext.commandskarena pendekatan ini memberi fondasi kuat: Anda belajar event, command, validasi input, error handling, dan struktur proyek yang bisa dikembangkan.
Background
Bot Discord bekerja sebagai aplikasi yang terhubung ke Discord melalui API. Ketika ada aktivitas di server, seperti pesan baru, member bergabung, atau command dipanggil, Discord mengirimkan event ke bot. Bot lalu menjalankan fungsi Python yang sesuai.
Konsep ini dikenal sebagai event-driven programming. Artinya, program tidak berjalan secara linear seperti skrip biasa, tetapi menunggu peristiwa tertentu. Misalnya:
-
User mengirim pesan.
-
Discord mengirim event
on_message. -
Bot membaca isi pesan.
-
Bot menentukan apakah perlu merespons.
-
Bot mengirim balasan ke channel.
Library discord.py menyederhanakan komunikasi dengan Discord API. Anda tidak perlu membuat koneksi WebSocket manual, menyusun request HTTP sendiri, atau menangani payload mentah dari Discord. Library ini menyediakan class dan decorator seperti commands.Bot, @bot.event, dan @bot.command().
Dalam praktik profesional, bot Discord biasanya digunakan untuk:
-
Moderasi server, seperti menghapus spam, memberi peringatan, atau mencatat aktivitas.
-
Informasi otomatis, seperti menampilkan aturan, jadwal, statistik, atau pengumuman.
-
Integrasi API eksternal, seperti cuaca, GitHub, game server, atau sistem internal.
-
Interaksi komunitas, seperti kuis, leveling, polling, dan command hiburan.
-
Manajemen role, seperti memberi role otomatis saat user bergabung.
Challenge/Problem
Masalah utama saat membuat bot Discord bukan hanya menulis kode yang bisa membalas pesan. Banyak pemula mengalami hambatan seperti token bocor, bot tidak online, command tidak merespons, intents belum diaktifkan, atau struktur kode sulit dikembangkan.
Beberapa tantangan umum:
-
Token bot tidak aman
Token adalah kredensial rahasia. Jika token dibagikan ke GitHub atau chat publik, orang lain dapat mengendalikan bot. -
Intents belum dikonfigurasi
Discord menggunakan intents untuk menentukan event apa saja yang boleh diterima bot. Jikamessage_contenttidak aktif, bot mungkin online tetapi tidak bisa membaca isi pesan. -
Event dan command saling bertabrakan
Jika menggunakanon_messagetanpa memanggilbot.process_commands(message), command berbasis prefix bisa berhenti bekerja. -
Struktur proyek tidak scalable
Satu file besar mungkin cukup untuk bot sederhana, tetapi akan sulit dirawat saat fitur bertambah. -
Deployment tidak stabil
Bot yang berjalan di laptop pribadi akan offline saat laptop dimatikan. Untuk server komunitas aktif, deployment cloud atau VPS lebih tepat. -
Error handling kurang baik
Bot yang tidak menangani error akan membingungkan user. Misalnya, ketika user memasukkan command tanpa argumen, bot sebaiknya memberi pesan bantuan yang jelas.
Approach
Pendekatan tutorial ini adalah membuat bot dari dasar, lalu meningkatkannya secara bertahap. Kita akan mulai dari setup aplikasi di Discord Developer Portal, menyiapkan environment Python, membuat bot sederhana, menambahkan command, menangani error, lalu menyusun struktur proyek yang lebih profesional.
Alurnya sebagai berikut:
-
Menyiapkan aplikasi bot di Discord Developer Portal agar Discord mengenali bot Anda.
-
Mengaktifkan intents yang diperlukan supaya bot bisa menerima event tertentu.
-
Mengundang bot ke server dengan permission yang sesuai.
-
Membuat virtual environment Python agar dependency proyek terisolasi.
-
Menginstal
discord.pydanpython-dotenvuntuk API Discord dan pengelolaan token. -
Membuat file konfigurasi
.envagar token tidak ditulis langsung di kode. -
Menulis bot dasar untuk memverifikasi koneksi.
-
Menambahkan command interaktif agar user bisa menggunakan bot.
-
Menambahkan validasi dan error handling supaya bot lebih aman dan ramah pengguna.
-
Menyusun opsi deployment untuk menjalankan bot secara stabil.
Pendekatan ini selaras dengan praktik umum dalam pengembangan bot Python: mulai dari event dasar, lanjut ke command, validasi input, penggunaan API, dan deployment.
Perbandingan Library dan Pendekatan
Saat membangun bot Discord dengan Python, pilihan paling umum adalah menggunakan library yang membungkus Discord API. Berikut perbandingan praktisnya.
Kriteria |
| Template dengan Cogs | Slash Command |
|---|---|---|---|
Kemudahan untuk pemula | Tinggi | Sedang | Sedang |
Struktur proyek besar | Sedang | Tinggi | Tinggi |
Command berbasis teks | Sangat baik | Sangat baik | Tidak fokus |
Pengalaman user modern | Baik | Baik | Sangat baik |
Waktu setup awal | Cepat | Lebih lama | Sedang |
Cocok untuk produksi | Bisa | Sangat cocok | Sangat cocok |
Rekomendasi Berdasarkan Use Case
Use Case | Rekomendasi | Alasan |
|---|---|---|
Belajar pertama kali |
| Cepat dipahami dan mudah diuji |
Bot komunitas kecil |
| Command lebih rapi dan mudah dikembangkan |
Bot komunitas besar | Cogs + deployment cloud | Modular dan stabil |
Bot publik profesional | Slash command | Lebih sesuai pengalaman Discord modern |
Bot eksperimen lokal | Hosting lokal | Setup sederhana |
Bot 24/7 | VPS atau cloud app platform | Tidak bergantung pada komputer pribadi |
Tips: Jika Anda baru mulai, jangan langsung membuat struktur terlalu kompleks. Pahami dulu event, command, intents, dan token. Setelah itu, barulah pindahkan fitur ke cogs atau modul terpisah.
Prerequisites
Sebelum mengikuti langkah-langkah teknis, pastikan Anda sudah menyiapkan beberapa hal berikut.
Kebutuhan | Versi/Rekomendasi | Mengapa Penting |
|---|---|---|
Akun Discord | Aktif dan bisa membuat server | Dibutuhkan untuk membuat aplikasi bot |
Server Discord | Server milik sendiri atau punya izin admin | Bot perlu tempat untuk diuji |
Python | Python 3.10+ direkomendasikan | Kompatibel dengan library modern |
Code editor | VS Code, PyCharm, atau editor lain | Memudahkan editing dan debugging |
Terminal | Command Prompt, PowerShell, Terminal macOS/Linux | Untuk menjalankan command |
Dasar Python | Function, async, variable, import | Membantu memahami kode bot |
Git opsional | Direkomendasikan | Berguna untuk version control |
Struktur Proyek yang Akan Dibuat
discord-python-bot/
├── bot.py
├── .env
├── .gitignore
└── requirements.txt
Setiap file memiliki fungsi:
-
bot.pyberisi kode utama bot. -
.envmenyimpan token rahasia. -
.gitignoremencegah file sensitif masuk ke Git. -
requirements.txtmencatat dependency Python.
Peringatan: Jangan pernah membagikan token bot. Jika token terlanjur bocor, segera reset token dari Discord Developer Portal.
Step 1: Membuat Aplikasi Bot di Discord Developer Portal
-
Buka Discord Developer Portal di browser.
-
Masuk menggunakan akun Discord Anda.
-
Klik tombol
New Application. -
Masukkan nama aplikasi, misalnya
Python Community Bot. -
Klik
Create.
Langkah ini penting karena bot Discord harus terdaftar sebagai aplikasi resmi di sistem Discord. Aplikasi ini menjadi identitas utama bot, termasuk nama, avatar, token, permission, dan pengaturan OAuth2.
Setelah aplikasi dibuat:
-
Buka menu
Bot. -
Klik
Add Bot. -
Konfirmasi pembuatan bot.
-
Atur nama dan avatar bot jika diperlukan.
Catatan penting: Aplikasi dan bot adalah dua konsep yang berkaitan tetapi tidak identik. Aplikasi adalah container, sedangkan bot adalah user otomatis yang akan masuk ke server.
Step 2: Mengaktifkan Privileged Gateway Intents
-
Masuk ke halaman aplikasi bot.
-
Buka menu
Bot. -
Cari bagian
Privileged Gateway Intents. -
Aktifkan
Message Content Intent. -
Aktifkan
Server Members Intentjika bot perlu membaca data member. -
Simpan perubahan.
Intents penting karena Discord membatasi jenis event yang dapat diterima bot. Jika Anda ingin bot membaca isi pesan untuk command berbasis prefix seperti !halo, maka Message Content Intent harus aktif.
Di kode Python, intents juga harus diaktifkan:
import discord
from discord.ext import commands
intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix="!", intents=intents)
Mengaktifkan intents hanya di portal tidak cukup. Anda juga harus mendeklarasikannya di kode. Sebaliknya, mengaktifkannya di kode saja juga tidak cukup jika intent tersebut termasuk privileged intent di portal.
Peringatan: Jika bot online tetapi tidak merespons command berbasis pesan, periksa
Message Content Intentdi portal dan kode.
Step 3: Mengundang Bot ke Server Discord
-
Buka menu
OAuth2. -
Pilih
URL Generator. -
Centang scope
bot. -
Centang scope
applications.commandsjika ingin memakai slash command nanti. -
Pilih permission yang dibutuhkan, misalnya:
-
Send Messages -
Read Message History -
View Channels -
Manage Messagesjika bot akan moderasi
-
-
Salin generated URL.
-
Buka URL tersebut di browser.
-
Pilih server tujuan.
-
Klik
Authorize.
Permission sebaiknya diberikan sesuai kebutuhan. Bot sederhana tidak perlu permission administrator. Prinsip least privilege membuat bot lebih aman jika token atau aksesnya bermasalah.
Fitur Bot | Permission Minimum |
|---|---|
Membalas pesan |
|
Membaca riwayat |
|
Menghapus spam |
|
Memberi role |
|
Membuat embed |
|
Tips: Untuk tahap belajar, gunakan server test pribadi. Jangan langsung menguji bot di server besar karena error command bisa mengganggu member.
Step 4: Menyiapkan Folder Proyek dan Virtual Environment
![]()
- Buat folder proyek baru:
mkdir discord-python-bot
cd discord-python-bot
- Buat virtual environment:
python -m venv .venv
- Aktifkan virtual environment di Windows:
.venv\Scripts\activate
- Aktifkan virtual environment di macOS atau Linux:
source .venv/bin/activate
Virtual environment penting agar dependency bot tidak bercampur dengan dependency Python global. Ini membuat proyek lebih mudah dipindahkan ke komputer lain atau dideploy ke server.
Jika berhasil, biasanya terminal akan menampilkan prefix seperti:
(.venv) $
Tips: Jika command
pythontidak dikenali di Windows, coba gunakanpy:BASHpy -m venv .venv
Step 5: Menginstal Library yang Dibutuhkan
-

Instal
discord.pydanpython-dotenv:
pip install discord.py python-dotenv
- Simpan dependency ke
requirements.txt:
pip freeze > requirements.txt
discord.py digunakan untuk berinteraksi dengan Discord API. python-dotenv digunakan untuk membaca token dari file .env, sehingga token tidak perlu ditulis langsung di kode.
Contoh isi requirements.txt akan terlihat seperti:
discord.py==2.4.0
python-dotenv==1.0.1
Versi bisa berbeda tergantung waktu instalasi.
Catatan penting: Menyimpan dependency di
requirements.txtmembantu deployment. Server produksi dapat menginstal dependency denganpip install -r requirements.txt.
Step 6: Menyimpan Token Bot dengan Aman
![]()
-
Buka Discord Developer Portal.
-
Masuk ke aplikasi bot.
-
Buka menu
Bot. -
Klik
Reset TokenatauCopy Token. -
Buat file
.envdi folder proyek. -
Isi file
.envseperti berikut:
DISCORD_TOKEN=isi_token_bot_anda_di_sini
- Buat file
.gitignore:
.env
.venv/
__pycache__/
*.pyc
Langkah ini penting karena token adalah akses penuh ke bot. Jika token bocor, pihak lain dapat menjalankan bot, mengirim pesan, atau menyalahgunakan permission yang dimiliki bot.
Peringatan: Jangan commit
.envke GitHub. Jika token sudah pernah masuk repository publik, anggap token tersebut bocor dan reset segera.
Step 7: Membuat Bot Dasar
-
Buat file
bot.py. -
Tulis kode berikut:
import os
import discord
from discord.ext import commands
from dotenv import load_dotenv
load_dotenv()
token = os.getenv("DISCORD_TOKEN")
intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix="!", intents=intents)
@bot.event
async def on_ready():
print(f"Bot berhasil login sebagai {bot.user}")
bot.run(token)
- Jalankan bot:
python bot.py
Expected output di terminal:
Bot berhasil login sebagai Python Community Bot#1234
Kode ini melakukan beberapa hal penting:
-
Memuat environment variable dari
.env. -
Mengambil token menggunakan
os.getenv. -
Membuat konfigurasi intents.
-
Membuat instance bot dengan prefix
!. -
Menjalankan event
on_readysaat bot berhasil login. -
Menghubungkan bot ke Discord menggunakan token.
Tips: Jika output berhasil muncul dan status bot online di Discord, berarti koneksi dasar sudah benar.
Step 8: Menambahkan Command Pertama
-

Tambahkan command
halokebot.py:
@bot.command(name="halo")
async def halo(ctx):
await ctx.send(f"Halo, {ctx.author.mention}! Bot siap membantu.")
-
Letakkan command sebelum baris
bot.run(token). -
Jalankan ulang bot:
python bot.py
- Ketik command di channel Discord:
!halo
Expected output di Discord:
Halo, @NamaUser! Bot siap membantu.
Command ini menggunakan ctx, singkatan dari context. Objek ctx berisi informasi tentang pesan, author, channel, guild, dan command yang dipanggil.
Contoh lengkap sampai tahap ini:
import os
import discord
from discord.ext import commands
from dotenv import load_dotenv
load_dotenv()
token = os.getenv("DISCORD_TOKEN")
intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix="!", intents=intents)
@bot.event
async def on_ready():
print(f"Bot berhasil login sebagai {bot.user}")
@bot.command(name="halo")
async def halo(ctx):
await ctx.send(f"Halo, {ctx.author.mention}! Bot siap membantu.")
bot.run(token)
Catatan penting: Function command harus menggunakan
async defkarena komunikasi ke Discord berjalan secara asynchronous.
Step 9: Membuat Command dengan Argumen
- Tambahkan command penjumlahan:
@bot.command(name="tambah")
async def tambah(ctx, angka_pertama: int, angka_kedua: int):
hasil = angka_pertama + angka_kedua
await ctx.send(f"Hasil: {hasil}")
-
Jalankan bot.
-
Ketik command:
!tambah 10 25
Expected output:
Hasil: 35
Mengapa type hint int penting? discord.py dapat mencoba mengonversi argumen string dari pesan menjadi integer. Jika user mengetik !tambah sepuluh dua, command akan gagal karena input tidak valid. Ini memberi kesempatan untuk menambahkan error handling yang baik.
Tips: Gunakan type hint untuk validasi dasar. Ini membuat command lebih aman dan mengurangi parsing manual.
Step 10: Menambahkan Error Handling
- Tambahkan handler error untuk command:
@tambah.error
async def tambah_error(ctx, error):
if isinstance(error, commands.MissingRequiredArgument):
await ctx.send("Format salah. Gunakan: `!tambah 10 25`")
elif isinstance(error, commands.BadArgument):
await ctx.send("Argumen harus berupa angka. Contoh: `!tambah 10 25`")
else:
await ctx.send("Terjadi error saat menjalankan command.")
- Uji command tanpa argumen:
!tambah
Expected output:
Format salah. Gunakan: !tambah 10 25
- Uji command dengan argumen salah:
!tambah ayam 25
Expected output:
Argumen harus berupa angka. Contoh: !tambah 10 25
Error handling penting karena user tidak selalu menggunakan command dengan benar. Pesan error yang jelas akan mengurangi kebingungan dan membuat bot terasa lebih profesional.
Peringatan: Jangan menampilkan detail error internal ke user biasa. Simpan detail teknis di log terminal atau sistem logging.
Step 11: Membuat Command Embed
Embed membuat output bot terlihat lebih rapi dibanding pesan teks biasa. Cocok untuk help menu, profil user, statistik server, atau pengumuman.
- Tambahkan command
info:
@bot.command(name="info")
async def info(ctx):
embed = discord.Embed(
title="Info Bot",
description="Bot Discord berbasis Python untuk otomasi komunitas.",
color=discord.Color.blue(),
)
embed.add_field(name="Prefix", value="`!`", inline=True)
embed.add_field(name="Library", value="`discord.py`", inline=True)
embed.add_field(name="Server", value=ctx.guild.name, inline=False)
embed.set_footer(text=f"Diminta oleh {ctx.author}")
await ctx.send(embed=embed)
- Ketik command:
!info
Expected output:
Embed berjudul "Info Bot" dengan field Prefix, Library, dan Server.
Menggunakan embed penting untuk informasi yang punya struktur. User lebih mudah membaca field dibanding paragraf panjang.
Tips: Gunakan embed secukupnya. Untuk respons sederhana seperti
Pong!, teks biasa lebih cepat dan cukup.
Step 12: Menambahkan Event Saat Member Bergabung
Jika bot Anda membutuhkan fitur komunitas, event on_member_join berguna untuk menyambut member baru.
-
Aktifkan
Server Members Intentdi Developer Portal. -
Tambahkan intents di kode:
intents.members = True
- Tambahkan event:
@bot.event
async def on_member_join(member):
channel = discord.utils.get(member.guild.text_channels, name="general")
if channel:
await channel.send(f"Selamat datang, {member.mention}! Jangan lupa baca aturan server.")
Event ini mencari channel bernama general, lalu mengirim pesan sambutan. Jika server Anda memakai nama channel lain seperti welcome, sesuaikan bagian name="general".
Peringatan: Event ini tidak akan berjalan jika
Server Members Intentbelum aktif di portal dan kode.
Step 13: Menghindari Masalah on_message
Kadang developer ingin membaca pesan manual menggunakan event on_message. Namun, jika tidak hati-hati, command bot bisa berhenti.
Contoh yang kurang lengkap:
@bot.event
async def on_message(message):
if message.author == bot.user:
return
if "python" in message.content.lower():
await message.channel.send("Python terdeteksi!")
Masalahnya, command seperti !halo bisa tidak diproses karena event ini mengambil alih pesan. Solusinya adalah memanggil bot.process_commands(message).
Kode yang benar:
@bot.event
async def on_message(message):
if message.author == bot.user:
return
if "python" in message.content.lower():
await message.channel.send("Python terdeteksi!")
await bot.process_commands(message)
Mengapa ini penting? commands.Bot memiliki sistem command internal. Saat Anda override on_message, Anda harus meneruskan pesan ke sistem command agar command tetap berjalan.
Catatan penting: Jika bot online tetapi semua command tidak merespons setelah Anda menambahkan
on_message, kemungkinan besarbot.process_commands(message)belum dipanggil.
Step 14: Membuat Command Moderasi Sederhana
Command moderasi membutuhkan permission khusus. Contoh berikut membuat command untuk menghapus sejumlah pesan.
-
Pastikan bot memiliki permission
Manage Messages. -
Tambahkan command berikut:
@bot.command(name="clear")
@commands.has_permissions(manage_messages=True)
async def clear(ctx, jumlah: int):
if jumlah < 1 or jumlah > 100:
await ctx.send("Jumlah harus antara 1 sampai 100.")
return
deleted = await ctx.channel.purge(limit=jumlah + 1)
await ctx.send(f"Menghapus {len(deleted) - 1} pesan.", delete_after=5)
- Tambahkan error handling:
@clear.error
async def clear_error(ctx, error):
if isinstance(error, commands.MissingPermissions):
await ctx.send("Anda tidak punya izin untuk menggunakan command ini.")
elif isinstance(error, commands.MissingRequiredArgument):
await ctx.send("Format salah. Gunakan: `!clear 10`")
elif isinstance(error, commands.BadArgument):
await ctx.send("Jumlah harus berupa angka. Contoh: `!clear 10`")
else:
await ctx.send("Gagal menghapus pesan.")
- Uji command:
!clear 5
Expected output:
Menghapus 5 pesan.
Mengapa validasi jumlah penting? Discord membatasi dan mengatur operasi bulk delete. Selain itu, membatasi input mencegah user menghapus terlalu banyak pesan secara tidak sengaja.
Peringatan: Command moderasi sebaiknya hanya diberikan kepada role tertentu. Jangan memberi permission luas ke semua member.
Step 15: Menyusun Kode Lengkap Bot Sederhana
Berikut versi lengkap bot.py yang mencakup koneksi, command, embed, error handling, event member, dan moderasi dasar.
import os
import discord
from discord.ext import commands
from dotenv import load_dotenv
load_dotenv()
token = os.getenv("DISCORD_TOKEN")
if token is None:
raise RuntimeError("DISCORD_TOKEN belum diatur di file .env")
intents = discord.Intents.default()
intents.message_content = True
intents.members = True
bot = commands.Bot(command_prefix="!", intents=intents)
@bot.event
async def on_ready():
print(f"Bot berhasil login sebagai {bot.user}")
@bot.event
async def on_member_join(member):
channel = discord.utils.get(member.guild.text_channels, name="general")
if channel:
await channel.send(f"Selamat datang, {member.mention}! Jangan lupa baca aturan server.")
@bot.event
async def on_message(message):
if message.author == bot.user:
return
if "python" in message.content.lower():
await message.channel.send("Python terdeteksi!")
await bot.process_commands(message)
@bot.command(name="halo")
async def halo(ctx):
await ctx.send(f"Halo, {ctx.author.mention}! Bot siap membantu.")
@bot.command(name="tambah")
async def tambah(ctx, angka_pertama: int, angka_kedua: int):
hasil = angka_pertama + angka_kedua
await ctx.send(f"Hasil: {hasil}")
@tambah.error
async def tambah_error(ctx, error):
if isinstance(error, commands.MissingRequiredArgument):
await ctx.send("Format salah. Gunakan: `!tambah 10 25`")
elif isinstance(error, commands.BadArgument):
await ctx.send("Argumen harus berupa angka. Contoh: `!tambah 10 25`")
else:
await ctx.send("Terjadi error saat menjalankan command.")
@bot.command(name="info")
async def info(ctx):
embed = discord.Embed(
title="Info Bot",
description="Bot Discord berbasis Python untuk otomasi komunitas.",
color=discord.Color.blue(),
)
embed.add_field(name="Prefix", value="`!`", inline=True)
embed.add_field(name="Library", value="`discord.py`", inline=True)
embed.add_field(name="Server", value=ctx.guild.name, inline=False)
embed.set_footer(text=f"Diminta oleh {ctx.author}")
await ctx.send(embed=embed)
@bot.command(name="clear")
@commands.has_permissions(manage_messages=True)
async def clear(ctx, jumlah: int):
if jumlah < 1 or jumlah > 100:
await ctx.send("Jumlah harus antara 1 sampai 100.")
return
deleted = await ctx.channel.purge(limit=jumlah + 1)
await ctx.send(f"Menghapus {len(deleted) - 1} pesan.", delete_after=5)
@clear.error
async def clear_error(ctx, error):
if isinstance(error, commands.MissingPermissions):
await ctx.send("Anda tidak punya izin untuk menggunakan command ini.")
elif isinstance(error, commands.MissingRequiredArgument):
await ctx.send("Format salah. Gunakan: `!clear 10`")
elif isinstance(error, commands.BadArgument):
await ctx.send("Jumlah harus berupa angka. Contoh: `!clear 10`")
else:
await ctx.send("Gagal menghapus pesan.")
bot.run(token)
Expected output saat dijalankan:
Bot berhasil login sebagai Python Community Bot#1234
Expected command di Discord:
Command | Input | Output |
|---|---|---|
Halo |
| Bot menyapa user |
Tambah |
|
|
Info |
| Embed info bot |
Clear |
| Menghapus 5 pesan |
Keyword | Pesan berisi |
|
Step 16: Membuat Struktur Modular dengan Cogs
Untuk proyek kecil, satu file bot.py masih cukup. Namun, jika fitur bertambah, struktur modular lebih baik. Komunitas pengembang bot Discord Python sering menggunakan cogs agar command dipisahkan berdasarkan kategori.
Struktur modular:
discord-python-bot/
├── bot.py
├── cogs/
│ ├── general.py
│ └── moderation.py
├── .env
├── .gitignore
└── requirements.txt
-
Buat folder
cogs. -
Buat file
cogs/general.py:
import discord
from discord.ext import commands
class General(commands.Cog):
def __init__(self, bot):
self.bot = bot
@commands.command(name="halo")
async def halo(self, ctx):
await ctx.send(f"Halo, {ctx.author.mention}! Bot siap membantu.")
@commands.command(name="info")
async def info(self, ctx):
embed = discord.Embed(
title="Info Bot",
description="Bot modular berbasis cogs.",
color=discord.Color.green(),
)
embed.add_field(name="Prefix", value="`!`", inline=True)
embed.add_field(name="Library", value="`discord.py`", inline=True)
await ctx.send(embed=embed)
async def setup(bot):
await bot.add_cog(General(bot))
- Ubah
bot.pyagar memuat cog:
import asyncio
import os
import discord
from discord.ext import commands
from dotenv import load_dotenv
load_dotenv()
token = os.getenv("DISCORD_TOKEN")
if token is None:
raise RuntimeError("DISCORD_TOKEN belum diatur di file .env")
intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix="!", intents=intents)
@bot.event
async def on_ready():
print(f"Bot berhasil login sebagai {bot.user}")
async def load_extensions():
await bot.load_extension("cogs.general")
async def main():
async with bot:
await load_extensions()
await bot.start(token)
asyncio.run(main())
Mengapa cogs penting? Cogs membuat fitur lebih mudah dipelihara. Misalnya, semua command umum masuk ke general.py, command moderasi ke moderation.py, command musik ke music.py, dan seterusnya.
Tips: Gunakan cogs ketika bot memiliki lebih dari 5-10 command atau dikerjakan oleh lebih dari satu developer.
Step 17: Menambahkan Logging Sederhana
Logging membantu Anda melacak error dan aktivitas bot.
- Tambahkan import logging:
import logging
- Konfigurasi logging:
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s %(levelname)s %(name)s: %(message)s",
)
- Gunakan logger:
logger = logging.getLogger("discord_bot")
@bot.event
async def on_ready():
logger.info("Bot berhasil login sebagai %s", bot.user)
Logging lebih baik daripada hanya print untuk proyek yang akan dideploy. Anda bisa mengatur level seperti INFO, WARNING, dan ERROR.
Expected output:
2025-01-10 10:15:00 INFO discord_bot: Bot berhasil login sebagai Python Community Bot#1234
Catatan penting: Jangan menulis token ke log. Log sering disimpan oleh platform deployment.
Step 18: Deployment Bot Discord Python
Setelah bot stabil di lokal, Anda bisa menjalankannya 24/7. Ada beberapa opsi deployment.
Opsi Deployment Bot Discord Python | Kelebihan | Kekurangan | Best For |
|---|---|---|---|
Laptop pribadi | Gratis, mudah | Tidak stabil, harus selalu menyala | Belajar |
VPS | Kontrol penuh, stabil | Perlu setup Linux dan security | Produksi kecil-menengah |
Platform cloud app | Praktis, mudah scale | Bisa punya batas free tier | Bot komunitas |
Docker | Konsisten lintas environment | Setup awal lebih teknis | Tim dan produksi |
Raspberry Pi | Hemat daya, lokal | Perlu perangkat tambahan | Hobi dan server kecil |
Contoh Deployment di VPS Linux
-
Upload proyek ke server.
-
Instal Python dan pip.
-
Buat virtual environment.
-
Instal dependency:
pip install -r requirements.txt
- Buat file
.envdi server:
DISCORD_TOKEN=token_produksi_anda
- Jalankan bot:
python bot.py
Untuk menjalankan bot sebagai service, Anda bisa memakai systemd.
Contoh file service:
[Unit]
Description=Discord Python Bot
After=network.target
[Service]
WorkingDirectory=/home/ubuntu/discord-python-bot
ExecStart=/home/ubuntu/discord-python-bot/.venv/bin/python bot.py
Restart=always
User=ubuntu
Environment=PYTHONUNBUFFERED=1
[Install]
WantedBy=multi-user.target
- Aktifkan service:
sudo systemctl enable discord-bot
sudo systemctl start discord-bot
sudo systemctl status discord-bot
Expected output status:
Active: active (running)
Peringatan: Pastikan file
.envdi server hanya dapat dibaca oleh user yang menjalankan bot.
Common Errors dan Troubleshooting
Bot Tidak Online
Kemungkinan Penyebab | Cara Memperbaiki |
|---|---|
Token salah | Reset dan salin ulang token |
| Pastikan file bernama |
Dependency belum terinstal | Jalankan |
Salah environment Python | Aktifkan |
Contoh error:
discord.errors.LoginFailure: Improper token has been passed.
Solusi:
-
Reset token dari Developer Portal.
-
Perbarui
DISCORD_TOKENdi.env. -
Pastikan tidak ada spasi tambahan:
DISCORD_TOKEN=token_tanpa_spasi
Command Tidak Merespons
Kemungkinan Penyebab | Cara Memperbaiki |
|---|---|
| Aktifkan di Developer Portal dan kode |
Prefix salah | Pastikan command memakai |
| Tambahkan |
Bot tidak punya akses channel | Cek permission channel |
Contoh checklist:
-
Ketik
!halo, bukan/halo, jika masih memakai prefix command. -
Pastikan bot dapat melihat channel.
-
Pastikan
intents.message_content = True. -
Restart bot setelah mengubah intents.
Error ModuleNotFoundError
Contoh error:
ModuleNotFoundError: No module named 'discord'
Solusi:
- Aktifkan virtual environment:
source .venv/bin/activate
- Instal dependency:
pip install discord.py python-dotenv
- Jalankan ulang bot:
python bot.py
Error Permission Saat Moderasi
Contoh error:
discord.errors.Forbidden: 403 Forbidden
Solusi:
-
Pastikan bot punya permission
Manage Messages. -
Pastikan role bot lebih tinggi dari role target jika mengelola role/member.
-
Cek permission channel, bukan hanya permission server.
-
Jangan gunakan permission administrator jika tidak diperlukan.
Bot Membalas Dirinya Sendiri
Jika bot membaca pesan dan membalas tanpa filter, bot bisa memicu loop.
Solusi:
@bot.event
async def on_message(message):
if message.author == bot.user:
return
await bot.process_commands(message)
Filter ini mencegah bot merespons pesannya sendiri.
Case Study: Bot Komunitas Belajar Python
Background
Sebuah komunitas belajar Python di Discord memiliki sekitar 500 member. Setiap minggu, moderator sering menjawab pertanyaan berulang seperti link aturan, jadwal mentoring, dan cara mendapatkan role. Selain itu, channel diskusi kadang penuh pesan spam ringan saat event berlangsung.
Komunitas membutuhkan bot sederhana yang bisa:
-
Menyapa member baru.
-
Menampilkan informasi server.
-
Menjawab command bantuan.
-
Menghapus pesan dalam jumlah terbatas.
-
Memberi respons otomatis saat keyword tertentu muncul.
Challenge/Problem
Masalah utama komunitas adalah beban moderator. Dalam satu minggu, moderator bisa menjawab pertanyaan yang sama puluhan kali. Respons manual menyebabkan keterlambatan, terutama saat moderator sedang offline.
Tantangan teknisnya:
-
Bot harus mudah dipelihara oleh pengurus yang belum semuanya mahir programming.
-
Token harus aman karena repository proyek akan disimpan di Git.
-
Command moderasi tidak boleh bisa digunakan semua member.
-
Bot harus tetap responsif meskipun banyak pesan masuk saat event.
-
Fitur harus bisa ditambah bertahap.
Approach
Tim memilih Python dengan discord.py karena sintaksnya mudah dipahami dan banyak contoh pembelajaran yang membahas event, command, input validation, serta integrasi API. Untuk tahap pertama, bot dibuat dalam satu file agar cepat diuji. Setelah command bertambah, fitur dipindahkan ke cogs.
Pendekatan MVP:
Fitur | Prioritas | Alasan |
|---|---|---|
| Tinggi | Verifikasi interaksi dasar |
| Tinggi | Menjawab pertanyaan umum |
Welcome message | Sedang | Membantu onboarding |
| Sedang | Membantu moderator saat spam |
Keyword responder | Rendah | Menambah interaksi komunitas |
Slash command | Lanjutan | Untuk pengalaman user lebih modern |
Implementation
-
Membuat aplikasi bot di Discord Developer Portal.
-
Mengaktifkan
Message Content IntentdanServer Members Intent. -
Mengundang bot dengan permission minimum.
-
Menyiapkan environment Python dan dependency.
-
Menyimpan token di
.env. -
Mengimplementasikan command dan event.
-
Menambahkan validasi permission untuk command moderasi.
-
Menguji command di server staging sebelum masuk server utama.
Contoh command informasi komunitas:
@bot.command(name="jadwal")
async def jadwal(ctx):
await ctx.send(
"Jadwal mentoring minggu ini:\n"
"- Selasa 19.30: Dasar Python\n"
"- Kamis 19.30: Project Review\n"
"- Sabtu 10.00: Latihan Algoritma"
)
Contoh command aturan:
@bot.command(name="aturan")
async def aturan(ctx):
embed = discord.Embed(
title="Aturan Komunitas",
description="Baca aturan sebelum bertanya agar diskusi tetap nyaman.",
color=discord.Color.orange(),
)
embed.add_field(name="1", value="Gunakan bahasa yang baik dan benar.", inline=False)
embed.add_field(name="2", value="Cari jawaban terlebih dahulu sebelum bertanya.", inline=False)
embed.add_field(name="3", value="Jangan spam atau promosi tanpa izin.", inline=False)
await ctx.send(embed=embed)
Results
Setelah bot digunakan selama satu bulan, hasil yang realistis untuk komunitas kecil-menengah adalah:
Metrik | Sebelum Bot | Setelah Bot | Dampak |
|---|---|---|---|
Pertanyaan berulang per minggu | 40-60 | 15-25 | Turun sekitar 50% |
Waktu respons info dasar | 10-30 menit | Kurang dari 5 detik | Jauh lebih cepat |
Intervensi moderator saat spam ringan | 8-12 kali/minggu | 3-5 kali/minggu | Lebih terkendali |
Member baru yang mendapat pesan onboarding | Tidak konsisten | Hampir otomatis | Onboarding lebih rapi |
Angka ini bergantung pada ukuran server, aktivitas komunitas, dan kelengkapan command. Namun, pola umumnya jelas: bot mengurangi pekerjaan berulang dan membuat informasi lebih mudah diakses.
Key Learnings
-
Mulai dari fitur kecil yang langsung menyelesaikan masalah nyata.
-
Jangan menaruh token di kode sumber.
-
Gunakan intents dengan benar agar event tidak gagal diam-diam.
-
Tambahkan error handling sejak awal.
-
Pisahkan fitur ke cogs saat command mulai banyak.
-
Uji permission di server test sebelum bot digunakan publik.
-
Catat command populer untuk menentukan fitur berikutnya.
Tips Praktis Agar Bot Lebih Profesional
- Gunakan prefix yang jelas dan tidak bentrok, misalnya
!atau?.
Tips: Jika server sudah punya banyak bot, pilih prefix unik seperti
py!agar command tidak bertabrakan.
- Batasi command sensitif dengan permission.
@commands.has_permissions(manage_messages=True)
Peringatan: Jangan hanya mengandalkan nama role di kode jika struktur role server sering berubah.
- Validasi semua input user.
if jumlah < 1 or jumlah > 100:
await ctx.send("Jumlah harus antara 1 sampai 100.")
return
Catatan penting: Input dari user selalu harus dianggap tidak terpercaya sampai divalidasi.
- Simpan konfigurasi di environment variable.
DISCORD_TOKEN=token_anda
COMMAND_PREFIX=!
Tips: Untuk proyek lebih besar, prefix, ID channel, dan ID role sebaiknya juga disimpan sebagai konfigurasi.
- Gunakan logging untuk deployment.
logger.info("Command %s digunakan oleh %s", ctx.command, ctx.author)
Peringatan: Jangan log data sensitif seperti token, pesan privat, atau informasi user yang tidak diperlukan.
- Dokumentasikan command.
Command | Fungsi | Contoh |
|---|---|---|
| Menyapa user |
|
| Menampilkan info bot |
|
| Menjumlahkan angka |
|
| Menghapus pesan |
|
| Menampilkan jadwal |
|
Checklist Pengujian Sebelum Bot Dipakai
-
Pastikan bot bisa online.
-
Pastikan command dasar seperti
!halomerespons. -
Pastikan command dengan argumen menangani input salah.
-
Pastikan permission moderasi hanya bisa dipakai user berwenang.
-
Pastikan
.envtidak masuk Git. -
Pastikan intents aktif di portal dan kode.
-
Pastikan bot tidak membalas dirinya sendiri.
-
Pastikan log tidak menampilkan token.
-
Pastikan bot tetap berjalan setelah terminal ditutup jika dideploy.
-
Pastikan dokumentasi command tersedia untuk moderator.
Perbandingan Akhir: Prefix Command vs Slash Command
Meskipun tutorial ini berfokus pada prefix command karena mudah dipahami untuk pemula, slash command semakin umum dipakai di Discord modern.
Kriteria | Prefix Command | Slash Command |
|---|---|---|
Contoh |
|
|
Setup awal | Lebih sederhana | Sedikit lebih kompleks |
Autocomplete Discord | Tidak otomatis | Didukung |
Validasi input UI | Terbatas | Lebih baik |
Cocok untuk belajar | Sangat cocok | Cocok setelah dasar paham |
Cocok untuk bot publik | Bisa | Lebih direkomendasikan |
Rekomendasi Use Case
-
Gunakan prefix command jika Anda sedang belajar dasar event, command, dan intents.
-
Gunakan slash command jika bot akan dipakai banyak user dan membutuhkan pengalaman yang lebih modern.
-
Gunakan kombinasi keduanya jika Anda sedang migrasi dari bot lama ke bot baru.
-
Gunakan cogs jika command sudah banyak dan perlu dipisahkan berdasarkan kategori.
-
Gunakan deployment cloud atau VPS jika bot harus online 24/7.
Troubleshooting Cepat Berdasarkan Gejala
Gejala | Penyebab Paling Mungkin | Solusi Cepat |
|---|---|---|
Bot offline | Token salah atau script tidak berjalan | Cek |
Bot online tapi diam | Intent belum aktif | Aktifkan |
Command berhenti setelah tambah |
| Tambahkan |
Error import | Library belum terinstal | Jalankan |
Command moderasi gagal | Permission kurang | Cek permission server dan channel |
Welcome message tidak muncul | Members intent belum aktif | Aktifkan |
Bot crash saat token kosong |
| Cek nama file dan variable |
Pesan embed tidak tampil | Permission embed kurang | Aktifkan |
Contoh Pengembangan Lanjutan
Setelah bot dasar berjalan, Anda bisa menambahkan fitur lanjutan secara bertahap.
Fitur Lanjutan | Manfaat | Tingkat Kesulitan |
|---|---|---|
Slash command | UX lebih modern | Sedang |
Database SQLite/PostgreSQL | Menyimpan data user | Sedang |
Role otomatis | Onboarding lebih cepat | Sedang |
Sistem leveling | Meningkatkan engagement | Sedang |
Integrasi API eksternal | Menambah informasi real-time | Sedang-tinggi |
Dashboard web | Konfigurasi lebih mudah | Tinggi |
Docker deployment | Environment konsisten | Sedang |
Contoh integrasi API eksternal sederhana bisa berupa command yang mengambil data dari layanan cuaca, GitHub, atau endpoint internal. Namun, untuk integrasi seperti ini, Anda perlu memahami request HTTP asynchronous, rate limit, dan error handling jaringan.
@bot.command(name="ping")
async def ping(ctx):
latency_ms = round(bot.latency * 1000)
await ctx.send(f"Pong! Latency: {latency_ms} ms")
Expected output:
Pong! Latency: 85 ms
Command ping berguna untuk memeriksa respons bot. Jika latency terlalu tinggi, kemungkinan ada masalah jaringan, hosting, atau beban server.
Praktik Keamanan yang Wajib Diikuti
-
Jangan membagikan token bot.
-
Jangan memberi permission administrator tanpa alasan kuat.
-
Gunakan
.envuntuk konfigurasi rahasia. -
Reset token jika pernah bocor.
-
Batasi command moderasi dengan permission.
-
Validasi input user sebelum diproses.
-
Hindari menyimpan data pribadi user tanpa kebutuhan jelas.
-
Gunakan repository privat jika bot berisi konfigurasi sensitif.
-
Review dependency secara berkala.
-
Monitor log saat bot dideploy.
Peringatan: Bot dengan permission tinggi dapat merusak server jika disalahgunakan. Selalu gunakan permission minimum yang sesuai fungsi bot.
Referensi
Leravio. (2026). Cara membuat bot Discord dengan Python.
Real Python. (2026). How to make a Discord bot in Python.
PyTutorial. (2026). Python Discord API bot development guide.
GeeksforGeeks. (2026). Creating a Discord bot in Python.
Codezup. (2026). Build a Discord bot in Python: Step-by-step coding tutorial.
GitHub. (2026). Templat bot Discord Python Indonesia.
YouTube. (2026). Creating a Discord bot in Python: Setup and basics.
CodeGenes. (2026). Creating a Discord bot with Python: A comprehensive guide.