Discord Bot Yapma: discord.js ve Python ile Adım Adım Rehber
Kısa cevap
Discord botu yapmak için Discord Developer Portal'da bir uygulama oluşturur, Bot sayfasından token alır ve bot ile applications.commands kapsamlarını içeren bir davet linkiyle botu sunucuna eklersin. Ardından JavaScript için discord.js v14'ü ya da Python için discord.py 2.x'i kurar, token'ı ortam değişkeninden okuyan kısa bir kodla botu bağlarsın. Yeni botlar için prefix komutları yerine slash komutları önerilir; Message Content intent'ine ancak mesaj içeriğini okuman gerekiyorsa ihtiyaç duyarsın.
Discord botu yapmak için neye ihtiyacın var?
Bir Discord hesabına, yönetici yetkin olan bir test sunucusuna ve bir programlama diline ihtiyacın var. En yaygın iki seçenek JavaScript için discord.js ve Python için discord.py kütüphaneleridir. Bu rehber yazılırken discord.js'in güncel ana sürümü v14, discord.py'ninki ise 2.x serisidir. İkisi de Discord API'sinin tamamını kapsar; hangi dili daha rahat yazıyorsan onu seç.
discord.js için Node.js'in güncel bir LTS sürümünü, discord.py için ise güncel bir Python 3 sürümünü kur. Kod yazmak için Visual Studio Code gibi bir editör yeterli. Botu geliştirirken kendi bilgisayarında çalıştırabilirsin; sürekli açık kalmasını istediğinde bir sunucuya taşırsın, bu kısmı rehberin sonunda kısaca ele alıyoruz.
- Discord hesabı ve Manage Server yetkin olan bir test sunucusu
- discord.js için Node.js (güncel LTS) ve npm
- discord.py için Python 3 ve pip
- Bir kod editörü ve terminal
- Kodunu saklamak için Git (token'ı asla eklemeden)
Discord Developer Portal'da bot nasıl oluşturulur?
discord.com/developers/applications adresine giriş yap ve New Application ile bir uygulama oluştur. Uygulama, botunun Discord tarafındaki kimliğidir: adı, simgesi ve açıklaması burada belirlenir. General Information sayfasındaki Application ID değerini bir kenara not et; komutları kaydederken bu kimliğe ihtiyacın olacak.
Sol menüden Bot sayfasına geç. Burada botun kullanıcı adını ve avatarını ayarlayabilir, Reset Token düğmesiyle bot token'ını oluşturabilirsin. Token yalnızca bir kez gösterilir; kopyala ve güvenli bir yere kaydet. Botunu başkalarının da davet etmesini istemiyorsan aynı sayfadaki Public Bot seçeneğini kapat, böylece davet linkini sadece sen kullanabilirsin.
Token, botunun şifresidir. Token'ı ele geçiren biri botunla, bulunduğu tüm sunucularda istediğini yapabilir. Bu yüzden token'ı kod dosyasına yazma, ekran görüntüsüyle paylaşma ve destek isterken mesajlara yapıştırma. Yanlışlıkla sızdırırsan hemen Reset Token ile yenisini oluştur; eski token o anda geçersiz olur.
Privileged gateway intent'ler nedir ve hangisini açmalısın?
Intent'ler, botunun Discord'dan hangi olayları almak istediğini söyler. Çoğu intent serbesttir, ama üçü privileged olarak işaretlidir ve Bot sayfasından ayrıca açılması gerekir: Presence, Server Members ve Message Content. Kodda istediğin bir privileged intent portalda kapalıysa bot bağlanırken hata verir.
Sadece gerçekten kullandığın intent'leri aç. Yalnızca slash komutlarıyla çalışan bir bot için hiçbir privileged intent gerekmez. Bot 100'den fazla sunucuya ulaştığında Discord doğrulaması gerekir ve privileged intent'ler için neden ihtiyaç duyduğunu açıklayan bir başvuru yaparsın; baştan az intent'le tasarlanan bir bot bu süreçten çok daha kolay geçer. Intent'lerin barındırma ve performans tarafına etkisini Discord botunu 7/24 açık tutma rehberimizde ayrıca anlattık.
| Privileged intent | Neyi açar | Ne zaman gerekir |
|---|---|---|
| Message Content | Mesajların metnini, eklerini ve embed'lerini okumayı | Prefix komutları, mesaj filtreleme, otomatik moderasyon |
| Server Members | Üye katılma ve ayrılma olaylarını, tam üye listesini | Hoş geldin mesajı, otomatik rol verme |
| Presence | Üyelerin çevrimiçi durumunu ve aktivitesini | Durum takibi yapan botlar; çoğu bot için gereksiz |
Bot sunucuya davet linkiyle nasıl eklenir?
Botu sunucuya eklemek için bir OAuth2 davet linki oluşturursun. Developer Portal'daki OAuth2 sayfasının URL Generator bölümünde kapsam (scope) olarak bot ve applications.commands seçeneklerini işaretle. bot kapsamı botu sunucuya bir üye olarak ekler, applications.commands ise slash komutlarını kaydetmesine izin verir. Portaldaki Installation sayfası da aynı amaçla hazır bir kurulum linki sunar.
bot kapsamını seçtiğinde altta bir izin listesi açılır. Burada botunun ihtiyaç duyduğu izinleri tek tek seç: mesaj gönderen bir bot için View Channels, Send Messages ve Embed Links çoğu zaman yeter. Administrator izni vermek kolay görünür ama token sızarsa saldırgana sunucunun tamamını teslim eder. Oluşan linki tarayıcıda açıp test sunucunu seçtiğinde bot üye listesinde çevrimdışı olarak görünür; kodu çalıştırdığında çevrimiçi olur.
- Kapsamlar: bot ve applications.commands
- Temel izinler: View Channels, Send Messages, Embed Links
- Moderasyon botları için gerekirse Manage Messages, Kick Members, Ban Members
- Administrator iznini yalnızca gerçekten gerekiyorsa ver
- Link formatı: discord.com/oauth2/authorize?client_id=UYGULAMA_ID&scope=bot+applications.commands&permissions=IZIN_SAYISI
discord.js v14 ile basit bir bot nasıl yazılır?
Boş bir klasörde npm init -y ve ardından npm install discord.js komutlarını çalıştır. Aşağıdaki kod, sadece Guilds intent'iyle bağlanan ve /ping komutuna Pong! diye cevap veren en küçük çalışan bottur. Token'ı koddan değil, DISCORD_TOKEN adlı ortam değişkeninden okur. Kodu index.js olarak kaydet.
Slash komutlarının çalışması için önce Discord'a kaydedilmeleri gerekir. Bunun için ayrı küçük bir betik yazmak yaygın bir yöntemdir: SlashCommandBuilder ile komutu tanımlar, REST istemcisiyle Routes.applicationGuildCommands(uygulamaId, sunucuId) adresine gönderirsin. Sunucuya özel komutlar anında görünür, bu yüzden geliştirme sırasında bunları kullan; bot hazır olduğunda Routes.applicationCommands(uygulamaId) ile genel komut olarak kaydedersin. Botu node --env-file=.env index.js komutuyla başlatabilirsin.
- const { Client, Events, GatewayIntentBits } = require('discord.js');
- const client = new Client({ intents: [GatewayIntentBits.Guilds] });
- client.once(Events.ClientReady, (c) => console.log(`${c.user.tag} hazır`));
- client.on(Events.InteractionCreate, async (i) => { if (i.isChatInputCommand() && i.commandName === 'ping') await i.reply('Pong!'); });
- client.login(process.env.DISCORD_TOKEN);
discord.py 2.x ile basit bir bot nasıl yazılır?
Bir sanal ortam oluştur (python -m venv .venv), etkinleştir ve pip install -U discord.py komutuyla kütüphaneyi kur. discord.py'de slash komutları app_commands modülüyle tanımlanır ve bir CommandTree üzerinde toplanır. Aşağıdaki örnek, discord.js örneğiyle aynı işi yapar: varsayılan intent'lerle bağlanır, /ping komutuna cevap verir ve token'ı ortam değişkeninden okur.
Komut ağacını Discord'a göndermek için tree.sync() çağrılır. Örnekte basitlik için bu çağrı on_ready içinde, test sunucusuna özel olarak yapılıyor; gerçek bir projede senkronizasyonu her açılışta değil, komutlar değiştiğinde çalıştırman önerilir, çünkü bu uç nokta sıkı hız sınırlarına tabidir. Kodu bot.py olarak kaydedip python bot.py ile başlat.
- import os, discord; from discord import app_commands
- SUNUCU = discord.Object(id=123456789012345678) # test sunucunun ID'si
- client = discord.Client(intents=discord.Intents.default()); tree = app_commands.CommandTree(client)
- @tree.command(name='ping', description='Botun cevap verip vermediğini test eder', guild=SUNUCU)
- async def ping(interaction: discord.Interaction): await interaction.response.send_message('Pong!')
- @client.event, bir alt satırda: async def on_ready(): await tree.sync(guild=SUNUCU)
- client.run(os.environ['DISCORD_TOKEN'])
Slash komutu mu prefix komutu mu kullanmalısın?
Slash komutları Discord'un yerleşik komut sistemidir: kullanıcı / yazdığında botunun komutları açıklamalarıyla birlikte listelenir, parametreler türüne göre (kullanıcı, kanal, sayı, seçenek listesi) doğrulanır ve yetkiler sunucu ayarlarından komut bazında yönetilebilir. En önemlisi Message Content intent'i gerektirmez. Yeni bir bot yazıyorsan varsayılan tercih slash komutları olmalı.
Prefix komutları (!yardim gibi) botun her mesajı okuyup başındaki karakteri kontrol etmesine dayanır ve bu yüzden Message Content intent'i ister. Eski botlarda ve hızlı yazılan yönetici komutlarında hâlâ kullanılır; discord.py'nin commands uzantısı (discord.ext.commands) ikisini birlikte destekleyen hybrid komutlar da sunar. Slash komutlarında bir kural var: etkileşime 3 saniye içinde cevap vermelisin. Uzun süren işlemlerde önce deferReply (discord.py'de interaction.response.defer) ile cevabı ertele, sonra sonucu gönder.
| Özellik | Slash komutu | Prefix komutu |
|---|---|---|
| Message Content intent | Gerekmez | Gerekir |
| Komutların keşfi | / yazınca listelenir | Kullanıcı ezberlemek zorunda |
| Parametre doğrulama | Discord tarafında, türe göre | Kodda elle yapılır |
| Yetki yönetimi | Sunucu ayarlarından komut bazında | Kodda elle yapılır |
| Cevap süresi | 3 saniye içinde cevap veya erteleme | Sınır yok |
Bot token'ı nasıl güvenli saklanır?
Token'ı her zaman ortam değişkeninde tut. Pratikte bu, proje klasöründe DISCORD_TOKEN=... satırını içeren bir .env dosyası oluşturmak ve bu dosyayı .gitignore'a eklemek demektir. Node.js'in yeni sürümleri --env-file parametresiyle .env dosyasını kendisi okur; Python'da python-dotenv paketi aynı işi görür. Sunucuda çalıştırırken değişkeni panelin ortam değişkenleri bölümünden ya da süreç yöneticisinin ayarından verirsin.
GitHub'a yüklenen token'lar tarayan botlar tarafından dakikalar içinde bulunur ve bot ele geçirilerek spam ya da toplu üye atma için kullanılır. Discord herkese açık depolarda bulunan token'ları otomatik olarak sıfırlayabilir, ama buna güvenme. Depoyu ilk kez göndermeden önce git status ile .env dosyasının listede olmadığını kontrol et; geçmiş bir commit'e token girdiyse dosyayı silmek yetmez, token'ı mutlaka portalda yenile.
Discord API hız sınırları nasıl çalışır?
Discord, botların API'ye ne sıklıkla istek atabileceğini sınırlar. Her uç noktanın (mesaj gönderme, rol verme, kanal düzenleme gibi) kendi sınırı vardır ve bunun yanında bot başına saniyede 50 istekli genel bir sınır bulunur. Sınırı aşan istek 429 kodu ve ne kadar beklenmesi gerektiğini söyleyen bir cevap alır. discord.js ve discord.py bu bekleme sürelerini kendileri yönetir, yani normal kullanımda elle bir şey yapman gerekmez.
Sorun genellikle döngü içinde yüzlerce mesaj göndermek, her üyeye tek tek rol vermek ya da hata alan bir isteği bekleme yapmadan tekrar tekrar denemek gibi tasarım hatalarından çıkar. Kısa sürede çok sayıda geçersiz istek (401, 403, 429) gönderen IP adresleri Discord tarafından geçici olarak engellenir. Toplu işlemleri yavaşlat, mümkün olduğunda tek mesajda birleştir ve izin hatalarında aynı isteği tekrarlama.
Bot 7/24 nasıl açık tutulur?
Botun yalnızca onu çalıştıran süreç açık olduğu sürece çevrimiçidir; bilgisayarını kapattığında bot da düşer. Kalıcı çalışma için kodu sürekli açık bir sunucuya taşır ve bir süreç yöneticisiyle çökme sonrası otomatik yeniden başlatma sağlarsın. Bu konuyu, ücretsiz platformların sınırlarını ve pm2 ile systemd kurulumunu Discord botunu 7/24 aktif tutma rehberimizde ayrıntılı anlattık.
Kısaca iki yol var: Node.js veya Python ortamı hazır gelen bir bot hosting paketi ya da her şeyi kendin kurduğun bir VPS. TheCrewHost'un Discord bot hosting paketlerinde dosyalarını panelden yükleyip başlat düğmesiyle çalıştırabilirsin; birden fazla botun ya da veritabanının varsa VPS daha esnek olur. İstanbul lokasyonu Discord bağlantısının kendisinde büyük fark yaratmaz, ama botunun Türkiye'deki kullanıcılara sunduğu bir web paneli veya API varsa gecikmeyi düşürür.
İlk Discord botunu 8 adımda çalıştır
- 1
Uygulamayı oluştur
Discord Developer Portal'da New Application ile bir uygulama aç ve Application ID'yi not et.
- 2
Token'ı al
Bot sayfasında Reset Token ile token oluştur, kopyala ve proje klasöründeki .env dosyasına DISCORD_TOKEN olarak kaydet.
- 3
Intent'leri ayarla
Sadece slash komutu kullanacaksan privileged intent'leri kapalı bırak; prefix komutu veya üye olayları gerekiyorsa ilgili anahtarı aç.
- 4
Botu davet et
OAuth2 URL Generator'da bot ve applications.commands kapsamlarını ve gereken izinleri seç, linkle botu test sunucuna ekle.
- 5
Kütüphaneyi kur
JavaScript için npm install discord.js, Python için sanal ortamda pip install -U discord.py çalıştır.
- 6
Kodu yaz
Token'ı ortam değişkeninden okuyan ve /ping komutuna cevap veren en küçük botu yaz, .env dosyasını .gitignore'a ekle.
- 7
Komutları kaydet ve başlat
Slash komutlarını test sunucusuna kaydet, botu başlat ve sunucuda /ping yazarak cevabı kontrol et.
- 8
Sunucuya taşı
Bot hazır olduğunda bot hosting paketine ya da bir VPS'e yükle ve bir süreç yöneticisiyle 7/24 çalıştır.
Sık Sorulan Sorular
Discord botu yapmak için hangi dil daha iyi?
İkisi de aynı işi görür, seçim daha çok alışkanlığa bağlı. discord.js geniş bir topluluğa ve detaylı bir rehbere sahip, web geliştirme biliyorsan doğal gelir. discord.py okunabilir sözdizimiyle programlamaya yeni başlayanlar için daha kolaydır ve veri işleme kütüphaneleriyle iyi anlaşır. Bildiğin bir dil varsa onunla başla; kavramlar iki kütüphanede de neredeyse aynıdır.
Botum sunucuda görünüyor ama çevrimdışı, neden?
Davet linki botu üye olarak ekler, ama çevrimiçi olması için kodunun çalışıyor ve Discord'a bağlı olması gerekir. Terminalde hata var mı bak: geçersiz token, portalda kapalı olan bir privileged intent'i kodda istemek ya da internet bağlantısı en sık nedenlerdir. Token'ı yeniden oluşturduysan .env dosyasındaki değeri de güncellemeyi unutma.
Slash komutlarım neden görünmüyor?
Komutların Discord'a kaydedilmiş olması ve botun applications.commands kapsamıyla davet edilmiş olması gerekir. Sunucuya özel kaydedilen komutlar hemen görünür; genel komutların yayılması biraz zaman alabilir. Hâlâ yoksa Discord istemcisini Ctrl+R ile yenile ve kayıt betiğinin hata vermeden çalıştığını kontrol et. Kanal izinlerinde Use Application Commands izninin kapalı olmadığından da emin ol.
Discord botu yapmak ücretli mi?
Hayır. Developer Portal'da uygulama açmak, bot oluşturmak, discord.js ve discord.py kullanmak tamamen ücretsizdir. Para gerektiren tek kısım, botun 7/24 açık kalması için gereken sunucudur. Geliştirme sırasında botu kendi bilgisayarında çalıştırabilir, hazır olduğunda küçük bir bot hosting paketine ya da VPS'e taşıyabilirsin. Küçük bir bot çok az kaynak kullanır.
Botum Message Content intent'i olmadan mesajları okuyabilir mi?
Kısmen. Intent kapalıyken bot yine mesaj olaylarını alır, ama içerik, ekler ve embed'ler boş gelir. Bunun istisnaları var: botu doğrudan etiketleyen mesajların, bota gönderilen özel mesajların ve botun kendi mesajlarının içeriği görünür. Bu yüzden çoğu bot, slash komutlarına geçerek bu intent'e hiç ihtiyaç duymadan çalışabilir.
Bir botu birden fazla sunucuda kullanabilir miyim?
Evet, aynı bot davet linkiyle istediğin kadar sunucuya eklenebilir ve tek bir süreç hepsine hizmet verir. Kodda sunucuya özel ayarları (kanal kimlikleri, prefix, roller) sunucu kimliğine göre bir veritabanında tutman gerekir. Bot 100 sunucuya yaklaştığında Discord doğrulaması gerekir; çok daha büyük ölçeklerde ise sharding devreye girer.
Token'ım sızdı, ne yapmalıyım?
Hemen Developer Portal'daki Bot sayfasından Reset Token ile yeni token oluştur; eski token anında geçersiz olur ve saldırganın erişimi kesilir. Ardından yeni token'ı sunucundaki ortam değişkenine gir ve botu yeniden başlat. Sunucu denetim kaydına bakarak botun yaptığı istenmeyen işlemleri kontrol et ve token'ın nasıl sızdığını bulup o açığı kapat.
