Discord Botu Nasıl Yapılır? discord.js ile İlk Slash Komut
Developer Portal'da uygulama açmaktan token'ı .env ile gizlemeye, intent seçiminden REST ile komut kaydına kadar discord.js 14.27 ile çalışan ilk slash komutunuzu yazın.

Bu yazıda
Kısaca
Discord botu yapmak için Developer Portal'da bir uygulama açar, bot token'ını .env dosyasında gizli tutar, botu bot ve applications.commands kapsamıyla sunucuya eklersiniz. Ardından Node.js ve discord.js kurup bir komut tanımı yazar, onu REST ile kaydeder ve interactionCreate olayında yanıtlarsınız. Bu rehberdeki kod 9 Ekim 2026 itibarıyla en güncel sürüm olan discord.js 14.27.0 ile uyumludur.
Bu yazı, hiç bot yazmamış biri için tek bir çalışan komutla biten bir başlangıç rehberidir. Sonunda sunucunuzda yazdığınızda yalnız size görünen bir "Pong!" yanıtı veren ping komutu olacak. Rehber resmî discord.js rehberini ve Discord geliştirici belgelerini izler. VeyroBot da discord.js ile yazılmış bir bottur; burada anlatılan yapı taşları büyük botların da temelidir.
İhtiyacınız olanlar ve sürümler
- Node.js: discord.js 14 en az Node.js 18 ister. Ancak Node.js 18 artık destek dışıdır. Node.js sürüm sayfasına göre 9 Ekim 2026 itibarıyla LTS sürümler 24 ve 22'dir. Yeni bir proje için 24 LTS mantıklı bir seçimdir.
- discord.js: 9 Ekim 2026 itibarıyla en son sürüm 14.27.0'dır.
- Bir test sunucusu: Yönetici olduğunuz, denemeler için açtığınız boş bir sunucu en rahatıdır.
- Bir kod düzenleyici ve terminal.
Kurulumu doğrulamak için terminalde sürümü yazdırın:
node --versionDeveloper Portal'da uygulama ve bot oluşturma
- Developer Portal'da Create App düğmesine basın, bir ad girin ve oluşturun.
- General Information sayfasındaki Application ID değerini kopyalayın. Bu, kodda CLIENT_ID olarak kullanılacak.
- Sol menüden Bot sayfasına geçin. Token bölümünde Reset Token ile yeni bir token üretin ve hemen güvenli bir yere kaydedin. Discord'un belgesine göre token yeniden üretmedikçe bir daha gösterilmez.
- Aynı sayfada ayrıcalıklı intent anahtarları (Presence, Server Members, Message Content) durur. Bu rehberdeki komut için hiçbirini açmanız gerekmez.
Token'ı gizli tutmak
Token, botunuzun şifresidir. Discord belgesi token'ın "son derece hassas" olduğunu, asla paylaşılmaması ve sürüm kontrolüne eklenmemesi gerektiğini açıkça yazar. Token'ı ele geçiren biri botunuz adına, botun sahip olduğu tüm izinlerle işlem yapabilir.
Bunun için token'ı koda yazmayın; proje klasöründe bir .env dosyasına koyun:
DISCORD_TOKEN=buraya-token
CLIENT_ID=buraya-application-id
GUILD_ID=buraya-test-sunucusu-idGit kullanıyorsanız .gitignore dosyasına .env satırını ekleyin. Token yanlışlıkla bir yere sızarsa Bot sayfasından yeniden üretin; eski token geçersiz olur.
Sunucu kimliğini (GUILD_ID) almak için Discord'da Kullanıcı Ayarları > Gelişmiş altından Geliştirici Modu'nu açın, sonra sunucu simgesine sağ tıklayıp sunucu kimliğini kopyalayın. Adımlar Discord'un kimlik bulma makalesinde anlatılır.
Botu sunucuya davet etmek
Developer Portal'da Installation sayfasına gidin. Guild Install için varsayılan kurulum ayarlarına bot ve applications.commands kapsamlarını ekleyin. bot seçilince botun izinleri için bir liste açılır. Oluşan bağlantıyı tarayıcıda açıp test sunucunuzu seçin.
Discord'un OAuth2 belgesine göre applications.commands kapsamı bot kapsamına zaten dahildir. İkisini birlikte seçmek zarar vermez ve niyeti açık eder.
İzinlerde en az izin ilkesini uygulayın: bot yalnız işinin gerektirdiği izni almalı. Eğik çizgi komutuna yanıt vermek için ek bir sunucu izni gerekmez. Yönetici izni vermek bir kolaylık gibi görünse de token sızarsa tüm sunucuyu açık eder. Ayrıntı için Discord bot izinleri: Yönetici vermeli miyim? yazısına bakabilirsiniz.
Projeyi kurmak
Boş bir klasör açın ve içinde şu komutları çalıştırın:
npm init -y
npm install discord.jsBu rehber ek bir paket kullanmaz. .env dosyasını Node.js'in yerleşik --env-file seçeneğiyle yükleyeceğiz. Node.js belgesine göre bu seçenek 20.6.0 sürümünde geldi; 24.10.0 ve 22.21.0 sürümlerinden beri deneysel değildir.
Intent'ler: yalnız gerekeni isteyin
Intent'ler, botun ağ geçidinden hangi olayları alacağını belirler. Az intent istemek hem gereksiz veri akışını keser hem de onay süreçlerinden kurtarır. Ping komutu için Guilds intent'i yeterlidir; discord.js sunucu ve kanal bilgisini bununla önbelleğe alır.
Gateway belgesine göre ayrıcalıklı intent'ler şu an üç tanedir: GUILD_PRESENCES, GUILD_MEMBERS ve MESSAGE_CONTENT. Bunları kodda istemeden önce Developer Portal'da açmanız gerekir. Doğrulama gerektiren botların, yani 100 ve üzeri sunucudaki botların bu intent'ler için ayrıca onay alması gerekir. Eğik çizgi komutları mesaj içeriğine ihtiyaç duymaz; bu yüzden çoğu yeni bot Message Content intent'i olmadan çalışabilir.
Portal'da açmadığınız ayrıcalıklı bir intent'i kodda isterseniz bot giriş yapamaz. Bu hatanın çözümü Discord.js v14 "Used Disallowed Intents" hatası yazısında anlatılıyor.
Ping komutunu tanımlamak ve kaydetmek
Discord'a komutun adını ve açıklamasını önceden bildirmeniz gerekir. Bu kayıt botun çalışmasından ayrı, tek seferlik bir işlemdir. Klasöre deploy-commands.js adlı bir dosya açın:
const { REST, Routes, SlashCommandBuilder } = require('discord.js');
const commands = [
new SlashCommandBuilder()
.setName('ping')
.setDescription('Botun yanıt verip vermediğini sınar'),
].map((komut) => komut.toJSON());
const rest = new REST().setToken(process.env.DISCORD_TOKEN);
(async () => {
try {
const kayitli = await rest.put(
Routes.applicationGuildCommands(process.env.CLIENT_ID, process.env.GUILD_ID),
{ body: commands },
);
console.log(`${kayitli.length} komut kaydedildi.`);
} catch (hata) {
console.error(hata);
}
})();Çalıştırın:
node --env-file=.env deploy-commands.jsrest.put gönderdiğiniz listeyle o sunucudaki komutların tamamını değiştirir. Listeden çıkardığınız bir komut bir sonraki kayıtta silinir.
Sunucuya özel komut mu, genel komut mu?
| Tür | Rota | Nerede görünür |
|---|---|---|
| Sunucuya özel | Routes.applicationGuildCommands(clientId, guildId) | Yalnız belirttiğiniz sunucuda |
| Genel | Routes.applicationCommands(clientId) | Uygulamanın eklendiği tüm sunucularda ve varsayılan olarak DM'lerde |
discord.js rehberi geliştirme sırasında sunucuya özel kaydı önerir; komut hazır olunca genel kayda geçilir. Discord'un komut belgesi sunucu başına günde 200 komut oluşturma sınırı olduğunu yazar. Bu yüzden kayıt betiğini botun her açılışında değil, yalnız komut tanımı değiştiğinde çalıştırın. Aynı belgeye göre bir uygulamanın en çok 100 genel eğik çizgi komutu olabilir.
Botu çalıştırmak ve komuta yanıt vermek
Şimdi botun kendisini yazın. Klasöre index.js dosyasını ekleyin:
const { Client, Events, GatewayIntentBits, MessageFlags } = require('discord.js');
const client = new Client({ intents: [GatewayIntentBits.Guilds] });
client.once(Events.ClientReady, (hazir) => {
console.log(`Giriş yapıldı: ${hazir.user.tag}`);
});
client.on(Events.InteractionCreate, async (interaction) => {
if (interaction.isChatInputCommand() && interaction.commandName === 'ping') {
await interaction.reply({
content: `Pong! Ağ geçidi gecikmesi: ${client.ws.ping} ms`,
flags: MessageFlags.Ephemeral,
});
}
});
client.login(process.env.DISCORD_TOKEN);node --env-file=.env index.jsTerminalde "Giriş yapıldı" satırını görünce test sunucunuzda ping komutunu yazın. Yanıt yalnız size görünür.
Koddaki üç ayrıntı güncel discord.js sürümüyle ilgilidir:
- Gizli yanıt: Yalnız komutu yazanın göreceği yanıt için
flags: MessageFlags.Ephemeralkullanılır. Eskiephemeral: trueseçeneği kullanım dışıdır ve discord.js 14.27.0 bunun için uyarı yazdırır. - Hazır olayı:
Events.ClientReadydeğericlientReadyolayına karşılık gelir. Eskireadyadı hâlâ çalışır ama kütüphane bu adın 15. sürümde kalkacağını bildiren bir uyarı verir. - Yanıtı geri almak: Gönderdiğiniz yanıt mesajına ihtiyacınız olursa kullanım dışı
fetchReply: trueyerinewithResponse: trueseçeneğini ya dainteraction.fetchReply()metodunu kullanın.
Etkileşim belgesine göre ilk yanıtı 3 saniye içinde vermeniz gerekir. İşiniz daha uzun sürecekse önce interaction.deferReply() ile bekleme sinyali gönderin. Etkileşim belirteci 15 dakika geçerlidir; bu sürede ek mesajlar gönderebilirsiniz.
Komut görünmüyor ya da hata veriyorsa
Komut listede hiç yok
Kayıt betiğinin "1 komut kaydedildi" yazdığını kontrol edin. GUILD_ID değerinin botun eklendiği sunucuya ait olduğundan emin olun. Bot applications.commands kapsamı olmadan eklendiyse komut kaydı reddedilir; botu kurulum bağlantısıyla yeniden ekleyin.
"Uygulama yanıt vermedi" uyarısı
Bu, Discord'un 3 saniye içinde yanıt alamadığı anlamına gelir. Botun açık olduğunu, terminalde hata olmadığını ve commandName karşılaştırmasının kayıttaki adla birebir aynı olduğunu kontrol edin.
Bot giriş yapmıyor
"An invalid token was provided." hatası token'ın yanlış ya da sıfırlanmış olduğunu gösterir. .env dosyasında token'ın tırnaksız ve boşluksuz yazıldığını kontrol edin. "Used disallowed intents" hatası alıyorsanız istediğiniz bir ayrıcalıklı intent Portal'da kapalıdır.
Komut çalışıyor ama başka bir işlem izin hatası veriyor
Rol verme ya da mesaj silme gibi işlemlerde botun hem izni hem de rol sırası önemlidir. Bu durumlar Discord bot izin hataları yazısında ele alınıyor.
Sonraki adımlar
Tek dosyada çalışan bir bot, komut sayısı arttıkça okunması zor hâle gelir. discord.js rehberi komutları ayrı dosyalara bölmeyi ve bir komut işleyicisiyle yüklemeyi anlatır. Seçenekli komutlar, düğmeler ve hata yönetimi de rehberin sonraki bölümlerindedir. Botu herkese açmadan önce token'ın hiçbir yerde açıkta olmadığını ve botun yalnız gereken izinleri istediğini bir kez daha kontrol edin.
Son güncelleme: 9 Ekim 2026. Kaynaklar: discordjs.guide, docs.discord.com (Getting Started, Application Commands, Receiving and Responding, OAuth2, Gateway), nodejs.org sürüm sayfası ve CLI belgesi, discord.js GitHub sürüm sayfası. Kullanım dışı seçeneklerle ilgili bilgiler discord.js 14.27.0 kaynak kodundaki uyarılardan doğrulandı.